-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstrings.kai
78 lines (60 loc) · 1.33 KB
/
strings.kai
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
78
#import kai("posix")
#import kai("arrays")
Equal :: fn(a, b: string) -> bool {
if a.len != b.len return false
for _, i in a {
if a[i] != b[i] return false
}
return true
}
NulTerminate :: fn(s: *string) -> void {
arrays.Append(s, 0)
s.len += 1
}
FromCString :: fn(p: *u8) -> string {
if p == nil return ""
len := posix.strlen(p)
s := []u8{}
arrays.Reserve(&s, len + 1)
s.raw = p
s.len = len
s.cap = len
return bitcast(string) s
}
FromCStringCopy :: fn(p: *u8) -> string {
if p == nil return ""
len := posix.strlen(p)
s := []u8{}
arrays.Reserve(&s, len + 1)
s.raw = posix.memcpy(s.raw, p, len + 1)
s.len = len
s.cap = len
return s
}
#test "Equal" {
assert(Equal("", ""))
assert(Equal("Kai", "Kai"))
assert(!Equal("1", "42"))
assert(!Equal("Kai", "Swift"))
}
#test "NulTerminate" {
str := "0"
arrays.Append(&str, "1")
str.raw[2] = 0xff
NulTerminate(&str)
assert(str.raw[2] == 0)
}
#test "FromCString" {
cstring := "asdf".raw
str := FromCString(cstring)
assert(str.raw == cstring)
assert(str.len == 4)
assert(str.cap == 4)
}
#test "FromCStringCopy" {
cstring := "asdf".raw
str := FromCStringCopy(cstring)
assert(str.raw != cstring)
assert(str.len == 4)
assert(str.cap == 4)
}