Skip to content

Commit 7abaa05

Browse files
committed
Update w4std with procs with let-bindings
1 parent f69e70d commit 7abaa05

1 file changed

Lines changed: 175 additions & 10 deletions

File tree

std/w4std.porth

Lines changed: 175 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,27 @@ proc cstrlen ptr -- int in
66
swap ptr-diff
77
end
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+
930
inline proc cstr-to-str ptr -- int ptr in dup cstrlen swap end
1031

1132
const offsetof(Str.count) sizeof(u64) offset end
@@ -20,14 +41,17 @@ inline proc !Str.count int ptr in Str.count !64 end
2041
inline proc !Str.data ptr ptr in Str.data !64 end
2142

2243
inline 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
2548
end
2649

2750
inline 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
3155
end
3256

3357
inline proc str-null -- int ptr in 0 NULL end
@@ -42,10 +66,62 @@ inline proc str-chop-one-right ptr in
4266
end
4367

4468
proc ?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
49125
end
50126

51127
proc str-trim-left ptr in // input --
@@ -68,10 +144,10 @@ end
68144
inline proc puts int ptr in traceUtf8 end
69145

70146
const PUTU_BUFFER_CAP 32 end
71-
memory buffer PUTU_BUFFER_CAP end
72147
proc putu
73148
int // number
74149
in
150+
memory buffer PUTU_BUFFER_CAP end
75151
dup 0 = if
76152
"0" puts
77153
else
@@ -86,4 +162,93 @@ in
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
89254
end

0 commit comments

Comments
 (0)