1
0
mirror of https://github.com/cc65/cc65.git synced 2025-08-08 06:25:17 +00:00

Close all open files on exit

git-svn-id: svn://svn.cc65.org/cc65/trunk@1707 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz
2002-12-03 21:44:58 +00:00
parent 773888ba95
commit 6ad3b3078f
2 changed files with 83 additions and 5 deletions

View File

@@ -3,8 +3,13 @@
; ;
; int open (const char* name, int flags, ...); /* May take a mode argument */ ; int open (const char* name, int flags, ...); /* May take a mode argument */
; ;
; Be sure to keep the value priority of closeallfiles lower than that of
; closeallstreams (which is the high level C file I/O counterpart and must be
; called before closeallfiles).
.export _open .export _open
.destructor closeallfiles, 17
.import SETLFS, OPEN, CLOSE .import SETLFS, OPEN, CLOSE
.import addysp, popax .import addysp, popax
@@ -12,6 +17,7 @@
.import opencmdchannel, closecmdchannel, readdiskerror .import opencmdchannel, closecmdchannel, readdiskerror
.import __oserror .import __oserror
.import fnunit .import fnunit
.import _close
.importzp sp, tmp2, tmp3 .importzp sp, tmp2, tmp3
.include "errno.inc" .include "errno.inc"
@@ -20,7 +26,34 @@
;-------------------------------------------------------------------------- ;--------------------------------------------------------------------------
; initstdout: Open the stdout and stderr file descriptors for the screen. ; closeallfiles: Close all open files.
.proc closeallfiles
ldx #MAX_FDS
loop: lda fdtab-1,x
beq next ; Skip unused entries
; Close this file
txa
pha ; Save current value of X
ldx #0
jsr _close
pla
tax
; Next file
next: dex
bne loop
rts
.endproc
;--------------------------------------------------------------------------
; _open
.proc _open .proc _open

View File

@@ -3,11 +3,49 @@
; ;
; Data for the stdio file stream. ; Data for the stdio file stream.
; ;
; Be sure to keep the value priority of closeallstreams lower than that of
; closeallfiles (which is the low level POSIX counterpart and must be
; called after closeallstreams).
.export __filetab, _stdin, _stdout, _stderr .export __filetab, _stdin, _stdout, _stderr
.destructor closeallstreams, 16
.import _close
.include "fcntl.inc"
.include "_file.inc" .include "_file.inc"
;----------------------------------------------------------------------------
; Close all files on exit
.proc closeallstreams
ldy #((FOPEN_MAX - 1) * _FILE_size)
loop: sty index ; Save the index
lda __filetab + _FILE_f_flags,y ; Load file flags
and #_FOPEN ; Is it open?
beq next ; jump if closed
; Close this file
lda __filetab + _FILE_f_fd,y
ldx #0
jsr _close
; Next file
next: lda index
sec
sbc #_FILE_size
tay
bcs loop
rts
.endproc
;----------------------------------------------------------------------------
; File data
.data .data
__filetab: __filetab:
@@ -22,10 +60,17 @@ __filetab:
; Standard file descriptors ; Standard file descriptors
_stdin: _stdin:
.word __filetab + (0 * _FILE_size) .word __filetab + (STDIN_FILENO * _FILE_size)
_stdout: _stdout:
.word __filetab + (1 * _FILE_size) .word __filetab + (STDOUT_FILENO * _FILE_size)
_stderr: _stderr:
.word __filetab + (2 * _FILE_size) .word __filetab + (STDERR_FILENO * _FILE_size)
; Temp storage for closeallstreams
.bss
index: .res 1