From 131a5cad095643e2e1a9be110c35e4f7552eeed3 Mon Sep 17 00:00:00 2001 From: uz Date: Thu, 10 Jun 2010 18:10:53 +0000 Subject: [PATCH] Renamed oserrcheck to __mappederrno. Added an additional function named __directerrno and moved both to errno.s. Changed several sources to use these functions. Needs testing. git-svn-id: svn://svn.cc65.org/cc65/trunk@4718 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- asminc/errno.inc | 4 +-- include/errno.h | 48 ++++++++++++++++++++------ libsrc/cbm/close.s | 13 ++----- libsrc/cbm/open.s | 70 +++++++++++++++++--------------------- libsrc/common/Makefile | 1 - libsrc/common/chdir.s | 4 +-- libsrc/common/errno.s | 40 ++++++++++++++++++++-- libsrc/common/mkdir.s | 4 +-- libsrc/common/oserrcheck.s | 30 ---------------- libsrc/common/remove.s | 4 +-- libsrc/common/rename.s | 4 +-- libsrc/common/rmdir.s | 4 +-- libsrc/common/uname.s | 4 +-- 13 files changed, 123 insertions(+), 107 deletions(-) delete mode 100644 libsrc/common/oserrcheck.s diff --git a/asminc/errno.inc b/asminc/errno.inc index 463e7907b..733671973 100644 --- a/asminc/errno.inc +++ b/asminc/errno.inc @@ -1,4 +1,4 @@ -; +; ; Ullrich von Bassewitz, 16.05.2000 ; @@ -7,7 +7,7 @@ .global __errno, __oserror .global __osmaperrno .global __seterrno - .global oserrcheck + .global __directerrno, __mappederrno ; Error codes, must match the values in the C headers .enum diff --git a/include/errno.h b/include/errno.h index c0e786623..60f069dac 100644 --- a/include/errno.h +++ b/include/errno.h @@ -38,23 +38,20 @@ -/* Operating system specific error codes */ -extern unsigned char _oserror; +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ -/* The following functions maps an operating system specific error code (for - * example from _oserror) into one of the E... codes below. It is user - * callable. - */ -int __fastcall__ _osmaperrno (unsigned char oserror); -/* Set errno to a specific error code and return zero. Used by the library */ -unsigned char __fastcall__ _seterrno (unsigned char code); -/* System error codes go here */ +/* Operating system specific error code */ +extern unsigned char _oserror; + extern int _errno; +/* System errors go here */ -/* errno must be a macro */ #define errno _errno +/* errno must be a macro */ @@ -79,6 +76,35 @@ extern int _errno; +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +int __fastcall__ _osmaperrno (unsigned char oserror); +/* Map an operating system specific error code (for example from _oserror) + * into one of the E... codes above. It is user callable. + */ + +unsigned char __fastcall__ _seterrno (unsigned char code); +/* Set errno to a specific error code and return zero. Used by the library */ + +int __fastcall__ _directerrno (unsigned char code); +/* Set errno to a specific error code, clear _oserror and return -1. Used + * by the library. + */ + +int __fastcall__ _mappederrno (unsigned char code); +/* Set _oserror to the given platform specific error code. If it is a real + * error code (not zero) set errno to the corresponding system error code + * and return -1. Otherwise return zero. + * Used by the library. + */ + + + +/* End of errno.h */ #endif diff --git a/libsrc/cbm/close.s b/libsrc/cbm/close.s index 48a14e2ad..00dee8998 100644 --- a/libsrc/cbm/close.s +++ b/libsrc/cbm/close.s @@ -17,7 +17,7 @@ ;-------------------------------------------------------------------------- ; _close - + .proc _close ; Check if we have a valid handle @@ -55,20 +55,13 @@ ldx unittab,y jsr closecmdchannel ; Close the disk command channel pla ; Get the error code from the disk - jmp oserrcheck ; Set _oserror and _errno, returns 0/-1 + jmp __mappederrno ; Set _oserror and _errno, returns 0/-1 ; Error entry: The given file descriptor is not valid or not open invalidfd: lda #EBADF - -; Error entry. Sets _errno, clears _oserror, returns -1 - -error: jsr __seterrno ; Returns 0 in A - sta __oserror - lda #$FF - tax ; Return -1 - rts + jmp __directerrno ; Sets _errno, clears _oserror, returns -1 .endproc diff --git a/libsrc/cbm/open.s b/libsrc/cbm/open.s index 8678d3582..0d167a844 100644 --- a/libsrc/cbm/open.s +++ b/libsrc/cbm/open.s @@ -15,7 +15,6 @@ .import addysp, popax .import scratch, fnparse, fnaddmode, fncomplete, fnset .import opencmdchannel, closecmdchannel, readdiskerror - .import __oserror .import fnunit .import _close .importzp sp, tmp2, tmp3 @@ -76,12 +75,13 @@ parmok: jsr popax ; Get flags jsr popax ; Get name jsr fnparse ; Parse it cmp #0 - bne error ; Bail out if problem with name + bne oserror ; Bail out if problem with name ; Get a free file handle and remember it in tmp2 jsr freefd - bcs nofile + lda #EMFILE ; Load error code + bcs seterrno ; Jump in case of errors stx tmp2 ; Check the flags. We cannot have both, read and write flags set, and we cannot @@ -92,10 +92,36 @@ parmok: jsr popax ; Get flags cmp #O_RDONLY ; Open for reading? beq doread ; Yes: Branch cmp #(O_WRONLY | O_CREAT) ; Open for writing? - bne invflags ; No: Invalid open mode + beq flagsok + +; Invalid open mode + + lda #EINVAL + +; Error entry. Sets _errno, clears _oserror, returns -1 + +seterrno: + jmp __directerrno + +; Error entry: Close the file and exit. OS error code is in A on entry + +closeandexit: + pha + lda tmp2 + clc + adc #LFN_OFFS + jsr CLOSE + ldx fnunit + jsr closecmdchannel + pla + +; Error entry: Set oserror and errno using error code in A and return -1 + +oserror:jmp __mappederrno ; If O_TRUNC is set, scratch the file, but ignore any errors +flagsok: lda tmp3 and #O_TRUNC beq notrunc @@ -136,7 +162,7 @@ common: sta tmp3 jsr SETLFS ; Set the file params jsr OPEN - bcs error + bcs oserror ; Open the the drive command channel and read it @@ -159,41 +185,9 @@ common: sta tmp3 txa ; Handle ldx #0 + stx __oserror ; Clear _oserror rts -; Error entry: No more file handles - -nofile: lda #1 ; Too many open files - -; Error entry. Error code is in A. - -error: sta __oserror -errout: lda #$FF - tax ; Return -1 - rts - -; Error entry: Invalid flag parameter - -invflags: - lda #EINVAL - sta __errno - lda #0 - sta __errno+1 - beq errout - -; Error entry: Close the file and exit - -closeandexit: - pha - lda tmp2 - clc - adc #LFN_OFFS - jsr CLOSE - ldx fnunit - jsr closecmdchannel - pla - bne error ; Branch always - .endproc diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index 54454bb80..b779cf97f 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -146,7 +146,6 @@ S_OBJS = _cwd.o \ mkdir.o \ modfree.o \ modload.o \ - oserrcheck.o \ printf.o \ putchar.o \ putenv.o \ diff --git a/libsrc/common/chdir.s b/libsrc/common/chdir.s index 0d2c6952a..3e638cb04 100644 --- a/libsrc/common/chdir.s +++ b/libsrc/common/chdir.s @@ -7,7 +7,7 @@ .export _chdir .import __syschdir - .import oserrcheck + .import __mappederrno ;-------------------------------------------------------------------------- @@ -17,7 +17,7 @@ .proc _chdir jsr __syschdir ; Call the machine specific function - jmp oserrcheck ; Store into _oserror, set errno, return 0/-1 + jmp __mappederrno ; Store into _oserror, set errno, return 0/-1 .endproc diff --git a/libsrc/common/errno.s b/libsrc/common/errno.s index a07b60c0a..2ab1ad86b 100644 --- a/libsrc/common/errno.s +++ b/libsrc/common/errno.s @@ -1,11 +1,45 @@ ; -; Ullrich von Bassewitz, 06.06.1998 +; Ullrich von Bassewitz, 2003-08-12 ; -; int _errno; +; Helper functions for several high level file functions. ; - .export __errno + .include "errno.inc" + +.code + +; ---------------------------------------------------------------------------- +; int __fastcall__ _directerrno (unsigned char code); +; /* Set errno to a specific error code, clear _oserror and return -1. Used +; * by the library. +; */ + +__directerrno: + jsr __seterrno ; Set errno, returns with A = 0 + sta __oserror ; Clear __oserror + beq fail ; Branch always + +; ---------------------------------------------------------------------------- +; int __fastcall__ _mappederrno (unsigned char code); +; /* Set _oserror to the given platform specific error code. If it is a real +; * error code (not zero) set errno to the corresponding system error code +; * and return -1. Otherwise return zero. +; * Used by the library. +; */ + +__mappederrno: + sta __oserror ; Store the error code + tax ; Did we have an error? + beq ok ; Branch if no + jsr __osmaperrno ; Map os error into errno code + jsr __seterrno ; Save in errno +fail: lda #$FF ; Return -1 + tax +ok: rts + + +; ---------------------------------------------------------------------------- .bss __errno: diff --git a/libsrc/common/mkdir.s b/libsrc/common/mkdir.s index c65f6d197..55a98f058 100644 --- a/libsrc/common/mkdir.s +++ b/libsrc/common/mkdir.s @@ -7,7 +7,7 @@ .export _mkdir .import __sysmkdir - .import oserrcheck + .import __mappederrno ;-------------------------------------------------------------------------- @@ -15,6 +15,6 @@ .proc _mkdir jsr __sysmkdir ; Call the machine specific function - jmp oserrcheck ; Store into _oserror, set errno, return 0/-1 + jmp __mappederrno ; Store into _oserror, set errno, return 0/-1 .endproc diff --git a/libsrc/common/oserrcheck.s b/libsrc/common/oserrcheck.s deleted file mode 100644 index b5887e924..000000000 --- a/libsrc/common/oserrcheck.s +++ /dev/null @@ -1,30 +0,0 @@ -; -; Ullrich von Bassewitz, 2003-08-12 -; -; Helper function for several high level file functions. -; -; The function will store the value in A into _oserror. If the value is not -; zero, it is translated into a standard error number which is then stored -; into errno, and -1 is returned in a/x. If the value in A was zero, errno -; is not changed, and zero is returned in a/x. -; - - .export oserrcheck - - .include "errno.inc" - -.proc oserrcheck - - sta __oserror ; Store the error code - tax ; Did we have an error? - beq ok ; Branch if no - jsr __osmaperrno ; Map os error into errno code - jsr __seterrno ; Save in errno - lda #$FF ; Return -1 - tax -ok: rts - -.endproc - - - diff --git a/libsrc/common/remove.s b/libsrc/common/remove.s index 3dba11467..e66f047ef 100644 --- a/libsrc/common/remove.s +++ b/libsrc/common/remove.s @@ -7,7 +7,7 @@ .export _remove .import __sysremove - .import oserrcheck + .import __mappederrno ;-------------------------------------------------------------------------- @@ -15,7 +15,7 @@ .proc _remove jsr __sysremove ; Call the machine specific function - jmp oserrcheck ; Store into _oserror, set errno, return 0/-1 + jmp __mappederrno ; Store into _oserror, set errno, return 0/-1 .endproc diff --git a/libsrc/common/rename.s b/libsrc/common/rename.s index 8ef03fe8c..0fbffa426 100644 --- a/libsrc/common/rename.s +++ b/libsrc/common/rename.s @@ -7,7 +7,7 @@ .export _rename .import __sysrename - .import oserrcheck + .import __mappederrno ;-------------------------------------------------------------------------- @@ -15,7 +15,7 @@ .proc _rename jsr __sysrename ; Call the machine specific function - jmp oserrcheck ; Store into _oserror, set errno, return 0/-1 + jmp __mappederrno ; Store into _oserror, set errno, return 0/-1 .endproc diff --git a/libsrc/common/rmdir.s b/libsrc/common/rmdir.s index 100f1a3fb..84ae9a54c 100644 --- a/libsrc/common/rmdir.s +++ b/libsrc/common/rmdir.s @@ -7,7 +7,7 @@ .export _rmdir .import __sysrmdir - .import oserrcheck + .import __mappederrno ;-------------------------------------------------------------------------- @@ -15,6 +15,6 @@ .proc _rmdir jsr __sysrmdir ; Call the machine specific function - jmp oserrcheck ; Store into _oserror, set errno, return 0/-1 + jmp __mappederrno ; Store into _oserror, set errno, return 0/-1 .endproc diff --git a/libsrc/common/uname.s b/libsrc/common/uname.s index d6fb484dd..3c1b0840f 100644 --- a/libsrc/common/uname.s +++ b/libsrc/common/uname.s @@ -7,7 +7,7 @@ .export _uname .import __sysuname - .import oserrcheck + .import __mappederrno ;-------------------------------------------------------------------------- @@ -15,7 +15,7 @@ .proc _uname jsr __sysuname ; Call the machine specific function - jmp oserrcheck ; Store into _oserror, set errno, return 0/-1 + jmp __mappederrno ; Store into _oserror, set errno, return 0/-1 .endproc -- 2.39.5