diff --git a/libsrc/common/.cvsignore b/libsrc/common/.cvsignore index 789eb14f2..ec614502a 100644 --- a/libsrc/common/.cvsignore +++ b/libsrc/common/.cvsignore @@ -1,4 +1,4 @@ -*.lst +*.lst _afailed.s _fopen.s _hextab.s @@ -29,6 +29,7 @@ puts.s qsort.s realloc.s rewind.s +sscanf.s strtok.s strxfrm.s vprintf.s diff --git a/libsrc/common/_scanf.h b/libsrc/common/_scanf.h new file mode 100644 index 000000000..6634c75e7 --- /dev/null +++ b/libsrc/common/_scanf.h @@ -0,0 +1,46 @@ +/* + * _scanf.h + * + * (C) Copyright 2001 Ullrich von Bassewitz (uz@cc65.org) + * + */ + + + +#ifndef __SCANF_H +#define __SCANF_H + + + +/* Forward */ +struct indesc; + +/* Type of the function that is called to input data */ +typedef void (*infunc) (struct indesc* desc, const char* buf, unsigned count); + + + +/* Control structure passed to the low level worker function. + * Beware: The low level functions will access the structure on the assembly + * level, so check this when altering the structure. + */ +struct indesc { + char* buf; /* Pointer to input buffer */ + unsigned size; /* Size of input buffer */ + unsigned fill; /* Fill mark of input buffer */ + unsigned ridx; /* Read index of input buffer */ + infunc fin; /* Pointer to input routine */ +}; + + + +/* Internal scanning routine */ +int _scanf (struct indesc* d, const char* format, va_list ap); + + + +/* End of _scanf.h */ +#endif + + + diff --git a/libsrc/common/sscanf.c b/libsrc/common/sscanf.c new file mode 100644 index 000000000..dd10eb067 --- /dev/null +++ b/libsrc/common/sscanf.c @@ -0,0 +1,44 @@ +/* + * sscanf.c + * + * (C) Copyright 2001 Ullrich von Bassewitz (uz@cc65.org) + * + */ + + + +#include +#include +#include "_scanf.h" + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +int sscanf (const char* str, const char* format, ...) +/* Standard C function */ +{ + struct indesc id; + va_list ap; + + /* Initialize the indesc struct. We leave all fields uninitialized that we + * don't need + */ + id.buf = (char*) str; + id.fill = strlen (str); + + /* Setup for variable arguments */ + va_start (ap, format); + + /* Call the internal function. Since we know that va_end won't do anything, + * we will save the call and return the value directly. + */ + return _scanf (&id, (const char*) va_fix (ap, 2), ap); +} + + +