]> git.sur5r.net Git - cc65/commitdiff
Replace sscanf by an assembler version
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 28 Nov 2004 18:23:16 +0000 (18:23 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 28 Nov 2004 18:23:16 +0000 (18:23 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3314 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/common/.cvsignore
libsrc/common/Makefile
libsrc/common/sscanf.c [deleted file]
libsrc/common/sscanf.s [new file with mode: 0644]

index 5e71fc4a5267913c03d98401b1a03ad245ac6394..79e0c359a32e89cb072e54131ac3543cb3ced5e7 100644 (file)
@@ -30,7 +30,6 @@ realloc.s
 rewind.s
 scanf.s
 sleep.s
-sscanf.s
 strftime.s
 strtok.s
 strxfrm.s
index 86cdd7af5c2a6d6d0219bb58d87fe3093a75132f..3dcc7ccf8689c06787384db4ebbfca0a2a57027e 100644 (file)
@@ -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 (file)
index 1a7cd20..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * sscanf.c
- *
- * (C) Copyright 2001-2002 Ullrich von Bassewitz (uz@cc65.org)
- *
- */
-
-
-
-#include <stdio.h>
-
-
-
-/*****************************************************************************/
-/*                                          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 (file)
index 0000000..025e317
--- /dev/null
@@ -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
+