;
; 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
+ .destructor closeallfiles, 17
.import SETLFS, OPEN, CLOSE
.import addysp, popax
.import opencmdchannel, closecmdchannel, readdiskerror
.import __oserror
.import fnunit
+ .import _close
.importzp sp, tmp2, tmp3
.include "errno.inc"
;--------------------------------------------------------------------------
-; 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
;
; 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"
+;----------------------------------------------------------------------------
+; 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
__filetab:
; Standard file descriptors
_stdin:
- .word __filetab + (0 * _FILE_size)
+ .word __filetab + (STDIN_FILENO * _FILE_size)
_stdout:
- .word __filetab + (1 * _FILE_size)
+ .word __filetab + (STDOUT_FILENO * _FILE_size)
_stderr:
- .word __filetab + (2 * _FILE_size)
+ .word __filetab + (STDERR_FILENO * _FILE_size)
+
+
+; Temp storage for closeallstreams
+
+.bss
+index: .res 1
+