-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmacro.m4
31 lines (26 loc) · 899 Bytes
/
macro.m4
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
divert(`-1')
define(`upcase', `translit(`$*', `a-z', `A-Z')')dnl
define(`foreach', `pushdef(`$1')_foreach($@)popdef(`$1')')
define(`_arg1', `$1')
define(`_foreach', `ifelse(`$2', `()', `',
`define(`$1', _arg1$2)$3`'$0(`$1', (shift$2), `$3')')')
divert`'dnl
define(`current_ret_num', 0)
define(`next_ret',`define(`current_ret_num',eval(current_ret_num+1)) define(`current_ret_name',`__ret_'current_ret_num)')
define(`call', ` SET PUSH, 'current_ret_name`
SET PC, $1
'current_ret_name`:
'next_ret)
define(`reverse', `ifelse(`$#', `0', , `$#', `1', ``$1'',
`reverse(shift($@)), `$1'')')
define(`invoke', ` SET PUSH, current_ret_name
foreach(x, (`reverse(shift($@))'), ` SET PUSH, 'x`
') SET PC, $1
:current_ret_name next_ret')
define(`jmp', `SET PC, ')
define(`mov', `SET')
define(`ret', `SET PC, POP
')
defn(`JMP', jmp)
defn(`RET', ret)
defn(`MOV', mov)