diff --git a/libsrc/common/.cvsignore b/libsrc/common/.cvsignore index e96db4c09..d8d6186b3 100644 --- a/libsrc/common/.cvsignore +++ b/libsrc/common/.cvsignore @@ -37,7 +37,6 @@ strtok.s strxfrm.s system.s timezone.s -vfscanf.s vscanf.s vsscanf.s diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index f9eea8104..43b56ba1c 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -67,7 +67,6 @@ C_OBJS = _afailed.o \ strtok.o \ system.o \ timezone.o \ - vfscanf.o \ vscanf.o \ vsscanf.o @@ -169,6 +168,7 @@ S_OBJS = _cwd.o \ unlink.o \ utscopy.o \ vfprintf.o \ + vfscanf.o \ vprintf.o \ vsprintf.o \ zerobss.o diff --git a/libsrc/common/_scanf.inc b/libsrc/common/_scanf.inc index 48ae5b08a..91be888a6 100644 --- a/libsrc/common/_scanf.inc +++ b/libsrc/common/_scanf.inc @@ -14,7 +14,7 @@ ;---------------------------------------------------------------------------- ; Global data -.global _scanf +.global __scanf diff --git a/libsrc/common/vfscanf.c b/libsrc/common/vfscanf.c deleted file mode 100644 index 0f62113f7..000000000 --- a/libsrc/common/vfscanf.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * vfscanf.c - * - * Ullrich von Bassewitz (uz@cc65.org), 2004-11-26 - * - */ - - - -#include -#include "_scanf.h" - - - -/*****************************************************************************/ -/* Code */ -/*****************************************************************************/ - - - -int __fastcall__ vfscanf (FILE* f, const char* format, va_list ap) -/* Standard C function */ -{ - struct scanfdata d; - - /* Initialize the data struct. We do only need the given file as user data, - * since the get and ungetc are crafted so they match the standard fgetc - * and ungetc functions. - */ - d.get = (getfunc) fgetc, - d.unget = (ungetfunc) ungetc, - d.data = f; - - /* Call the internal function and return the result */ - return _scanf (&d, format, ap); -} - - - diff --git a/libsrc/common/vfscanf.s b/libsrc/common/vfscanf.s new file mode 100644 index 000000000..057a62cc3 --- /dev/null +++ b/libsrc/common/vfscanf.s @@ -0,0 +1,70 @@ +; +; int __fastcall__ vfscanf (FILE* f, const char* format, va_list ap); +; +; Ullrich von Bassewitz, 2004-11-27 +; + + .export _vfscanf + .import _fgetc, _ungetc + + .include "zeropage.inc" + .include "_scanf.inc" + + +; ---------------------------------------------------------------------------- +; Static scanfdata structure for the _vfscanf routine +; + +.data +d: .addr _fgetc ; GET + .addr _ungetc ; UNGET + .addr 0 ; data + + +; ---------------------------------------------------------------------------- +; int __fastcall__ vfscanf (FILE* f, const char* format, va_list ap) +; /* Standard C function */ +; { +; struct scanfdata d; +; +; /* Initialize the data struct. We do only need the given file as user data, +; * since the get and ungetc are crafted so they match the standard fgetc +; * and ungetc functions. +; */ +; d.get = (getfunc) fgetc, +; d.unget = (ungetfunc) ungetc, +; d.data = f; +; +; /* Call the internal function and return the result */ +; return _scanf (&d, format, ap); +; } +; +; Since _scanf has the same parameter stack as vfscanf, with f replaced by &d, +; we will do exactly that. _scanf will then clean up the stack, so we can jump +; directly there, no need to return. +; Beware: Since ap is a fastcall parameter, we must not destroy a/x. +; + +.code +_vfscanf: + pha ; Save low byte of ap + +; Swap f against &d on the stack, placing f into d.data + + ldy #2 ; Offset of f on the stack + lda (sp),y + sta d + SCANFDATA::DATA + lda #d + sta (sp),y + +; Restore the low byte of ap and jump to the _scanf function + + pla + jmp __scanf +