-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstd.goof
105 lines (92 loc) · 1.93 KB
/
std.goof
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
macro stdin 0 end
macro stdout 1 end
macro stderr 2 end
macro SYS_READ 0 end
macro SYS_WRITE 1 end
macro SYS_EXIT 60 end
macro SYS_OPENAT 257 end
macro O_RDONLY 0 end
macro AT_FDCWD -100 end
macro write SYS_WRITE syscall3 end
macro read SYS_READ syscall3 end
macro exit SYS_EXIT syscall1 drop end
macro openat SYS_OPENAT syscall3 end
macro / divmod drop end
macro % divmod swap drop end
macro mod % end
macro div / end
macro load64
7 + 0
8 shl over , + swap 1 - swap
8 shl over , + swap 1 - swap
8 shl over , + swap 1 - swap
8 shl over , + swap 1 - swap
8 shl over , + swap 1 - swap
8 shl over , + swap 1 - swap
8 shl over , + swap 1 - swap
8 shl over , + swap drop
end
macro store64
2dup 255 and . 8 shr swap 1 + swap
2dup 255 and . 8 shr swap 1 + swap
2dup 255 and . 8 shr swap 1 + swap
2dup 255 and . 8 shr swap 1 + swap
2dup 255 and . 8 shr swap 1 + swap
2dup 255 and . 8 shr swap 1 + swap
2dup 255 and . 8 shr swap 1 + swap
2dup 255 and . 8 shr swap drop drop
end
// ptr -> strlen(ptr)
// string pointed to by ptr must be null terminated
macro strlen
dup
while dup , 0 != do 1 + end
swap -
end
// ptr -> int(ptr)
// string pointed to by ptr must be null terminated
macro stoi
0 (bool)
over , 45 = if
drop
1 +
1 (bool)
end
swap
0
// flag ptr val
over ,
while dup 58 < over 47 > & do
// ptr val *ptr
48 -
// ptr val *ptr-'0'
swap
10 * +
// ptr [*ptr-'0' + val*10]
swap
// [*ptr-'0' + val*10] ptr
1 +
swap
// ptr+1 [*ptr-'0' + val*10]
over ,
end
drop swap drop
swap if
-1 *
end
end
macro puts
stdout write drop
end
macro eputs
stderr write drop
end
// ptr -> *ptr++
macro inc64 dup ,64 1 + .64 end
// n -> &argv[n]
macro nth_argv
8 * argv + ,64 (ptr)
end
// s1, s2 -> true / false
macro streq
end