]> pd.if.org Git - pdclib/blobdiff - functions/stdio/fscanf.c
Merged PDPCLIB and Therx code.
[pdclib] / functions / stdio / fscanf.c
index 11708417d1c472b560161a91171a391fd51b581a..2be1758375c1abb015c50de9360586c555da7b85 100644 (file)
@@ -6,3 +6,80 @@
 // ----------------------------------------------------------------------------
 
 int fscanf( FILE * restrict stream, const char * restrict format, ... ) { /* TODO */ };
+
+/* PDPC code - unreviewed
+{
+    va_list arg;
+    int ret;
+
+    va_start(arg, format);
+    ret = vvscanf(format, arg, stream, NULL);
+    va_end(arg);
+    return (ret);
+}
+
+static int vvscanf(const char *format, va_list arg, FILE *fp, const char *s)
+{
+    int ch;
+    int fin = 0;
+    int cnt = 0;
+    char *cptr;
+    int *iptr;
+
+    inch();
+    while (!fin)
+    {
+        if (*format == '\0')
+        {
+            fin = 1;
+        }
+        else if (*format == '%')
+        {
+            format++;
+            if (*format == '%')
+            {
+                if (ch != '%') return (cnt);
+                inch();
+            }
+            else if (*format == 's')
+            {
+                cptr = va_arg(arg, char *);
+                *cptr++ = (char)ch;
+                inch();
+                while ((ch >= 0) && (!isspace(ch)))
+                {
+                    *cptr++ = (char)ch;
+                    inch();
+                }
+                *cptr = '\0';
+                if (ch < 0)
+                {
+                    fin = 1;
+                }
+            }
+            else if (*format == 'd')
+            {
+                iptr = va_arg(arg, int *);
+                if (!isdigit(ch)) return (cnt);
+                *iptr = ch - '0';
+                inch();
+                while ((ch >= 0) && (isdigit(ch)))
+                {
+                    *iptr = *iptr * 10 + (ch - '0');
+                    inch();
+                }
+                if (ch < 0)
+                {
+                    fin = 1;
+                }
+            }
+        }
+        else
+        {
+            if (ch != *format) return (cnt);
+            inch();
+        }
+    }
+    return (cnt);
+}
+*/