add file input, INCLUDE-FILE, and INCLUDED

This commit is contained in:
Jesse D. McDonald 2020-11-07 17:29:48 -06:00
parent 3590996e43
commit d2ca30d177
1 changed files with 64 additions and 16 deletions

View File

@ -2025,13 +2025,18 @@ TERMINAL-BUFFER-BYTES ALLOCATE CONSTANT TERMINAL-BUFFER
2VARIABLE TIB-LEFTOVER 2VARIABLE TIB-LEFTOVER
NULL 0 TIB-LEFTOVER 2! NULL 0 TIB-LEFTOVER 2!
\ Placeholder for later support for input from files
DEFER REFILL-FROM-FILE
' FALSE IS REFILL-FROM-FILE
FORTH DEFINITIONS FORTH DEFINITIONS
\ Attempt to replace the parse area with the next line from the current source \ Attempt to replace the parse area with the next line from the current source
\ Return TRUE if the parse area was refilled, or FALSE otherwise \ Return TRUE if the parse area was refilled, or FALSE otherwise
\ REFILL always fails if the current source is a string (from EVALUATE) \ REFILL always fails if the current source is a string (from EVALUATE)
:FINALIZE REFILL ( -- flag ) :FINALIZE REFILL ( -- flag )
SOURCE-ID 0< IF FALSE EXIT THEN SOURCE-ID -1 = IF FALSE EXIT THEN
SOURCE-ID 0> IF REFILL-FROM-FILE EXIT THEN
\ Shift any leftover characters after the previous line to the start of the buffer \ Shift any leftover characters after the previous line to the start of the buffer
TIB-LEFTOVER 2@ TERMINAL-BUFFER SWAP DUP >R CMOVE TIB-LEFTOVER 2@ TERMINAL-BUFFER SWAP DUP >R CMOVE
\ Look for the linefeed character which marks the end of the first line \ Look for the linefeed character which marks the end of the first line
@ -2039,8 +2044,7 @@ FORTH DEFINITIONS
\ If at the end with room in the buffer, read more from the file descriptor \ If at the end with room in the buffer, read more from the file descriptor
2DUP = IF 2DUP = IF
DUP TERMINAL-BUFFER-BYTES U< IF DUP TERMINAL-BUFFER-BYTES U< IF
\ SOURCE-ID is the file descriptor number to read from STDIN OVER TERMINAL-BUFFER TERMINAL-BUFFER-BYTES ROT /STRING
SOURCE-ID OVER TERMINAL-BUFFER TERMINAL-BUFFER-BYTES ROT /STRING
( S: length idx src-id buff buff-size ) ( S: length idx src-id buff buff-size )
SYS_READ SYSCALL3-RETRY DUP 0< IF EXCP-FILE-IO THROW THEN SYS_READ SYSCALL3-RETRY DUP 0< IF EXCP-FILE-IO THROW THEN
( S: length idx u-read ) ( S: length idx u-read )
@ -2799,6 +2803,16 @@ STRUCT
unsigned-long-long% FIELD stat64>ino unsigned-long-long% FIELD stat64>ino
ENDSTRUCT stat64% ENDSTRUCT stat64%
UTILITY DEFINITIONS
4096 CONSTANT FILE-BUFFER-BYTES
4096 CONSTANT SOURCE-BUFFER-BYTES
: MAKE-CSTRING ( c-addr1 u -- c-addr2 )
TUCK ▪ DUP 1+ ALLOCATE ▪ DUP >R ▪ SWAP CMOVE ▪ 0 ▪ SWAP R@ + C! ▪ R> ;
: EMPTY-CSTRING "\0" DROP ;
SYSTEM DEFINITIONS SYSTEM DEFINITIONS
STRUCT STRUCT
@ -2807,6 +2821,7 @@ STRUCT
CELL% FIELD FILE>BUFFER CELL% FIELD FILE>BUFFER
2CELL% FIELD FILE>LEFTOVER 2CELL% FIELD FILE>LEFTOVER
2CELL% FIELD FILE>POSITION 2CELL% FIELD FILE>POSITION
2CELL% FIELD FILE>SOURCE
ENDSTRUCT FILE% ENDSTRUCT FILE%
{ CONTAINEROF FILE>NODE ▪ FILE>FD @ } ' <=> NEW-AA-TREE CONSTANT FILES { CONTAINEROF FILE>NODE ▪ FILE>FD @ } ' <=> NEW-AA-TREE CONSTANT FILES
@ -2818,14 +2833,18 @@ signed-long-long% %VARIABLE LLSEEK-RESULT
: 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 ;
UTILITY DEFINITIONS : CLEAR-LEFTOVER ( file-addr -- )
[ NULL 0 ] 2LITERAL ROT FILE>LEFTOVER 2! ;
4096 CONSTANT FILE-BUFFER-BYTES : ENSURE-BUFFER ( file-addr -- )
FILE>BUFFER DUP @ NULL= IF
FILE-BUFFER-BYTES ALLOCATE SWAP !
ELSE DROP THEN ;
: MAKE-CSTRING ( c-addr1 u -- c-addr2 ) : ENSURE-SOURCE ( file-addr -- )
TUCK ▪ DUP 1+ ALLOCATE ▪ DUP >R ▪ SWAP CMOVE ▪ 0 ▪ SWAP R@ + C! ▪ R> ; FILE>SOURCE DUP 2@ DROP NULL= IF
SOURCE-BUFFER-BYTES ALLOCATE 0 ROT 2!
: EMPTY-CSTRING "\0" DROP ; ELSE DROP THEN ;
FORTH DEFINITIONS FORTH DEFINITIONS
@ -2838,9 +2857,10 @@ O_RDWR CONSTANT R/W ( -- fam )
: OPEN-FILE ( c-addr u fam -- fileid ) : OPEN-FILE ( c-addr u fam -- fileid )
FILE% %ALLOCATE >R FILE% %ALLOCATE >R
FILE-BUFFER-BYTES ALLOCATE R@ FILE>BUFFER ! NULL R@ FILE>BUFFER !
[ NULL 0 ] 2LITERAL R@ FILE>LEFTOVER 2! R@ CLEAR-LEFTOVER
0# R@ FILE>POSITION 2! 0# R@ FILE>POSITION 2!
[ NULL 0 ] 2LITERAL R@ FILE>SOURCE 2!
OPEN-HOW SIZEOF open_how% 0 FILL OPEN-HOW SIZEOF open_how% 0 FILL
DUP 0 SWAP OPEN-HOW open_how>flags 2! DUP 0 SWAP OPEN-HOW open_how>flags 2!
[[ O_CREAT __O_TMPFILE OR ]] AND IF [[ O_CREAT __O_TMPFILE OR ]] AND IF
@ -2862,7 +2882,7 @@ O_RDWR CONSTANT R/W ( -- fam )
: REPOSITION-FILE ( ud fileid -- ) : REPOSITION-FILE ( ud fileid -- )
DUP ▪ FD>FILE >R ▪ -ROT SWAP ▪ LLSEEK-RESULT ▪ SEEK_SET DUP ▪ FD>FILE >R ▪ -ROT SWAP ▪ LLSEEK-RESULT ▪ SEEK_SET
SYS__LLSEEK SYSCALL5-RETRY SYS__LLSEEK SYSCALL5-RETRY
[ NULL 0 ] 2LITERAL R@ FILE>LEFTOVER 2! R@ CLEAR-LEFTOVER
0<> IF RDROP EXCP-FILE-IO THROW THEN 0<> IF RDROP EXCP-FILE-IO THROW THEN
LLSEEK-RESULT 2@ SWAP R@ FILE>POSITION 2! LLSEEK-RESULT 2@ SWAP R@ FILE>POSITION 2!
RDROP ; RDROP ;
@ -2885,6 +2905,7 @@ UTILITY DEFINITIONS
: (READ-CHAR) ( file-addr -- c TRUE | FALSE ) : (READ-CHAR) ( file-addr -- c TRUE | FALSE )
>R >R
R@ FILE>LEFTOVER 2@ NIP 0= IF R@ FILE>LEFTOVER 2@ NIP 0= IF
R@ ENSURE-BUFFER
R@ FILE>FD @ R@ FILE>BUFFER @ FILE-BUFFER-BYTES R@ FILE>FD @ R@ FILE>BUFFER @ FILE-BUFFER-BYTES
SYS_READ SYSCALL3-RETRY SYS_READ SYSCALL3-RETRY
DUP 0< IF DROP EXCP-FILE-IO THROW THEN DUP 0< IF DROP EXCP-FILE-IO THROW THEN
@ -2920,7 +2941,7 @@ FORTH DEFINITIONS
DUP max U< DUP max U<
WHILE WHILE
file (READ-CHAR) file (READ-CHAR)
DUP 0= IF NIP TRUE SWAP THEN DUP 0= IF >R NIP DUP 0= SWAP R> THEN
WHILE WHILE
DUP LF <> DUP 0= IF NIP THEN DUP LF <> DUP 0= IF NIP THEN
WHILE WHILE
@ -2930,6 +2951,27 @@ FORTH DEFINITIONS
SWAP SWAP
ENDLOCALS ; ENDLOCALS ;
UTILITY DEFINITIONS
: REFILL-FILE ( fileid -- t=refilled )
FD>FILE >R
R@ ENSURE-SOURCE
R@ FILE>SOURCE 2@ DROP SOURCE-BUFFER-BYTES R@ FILE>FD @ READ-LINE
0= SWAP R@ FILE>SOURCE 2@ DROP SWAP R@ FILE>SOURCE 2! RDROP ;
SYSTEM DEFINITIONS
:FINALIZE REFILL-FROM-FILE ( -- t=refilled )
SOURCE-ID DUP 0< "not a valid file source" ?FAIL
DUP [[ ' REFILL-FILE ]] CATCH ?DUP IF
DUP EXCP-FILE-IO <> IF RETHROW THEN
DROP 2DROP FALSE EXIT
THEN
DUP IF ▪ OVER FD>FILE FILE>SOURCE 2@ ▪ INPUT-BUFFER 2! ▪ 0 >IN ! ▪ THEN
NIP ;
FORTH DEFINITIONS
: WRITE-FILE ( c-addr u fileid -- ) : WRITE-FILE ( c-addr u fileid -- )
FD>FILE >R FD>FILE >R
R@ FILE>LEFTOVER 2@ NIP IF R@ FILE>FD @ FLUSH-FILE THEN R@ FILE>LEFTOVER 2@ NIP IF R@ FILE>FD @ FLUSH-FILE THEN
@ -2947,13 +2989,19 @@ FORTH DEFINITIONS
: CLOSE-FILE ( fileid -- ) : CLOSE-FILE ( fileid -- )
FD>FILE ▪ DUP FILE>FD @ FILES AA-DELETE DROP FD>FILE ▪ DUP FILE>FD @ FILES AA-DELETE DROP
DUP FILE>FD @ SYS_CLOSE SYSCALL1 DROP ( do not retry close ) DUP FILE>FD @ SYS_CLOSE SYSCALL1 DROP ( do not retry close )
DUP FILE>BUFFER @ FREE ▪ FREE ; DUP FILE>BUFFER @ FREE ▪ DUP FILE>SOURCE 2@ DROP FREE ▪ FREE ;
: RENAME-FILE ( c-addr1 u1 c-addr2 u2 -- ) …TODO… ; : RENAME-FILE ( c-addr1 u1 c-addr2 u2 -- ) …TODO… ;
: DELETE-FILE ( c-addr u -- ) …TODO… ; : DELETE-FILE ( c-addr u -- ) …TODO… ;
: INCLUDE-FILE ( i*x fileid -- j*x ) …TODO… ; : INCLUDE-FILE ( i*x fileid -- j*x )
: INCLUDED ( i*x c-addr u -- j*x ) …TODO… ; SAVE-INPUT N>R ▪ SOURCE 2>R ▪ SOURCE-ID >R
CURRENT-SOURCE-ID !
BEGIN REFILL WHILE INTERPRET REPEAT
R> CURRENT-SOURCE-ID ! ▪ 2R> INPUT-BUFFER 2! ▪ NR> RESTORE-INPUT DROP ;
: INCLUDED ( i*x c-addr u -- j*x )
R/O OPEN-FILE DUP >R [[ ' INCLUDE-FILE ]] CATCH R> CLOSE-FILE RETHROW ;
: FILE-STATUS ( c-addr u -- x ) …TODO… ; : FILE-STATUS ( c-addr u -- x ) …TODO… ;