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