replace global variables holding local data with ALLOCA
This commit is contained in:
parent
54ac4ca37b
commit
e533756d25
64
startup.4th
64
startup.4th
|
|
@ -2226,12 +2226,10 @@ ENDSTRUCT termios%
|
||||||
|
|
||||||
SYSTEM DEFINITIONS
|
SYSTEM DEFINITIONS
|
||||||
|
|
||||||
termios% %VARIABLE SCRATCH-TERMIOS
|
|
||||||
|
|
||||||
FORTH DEFINITIONS
|
FORTH DEFINITIONS
|
||||||
|
|
||||||
: TTY? ( fd -- flag )
|
: TTY? ( fd -- flag )
|
||||||
IOCTL_TCGETS SCRATCH-TERMIOS SYS_IOCTL SYSCALL3 0= ;
|
IOCTL_TCGETS termios% %ALLOCA SYS_IOCTL SYSCALL3 UNALLOCA 0= ;
|
||||||
|
|
||||||
STDIN TTY? CONSTANT INTERACTIVE?
|
STDIN TTY? CONSTANT INTERACTIVE?
|
||||||
|
|
||||||
|
|
@ -2788,9 +2786,7 @@ ENDSTRUCT FILE%
|
||||||
|
|
||||||
{ CONTAINEROF FILE>NODE ▪ FILE>FD @ } ' <=> NEW-AA-TREE CONSTANT FILES
|
{ CONTAINEROF FILE>NODE ▪ FILE>FD @ } ' <=> NEW-AA-TREE CONSTANT FILES
|
||||||
|
|
||||||
open_how% %VARIABLE OPEN-HOW
|
|
||||||
stat64% %VARIABLE STAT64-RESULT
|
stat64% %VARIABLE STAT64-RESULT
|
||||||
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 ;
|
||||||
|
|
@ -2818,36 +2814,44 @@ O_RDWR CONSTANT R/W ( -- fam )
|
||||||
: BIN ( fam1 -- fam2 ) IMMEDIATE ;
|
: BIN ( fam1 -- fam2 ) IMMEDIATE ;
|
||||||
|
|
||||||
: OPEN-FILE ( c-addr u fam -- fileid )
|
: OPEN-FILE ( c-addr u fam -- fileid )
|
||||||
FILE% %ALLOCATE >R
|
-ROT MAKE-CSTRING
|
||||||
NULL R@ FILE>BUFFER !
|
open_how% %ALLOCA
|
||||||
R@ CLEAR-LEFTOVER
|
FILE% %ALLOCATE
|
||||||
0# R@ FILE>POSITION 2!
|
LOCALS| fam name open-how file |
|
||||||
[ NULL 0 ] 2LITERAL R@ FILE>SOURCE 2!
|
NULL file FILE>BUFFER !
|
||||||
OPEN-HOW SIZEOF open_how% 0 FILL
|
file CLEAR-LEFTOVER
|
||||||
DUP 0 SWAP OPEN-HOW open_how>flags 2!
|
0# file FILE>POSITION 2!
|
||||||
[[ O_CREAT __O_TMPFILE OR ]] AND IF
|
[ NULL 0 ] 2LITERAL file FILE>SOURCE 2!
|
||||||
0 0666 OPEN-HOW open_how>mode 2!
|
open-how SIZEOF open_how% 0 FILL
|
||||||
THEN
|
0 fam open-how open_how>flags 2!
|
||||||
AT_FDCWD ▪ -ROT MAKE-CSTRING DUP >R ▪ OPEN-HOW ▪ SIZEOF open_how%
|
fam [[ O_CREAT __O_TMPFILE OR ]] AND IF
|
||||||
SYS_OPENAT2 SYSCALL4-RETRY
|
0 0666 open-how open_how>mode 2!
|
||||||
R> FREE
|
THEN
|
||||||
DUP ERRNO_ENOENT = OR-ELSE DUP ERRNO_ENOTDIR = THEN IF
|
AT_FDCWD ▪ name ▪ open-how ▪ SIZEOF open_how%
|
||||||
DROP EXCP-NON-EXISTENT-FILE THROW THEN
|
SYS_OPENAT2 SYSCALL4-RETRY
|
||||||
DUP 0< IF DROP EXCP-FILE-IO THROW THEN
|
name FREE
|
||||||
DUP R@ FILE>FD !
|
DUP ERRNO_ENOENT = OR-ELSE DUP ERRNO_ENOTDIR = THEN IF
|
||||||
R@ FILES AA-LOOKUP 0<> "internal error - duplicate key in FILES" ?FAIL
|
DROP file FREE EXCP-NON-EXISTENT-FILE THROW THEN
|
||||||
R> FILES AA-INSERT ;
|
DUP 0< IF DROP file FREE EXCP-FILE-IO THROW THEN
|
||||||
|
DUP file FILE>FD !
|
||||||
|
file FILES AA-LOOKUP NULL<> "internal error - duplicate key in FILES" ?FAIL
|
||||||
|
file FILES AA-INSERT
|
||||||
|
ENDLOCALS
|
||||||
|
UNALLOCA ;
|
||||||
|
|
||||||
: CREATE-FILE ( c-addr u fam -- fileid )
|
: CREATE-FILE ( c-addr u fam -- fileid )
|
||||||
[[ O_CREAT O_TRUNC OR ]] OR OPEN-FILE ;
|
[[ O_CREAT O_TRUNC OR ]] OR OPEN-FILE ;
|
||||||
|
|
||||||
: REPOSITION-FILE ( ud fileid -- )
|
: REPOSITION-FILE ( ud fileid -- )
|
||||||
DUP ▪ FD>FILE >R ▪ -ROT SWAP ▪ LLSEEK-RESULT ▪ SEEK_SET
|
DUP FD>FILE ▪ signed-long-long% %ALLOCA
|
||||||
SYS__LLSEEK SYSCALL5-RETRY
|
LOCALS| file llseek-result |
|
||||||
R@ CLEAR-LEFTOVER
|
-ROT SWAP ▪ llseek-result ▪ SEEK_SET
|
||||||
0<> IF RDROP EXCP-FILE-IO THROW THEN
|
SYS__LLSEEK SYSCALL5-RETRY
|
||||||
LLSEEK-RESULT 2@ SWAP R@ FILE>POSITION 2!
|
file CLEAR-LEFTOVER
|
||||||
RDROP ;
|
0<> IF RDROP EXCP-FILE-IO THROW THEN
|
||||||
|
llseek-result 2@ SWAP file FILE>POSITION 2!
|
||||||
|
ENDLOCALS
|
||||||
|
UNALLOCA ;
|
||||||
|
|
||||||
: FILE-POSITION ( fileid -- ud ) FD>FILE FILE>POSITION 2@ ;
|
: FILE-POSITION ( fileid -- ud ) FD>FILE FILE>POSITION 2@ ;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue