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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
module builtin
pub struct string {
pub:
str &byte
len int
}
pub fn strlen(s &byte) int {
mut i := 0
for ; s[i] != 0; i++ {}
return i
}
pub fn tos(s &byte, len int) string {
if s == 0 {
panic('tos(): nil string')
}
return string{
str: s
len: len
}
}
fn (s string) add(a string) string {
new_len := a.len + s.len
mut res := string{
len: new_len
str: malloc(new_len + 1)
}
for j in 0 .. s.len {
res[j] = s[j]
}
for j in 0 .. a.len {
res[s.len + j] = a[j]
}
res[new_len] = 0 // V strings are not null terminated, but just in case
return res
}
/*
pub fn tos_clone(s byteptr) string {
if s == 0 {
panic('tos: nil string')
}
return tos2(s).clone()
}
*/
// Same as `tos`, but calculates the length. Called by `string(bytes)` casts.
// Used only internally.
pub fn tos2(s &byte) string {
if s == 0 {
panic('tos2: nil string')
}
return string{
str: s
len: strlen(s)
}
}
pub fn tos3(s &char) string {
if s == 0 {
panic('tos3: nil string')
}
return string{
str: &byte(s)
len: strlen(&byte(s))
}
}
pub fn string_eq(s1 string, s2 string) bool {
if s1.len != s2.len {
return false
}
for i in 0 .. s1.len {
if s1[i] != s2[i] {
return false
}
}
return true
}
pub fn string_ne(s1 string, s2 string) bool {
return !string_eq(s1, s2)
}
pub fn i64_tos(buf &byte, len int, n0 i64, base int) string {
if base < 2 {
panic('base must be >= 2')
}
if base > 36 {
panic('base must be <= 36')
}
mut b := tos(buf, len)
mut i := len - 1
mut n := n0
neg := n < 0
if neg {
n = -n
}
b[i--] = 0
for {
c := (n % base) + 48
b[i--] = if c > 57 { c + 7 } else { c }
if i < 0 {
panic('buffer to small')
}
n /= base
if n < 1 {
break
}
}
if neg {
if i < 0 {
panic('buffer to small')
}
b[i--] = 45
}
offset := i + 1
b.str = b.str + offset
b.len -= (offset + 1)
return b
}
pub fn i64_str(n0 i64, base int) string {
buf := malloc(80)
return i64_tos(buf, 79, n0, base)
}
pub fn ptr_str(ptr voidptr) string {
buf := [16]byte{}
hex := i64_tos(buf, 15, i64(ptr), 16)
res := '0x' + hex
return res
}
pub fn (a string) clone() string {
mut b := string{
len: a.len
str: malloc(a.len + 1)
}
mem_copy(b.str, a.str, a.len)
b[a.len] = 0
return b
}
|