fix for data left on return stack when AA tree is empty
This commit is contained in:
parent
9361c6fef0
commit
3590996e43
84
startup.4th
84
startup.4th
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue