--- /dev/null
+/*
+ * _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
+
+
+
--- /dev/null
+/*
+ * sscanf.c
+ *
+ * (C) Copyright 2001 Ullrich von Bassewitz (uz@cc65.org)
+ *
+ */
+
+
+
+#include <stdio.h>
+#include <string.h>
+#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);
+}
+
+
+