From 501cc4c6c866ae86475103643c63d3fa984f82ae Mon Sep 17 00:00:00 2001 From: cuz Date: Sun, 28 Nov 2004 18:23:16 +0000 Subject: [PATCH] Replace sscanf by an assembler version git-svn-id: svn://svn.cc65.org/cc65/trunk@3314 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/common/.cvsignore | 1 - libsrc/common/Makefile | 2 +- libsrc/common/sscanf.c | 35 ----------------- libsrc/common/sscanf.s | 82 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 37 deletions(-) delete mode 100644 libsrc/common/sscanf.c create mode 100644 libsrc/common/sscanf.s diff --git a/libsrc/common/.cvsignore b/libsrc/common/.cvsignore index 5e71fc4a5..79e0c359a 100644 --- a/libsrc/common/.cvsignore +++ b/libsrc/common/.cvsignore @@ -30,7 +30,6 @@ realloc.s rewind.s scanf.s sleep.s -sscanf.s strftime.s strtok.s strxfrm.s diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index 86cdd7af5..3dcc7ccf8 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -60,7 +60,6 @@ C_OBJS = _afailed.o \ rewind.o \ scanf.o \ sleep.o \ - sscanf.o \ strftime.o \ strxfrm.o \ strtok.o \ @@ -139,6 +138,7 @@ S_OBJS = _cwd.o \ signal.o \ sigtable.o \ sprintf.o \ + sscanf.o \ strcat.o \ strchr.o \ strcmp.o \ diff --git a/libsrc/common/sscanf.c b/libsrc/common/sscanf.c deleted file mode 100644 index 1a7cd20fc..000000000 --- a/libsrc/common/sscanf.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * sscanf.c - * - * (C) Copyright 2001-2002 Ullrich von Bassewitz (uz@cc65.org) - * - */ - - - -#include - - - -/*****************************************************************************/ -/* Code */ -/*****************************************************************************/ - - - -int sscanf (const char* str, const char* format, ...) -/* Standard C function */ -{ - va_list ap; - - /* Setup for variable arguments */ - va_start (ap, format); - - /* Call vsscanf(). Since we know that va_end won't do anything, we will - * save the call and return the value directly. - */ - return vsscanf (str, format, ap); -} - - - diff --git a/libsrc/common/sscanf.s b/libsrc/common/sscanf.s new file mode 100644 index 000000000..025e317a6 --- /dev/null +++ b/libsrc/common/sscanf.s @@ -0,0 +1,82 @@ +; +; int sscanf (const char* str, const char* format, ...); +; +; Ullrich von Bassewitz, 2004-11-28 +; + + .export _sscanf + .import addysp, decsp4, _vsscanf + .importzp sp, ptr1 + + .macpack generic + +; ---------------------------------------------------------------------------- +; Data + +.bss + +ParamSize: .res 1 ; Number of parameter bytes + +; ---------------------------------------------------------------------------- +; Code +; int sscanf (const char* str, const char* format, ...) +; /* Standard C function */ +; { +; va_list ap; +; +; /* Setup for variable arguments */ +; va_start (ap, format); +; +; /* Call vsscanf(). Since we know that va_end won't do anything, we will +; * save the call and return the value directly. +; */ +; return vsscanf (str, format, ap); +; } +; + +.code + +_sscanf: + sty ParamSize ; Number of param bytes passed in Y + +; We have to push buf and format, both in the order they already have on stack. +; To make this somewhat more efficient, we will create space on the stack and +; then do a copy of the complete block instead of pushing each parameter +; separately. Since the size of the arguments passed is the same as the size +; of the fixed arguments, this will allow us to calculate the pointer to the +; fixed size arguments easier (they're just ParamSize bytes away). + + jsr decsp4 + +; Calculate a pointer to the fixed parameters + + lda ParamSize + add sp + sta ptr1 + ldx sp+1 + bcc @L1 + inx +@L1: stx ptr1+1 + +; Now copy both, str and format + + ldy #4-1 +@L2: lda (ptr1),y + sta (sp),y + dey + bpl @L2 + +; Load va_list (last and __fastcall__ parameter to vsscanf) + + lda ptr1 + ldx ptr1+1 + +; Call vsscanf + + jsr _vsscanf + +; Cleanup the stack. We will return what we got from vsscanf + + ldy ParamSize + jmp addysp +