fix for data left on return stack when AA tree is empty

This commit is contained in:
Jesse D. McDonald 2020-11-07 17:28:18 -06:00
parent 9361c6fef0
commit 3590996e43
1 changed files with 65 additions and 19 deletions

View File

@ -2289,10 +2289,9 @@ SYSTEM DEFINITIONS
\ From this point on we only execute threaded FORTH words defined in this file \ From this point on we only execute threaded FORTH words defined in this file
\ ***************************************************************************** \ *****************************************************************************
ONLY FORTH ONLY FORTH ALSO
ALSO UTILITY UTILITY ALSO
ALSO SYSTEM SYSTEM ALSO
ALSO
SYSTEM DEFINITIONS SYSTEM DEFINITIONS
@ -2753,19 +2752,23 @@ UTILITY DEFINITIONS
AA>ROOT @ AA-TRAVERSE-NODE ; AA>ROOT @ AA-TRAVERSE-NODE ;
: AA-ITERATE ( i*x xt aa-tree -- j*x ) : AA-ITERATE ( i*x xt aa-tree -- j*x )
NULL >R AA>ROOT @ AA>ROOT @ ?DUP IF
BEGIN ?DUP WHILE NULL >R
DUP >R AA>LEFT @ BEGIN
BEGIN ?DUP 0= WHILE DUP >R AA>LEFT @
R> ?DUP 0= IF DROP EXIT THEN BEGIN ?DUP 0= WHILE
2DUP 2>R SWAP EXECUTE 2R> R> ?DUP 0= IF DROP EXIT THEN
AA>RIGHT @ 2DUP 2>R SWAP EXECUTE 2R>
REPEAT AA>RIGHT @
REPEAT ▪ DROP ; REPEAT
AGAIN
THEN ▪ DROP ;
: AA-#NODES ( aa-tree -- u ) : AA-#NODES ( aa-tree -- u )
>R 0 { DROP 1+ } R> AA-ITERATE ; >R 0 { DROP 1+ } R> AA-ITERATE ;
LINUX ALSO
LINUX DEFINITIONS LINUX DEFINITIONS
STRUCT STRUCT
@ -2808,11 +2811,9 @@ ENDSTRUCT FILE%
{ CONTAINEROF FILE>NODE ▪ FILE>FD @ } ' <=> NEW-AA-TREE CONSTANT FILES { CONTAINEROF FILE>NODE ▪ FILE>FD @ } ' <=> NEW-AA-TREE CONSTANT FILES
ALSO LINUX
open_how% %VARIABLE OPEN-HOW open_how% %VARIABLE OPEN-HOW
stat64% %VARIABLE STAT64-RESULT stat64% %VARIABLE STAT64-RESULT
signed-long-long% %VARIABLE LLSEEK-RESULT signed-long-long% %VARIABLE LLSEEK-RESULT
PREVIOUS
: FD>FILE ( fileid -- file-addr ) : FD>FILE ( fileid -- file-addr )
FILES AA-LOOKUP ?DUP 0= "unknown file ID" ?FAIL ; FILES AA-LOOKUP ?DUP 0= "unknown file ID" ?FAIL ;
@ -2828,8 +2829,6 @@ UTILITY DEFINITIONS
FORTH DEFINITIONS FORTH DEFINITIONS
ALSO LINUX
O_RDONLY CONSTANT R/O ( -- fam ) O_RDONLY CONSTANT R/O ( -- fam )
O_WRONLY CONSTANT W/O ( -- fam ) O_WRONLY CONSTANT W/O ( -- fam )
O_RDWR CONSTANT R/W ( -- fam ) O_RDWR CONSTANT R/W ( -- fam )
@ -2881,8 +2880,55 @@ O_RDWR CONSTANT R/W ( -- fam )
0<> IF EXCP-FILE-IO THROW THEN 0<> IF EXCP-FILE-IO THROW THEN
STAT64-RESULT stat64>size 2@ SWAP ; STAT64-RESULT stat64>size 2@ SWAP ;
: READ-FILE ( c-addr u1 fileid -- u2 ) ; UTILITY DEFINITIONS
: READ-LINE ( c-addr u1 fileid -- u2 t=eof ) ;
: (READ-CHAR) ( file-addr -- c TRUE | FALSE )
>R
R@ FILE>LEFTOVER 2@ NIP 0= IF
R@ FILE>FD @ R@ FILE>BUFFER @ FILE-BUFFER-BYTES
SYS_READ SYSCALL3-RETRY
DUP 0< IF DROP EXCP-FILE-IO THROW THEN
DUP FILE-BUFFER-BYTES U> "read more data than requested" ?FAIL
R@ FILE>BUFFER @ SWAP R@ FILE>LEFTOVER 2!
THEN
R@ FILE>LEFTOVER 2@ DUP IF
OVER C@ -ROT 1/STRING R@ FILE>LEFTOVER 2!
R@ FILE>POSITION DUP 2@ 1# D+ ROT 2!
TRUE
ELSE
2DROP FALSE
THEN
RDROP ;
FORTH DEFINITIONS
: READ-FILE ( c-addr u1 fileid -- u2 )
FD>FILE LOCALS| addr max file |
0 BEGIN
DUP max U<
WHILE
file (READ-CHAR)
WHILE
OVER addr + C!
1+
REPEAT
ENDLOCALS ;
: READ-LINE ( c-addr u1 fileid -- u2 t=eof )
FD>FILE LOCALS| addr max file |
FALSE 0 BEGIN
DUP max U<
WHILE
file (READ-CHAR)
DUP 0= IF NIP TRUE SWAP THEN
WHILE
DUP LF <> DUP 0= IF NIP THEN
WHILE
OVER addr + C!
1+
REPEAT
SWAP
ENDLOCALS ;
: WRITE-FILE ( c-addr u fileid -- ) : WRITE-FILE ( c-addr u fileid -- )
FD>FILE >R FD>FILE >R