-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstrings.mml
77 lines (67 loc) · 1.05 KB
/
strings.mml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
fn firstOr(v, l) len(l) > 0 ? l[0] : v
export fn (
join(j, s) len(s) < 2 ? firstOr("", s) : s[0] + j + join(j, s[1:])
joins(j, ...s) join(j, s)
joinTwo(j, left, right) joins(j, left, right)
formats(f, ...a) format(f, a)
formatOne(f, a) formats(f, a) // TODO: drop
)
export fn escape(s) {
if s == "" {
return ""
}
let ~ first s[0]
switch first {
case "\b":
first = "\\b"
case "\f":
first = "\\f"
case "\n":
first = "\\n"
case "\r":
first = "\\r"
case "\t":
first = "\\t"
case "\v":
first = "\\v"
case "\"":
first = "\\\""
case "\\":
first = "\\\\"
}
return first + escape(s[1:])
}
export fn unescape(s) {
let (
~ esc false
~ r []
)
for i in 0:len(s) {
let c s[i]
if esc {
switch c {
case "b":
c = "\b"
case "f":
c = "\f"
case "n":
c = "\n"
case "r":
c = "\r"
case "t":
c = "\t"
case "v":
c = "\v"
}
r = [r..., c]
esc = false
continue
}
if c == "\\" {
esc = true
continue
}
r = [r..., c]
}
return join("", r)
}