-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuilder.js.v
More file actions
166 lines (142 loc) · 3.34 KB
/
Copy pathbuilder.js.v
File metadata and controls
166 lines (142 loc) · 3.34 KB
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
// Copyright (c) 2019-2024 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module strings
/*
pub struct Builder {
mut:
buf []u8
pub mut:
len int
initial_size int = 1
}*/
pub type Builder = []u8
pub fn new_builder(initial_size int) Builder {
return []u8{cap: initial_size}
}
pub fn (mut b Builder) write_byte(data u8) {
b << data
}
pub fn (mut b Builder) write_u8(data u8) {
b << data
}
// write_decimal appends a decimal representation of the number `n` into the builder `b`.
// The higher order digits come first, i.e. 6123 will be written with the digit `6` first,
// then `1`, then `2` and `3` last.
pub fn (mut b Builder) write_decimal(n i64) {
if n == 0 {
b.write_u8(0x30)
return
}
mut mag := u64(n)
if n < 0 {
b.write_u8(`-`)
// Wrapping unsigned negation yields the correct magnitude even for `min_i64`,
// whose absolute value does not fit in an i64. It also avoids depending on the
// `min_i64` constant, which the JS backend currently lowers incorrectly, so a
// runtime `min_i64` (e.g. from `'-9223372036854775808'.i64()`) still formats right.
mag = u64(0) - mag
}
b.write_u_decimal(mag)
}
// write_u_decimal appends a decimal representation of the unsigned number `n` into the
// builder `b`. Unlike `write_decimal`, it covers the entire `u64` range (values above
// `max_i64`). The higher order digits come first.
pub fn (mut b Builder) write_u_decimal(n u64) {
if n == 0 {
b.write_u8(0x30)
return
}
mut buf := [20]u8{} // max_u64 == 18446744073709551615, i.e. 20 digits
mut x := n
mut i := 19
for x != 0 {
buf[i] = u8(x % 10) + 0x30
x = x / 10
i--
}
for j := i + 1; j <= 19; j++ {
b.write_u8(buf[j])
}
}
pub fn (mut b Builder) write(data []u8) ?int {
if data.len == 0 {
return 0
}
b << data
return data.len
}
pub fn (b &Builder) byte_at(n int) u8 {
unsafe {
return b[n]
}
}
pub fn (mut b Builder) write_string(s string) {
if s == '' {
return
}
for c in s {
b << c
}
}
pub fn (mut b Builder) writeln(s string) {
if s != '' {
b.write_string(s)
}
b << 10
}
pub fn (mut b Builder) str() string {
s := ''
#for (const c of b.val.arr.arr)
#s.str += String.fromCharCode(+c)
b.clear()
return s
}
pub fn (mut b Builder) cut_last(n int) string {
cut_pos := b.len - n
x := unsafe { b[cut_pos..] }
res := x.bytestr()
b.trim(cut_pos)
return res
}
pub fn (mut b Builder) go_back_to(pos int) {
b.trim(pos)
}
// go_back discards the last `n` bytes from the buffer.
pub fn (mut b Builder) go_back(n int) {
b.trim(b.len - n)
}
// cut_to cuts the string after `pos` and returns it.
// if `pos` is superior to builder length, returns an empty string
// and cancel further operations
pub fn (mut b Builder) cut_to(pos int) string {
if pos > b.len {
return ''
}
return b.cut_last(b.len - pos)
}
pub fn (mut b Builder) write_runes(runes []rune) {
for r in runes {
res := r.str()
#res.str = String.fromCharCode(r.val)
b << res.bytes()
}
}
// after(6) returns 'world'
// buf == 'hello world'
pub fn (mut b Builder) after(n int) string {
if n >= b.len {
return ''
}
x := unsafe { b[n..b.len] }
return x.bytestr()
}
// last_n(5) returns 'world'
// buf == 'hello world'
pub fn (mut b Builder) last_n(n int) string {
if n >= b.len {
return ''
}
x := unsafe { b[b.len - n..b.len] }
return x.bytestr()
}