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:
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user