uxn/projects/library/binary-tree.tal

74 lines
2.2 KiB
Tal
Raw Normal View History

(
binary tree node layout:
+--+--+
| ' | incoming-ptr*
+--+--+ key: null optional
v left right terminated binary
| ptr ptr string data
\ +--+--+--+--+---------+--+----- - -
---> | ' | ' | U x n .00|
+--+--+--+--+---------+--+----- - -
All of the pointers (ptr) are shorts that have the value of the memory
location of the next node, or 0000 to mean that pointer is empty. The very
simplest tree is one where the incoming-ptr* is empty:
+--+--+
|00'00| incoming-ptr*
+--+--+
traverse-tree does two jobs at once, depending on whether the search-key is
found:
* if the search-key exists in the tree, return a pointer to the binary data
that follows that node's key string;
* if the search-key is not present in the key, return the incoming-ptr* that
should be written when adding this node yourself.
)
@traverse-tree ( incoming-ptr* search-key* -- binary-ptr* 00 if key found
OR node-incoming-ptr* 01 if key not found )
STH2
&loop ( incoming-ptr* / search-key* )
LDA2k ORA ,&valid-node JCN
POP2r #01 JMP2r
&valid-node ( incoming-ptr* / search-key* )
LDA2 ( node* / search-key* )
DUP2 #0004 ADD2 ( node* node-key* / search-key* )
STH2kr ( node* node-key* search-key* / search-key* )
,strcmp JSR ( node* node-end* search-end* order nomatch / search-key* )
,&nomatch JCN ( node* node-end* search-end* order / search-key* )
POP POP2 ( node* node-end* / search-key* )
INC2 NIP2 ( binary-ptr* / search-key* )
POP2r #00 ( binary-ptr* 00 )
JMP2r
&nomatch ( node* node-end* search-end* order / search-key* )
#80 AND #06 SFT #00 SWP STH2 ( node* node-end* search-end* / search-key* node-offset^ )
POP2 POP2 ( node* / search-key* node-offset^ )
STH2r ADD2 ( incoming-ptr* / search-key* )
,&loop JMP
@strcmp ( a* b* -- a-end* b-end* order nonzero if strings differ
OR a-end* b-end* 00 00 if strings match )
STH2
,&entry JMP
&loop ( a* a b / b* )
SUB ,&nomatch JCNk ( a* a-b nonzero / b* )
POP2 ( a* / b* )
INC2 INC2r
&entry ( a* / b* )
LDAk LDAkr STHr ( a* a b / b* )
ORAk ,&loop JCN
&nomatch ( a* a-b flag / b* )
STH2r SWP2 ( a* b* a-b flag )
JMP2r