lang-bootstrap/05/idents.b

77 lines
1.7 KiB
Brainfuck
Raw Normal View History

2022-01-24 20:53:37 -05:00
; an "identifier list" is a list of identifiers and 64-bit values associated with them.
2022-01-18 16:29:48 -05:00
function ident_list_create
argument nbytes
local list
list = malloc(nbytes)
*1list = 255
return list
function ident_list_add
argument list
argument ident
argument value
2022-01-25 17:50:00 -05:00
; note: we can't just do list = memchr(list, 255) because values
; might have a 255 byte.
:ilist_add_go_to_end_loop
if *1list == 255 goto ilist_add_found_end
list = memchr(list, 0)
list += 9 ; skip null byte and value
goto ilist_add_go_to_end_loop
:ilist_add_found_end
2022-01-18 16:29:48 -05:00
list = strcpy(list, ident)
list += 1
*8list = value ; UNALIGNED
list += 8
*1list = 255
return
; return the value associated with this identifier, or 0 if none is
function ident_list_lookup
argument list
argument ident
local b
:ilist_lookup_loop
if *1list == 255 goto return_0
b = str_equals(list, ident)
list = memchr(list, 0)
2022-01-25 17:50:00 -05:00
list += 9 ; skip null byte and value
2022-01-18 16:29:48 -05:00
if b == 0 goto ilist_lookup_loop
2022-01-25 17:50:00 -05:00
list -= 8 ; backtrack to value
2022-01-18 16:29:48 -05:00
return *8list ; UNALIGNED
2022-01-24 20:53:37 -05:00
; if identifier in list, sets *pvalue to its value (if pvalue is not null) and returns 1
; otherwise, returns 0
function ident_list_lookup_check
argument list
argument ident
argument pvalue
local b
:ilist_lookcheck_loop
if *1list == 255 goto return_0
b = str_equals(list, ident)
list = memchr(list, 0)
2022-01-25 17:50:00 -05:00
list += 9 ; skip null byte and value
2022-01-24 20:53:37 -05:00
if b == 0 goto ilist_lookcheck_loop
if pvalue == 0 goto return_1
2022-01-25 17:50:00 -05:00
list -= 8 ; backtrack to value
2022-01-24 20:53:37 -05:00
*8pvalue = *8list
return 1
2022-01-18 16:29:48 -05:00
function ident_list_print
argument list
:ilist_print_loop
if *1list == 255 goto ilist_print_loop_end
puts(list)
putc(':)
putc(32)
list = memchr(list, 0)
list += 1
putn(*8list)
list += 8
goto ilist_print_loop
:ilist_print_loop_end
return