@@ -6,6 +6,27 @@ proc cstrlen ptr -- int in
66 swap ptr-diff
77end
88
9+ proc cstreq ptr ptr -- bool in
10+ while
11+ peek s1 s2 in
12+ s1 @8 0 != s2 @8 0 != land if
13+ s1 @8 s2 @8 =
14+ else false end
15+ end
16+ do
17+ let s1 s2 in
18+ s1 1 ptr+
19+ s2 1 ptr+
20+ end
21+ end
22+
23+ let s1 s2 in
24+ s1 @8 0 =
25+ s2 @8 0 =
26+ land
27+ end
28+ end
29+
930inline proc cstr-to-str ptr -- int ptr in dup cstrlen swap end
1031
1132const offsetof(Str.count) sizeof(u64) offset end
@@ -20,14 +41,17 @@ inline proc !Str.count int ptr in Str.count !64 end
2041inline proc !Str.data ptr ptr in Str.data !64 end
2142
2243inline proc @Str ptr -- int ptr in
23- dup @Str.count
24- swap @Str.data
44+ let s in
45+ s @Str.count
46+ s @Str.data
47+ end
2548end
2649
2750inline proc !Str int ptr ptr in
28- swap over
29- !Str.data
30- !Str.count
51+ let n s p in
52+ n p !Str.count
53+ s p !Str.data
54+ end
3155end
3256
3357inline proc str-null -- int ptr in 0 NULL end
@@ -42,10 +66,62 @@ inline proc str-chop-one-right ptr in
4266end
4367
4468proc ?space int -- bool in
45- dup
46- ' ' = swap dup
47- '\n' = swap
48- '\r' = lor lor
69+ let x in
70+ x ' ' =
71+ x '\n' = lor
72+ x '\r' = lor
73+ end
74+ end
75+
76+ proc str-chop-by-predicate
77+ addr // predicate
78+ ptr // dst
79+ ptr // src
80+ in
81+ memory predicate sizeof(addr) end
82+ rot predicate !addr
83+ over over @Str.data swap !Str.data
84+ over 0 swap !Str.count
85+ while
86+ dup @Str.count 0 > if
87+ dup @Str.data @8 predicate @addr call-like ?space lnot
88+ else false end
89+ do
90+ dup str-chop-one-left
91+ swap dup Str.count inc64 swap
92+ end
93+ dup @Str.count 0 > if
94+ dup str-chop-one-left
95+ end
96+ drop drop
97+ end
98+
99+ proc streq
100+ int ptr
101+ int ptr
102+ --
103+ bool
104+ in
105+ let n s1 m s2 in
106+ n m = if
107+ n s1 s2
108+ while
109+ peek n s1 s2 in
110+ n 0 > if
111+ s1 @8 s2 @8 =
112+ else false end
113+ end
114+ do
115+ let n s1 s2 in
116+ n 1 -
117+ s1 1 ptr+
118+ s2 1 ptr+
119+ end
120+ end
121+
122+ let n _ _ in n 0 <= end
123+ else false end
124+ end
49125end
50126
51127proc str-trim-left ptr in // input --
68144inline proc puts int ptr in traceUtf8 end
69145
70146const PUTU_BUFFER_CAP 32 end
71- memory buffer PUTU_BUFFER_CAP end
72147proc putu
73148 int // number
74149in
150+ memory buffer PUTU_BUFFER_CAP end
75151 dup 0 = if
76152 "0" puts
77153 else
86162 buffer PUTU_BUFFER_CAP ptr+ swap ptr-diff swap puts
87163 end
88164 drop
165+ end
166+
167+ proc puti
168+ int // number
169+ in
170+ let number in
171+ number 0 < if
172+ "-" puts
173+ number not 1 +
174+ else
175+ number
176+ end
177+ putu
178+ end
179+ end
180+
181+ proc memcpy
182+ int // size
183+ ptr // src
184+ ptr // dst
185+ --
186+ ptr // dst
187+ in
188+ memory src sizeof(ptr) end
189+ memory dst sizeof(ptr) end
190+ memory result sizeof(ptr) end
191+ dst !64
192+ src !64
193+ dst @ptr swap // result
194+ while dup 0 > do
195+ src @ptr @8
196+ dst @ptr !8
197+ src inc64
198+ dst inc64
199+ 1 -
200+ end drop
201+ end
202+
203+ proc memset
204+ int // size
205+ int // byte
206+ ptr // data
207+ --
208+ ptr // data
209+ in
210+ memory data sizeof(ptr) end
211+ data !64
212+ memory byte sizeof(u64) end
213+ byte !64
214+ data @ptr swap
215+ while dup 0 > do
216+ byte @64 data @ptr !8
217+ data inc64
218+ 1 -
219+ end
220+ drop
221+ end
222+
223+ /// Appends an item to a fixed size array
224+ /// returns `true` when succeeds, `false` when overflow
225+ proc append-item
226+ int // item size
227+ ptr // item
228+ int // array capacity
229+ ptr // array
230+ ptr // array count
231+ --
232+ int // index of the appended item
233+ bool // true - appended, false - not enough space
234+ in
235+ memory count sizeof(ptr) end
236+ count !ptr
237+ memory array sizeof(ptr) end
238+ array !ptr
239+
240+ count @ptr @int > if
241+ over
242+ count @ptr @int *
243+ array @ptr +ptr
244+ memcpy drop
245+
246+ count @ptr @int
247+ count @ptr inc64
248+
249+ true
250+ else
251+ drop drop
252+ 0 false
253+ end
89254end
0 commit comments