mescc: Implement fflush, sscanf, vsscanf.
authorJan Nieuwenhuizen <janneke@gnu.org>
Wed, 30 May 2018 19:49:40 +0000 (21:49 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 30 May 2018 19:49:40 +0000 (21:49 +0200)
* lib/libc+tcc.c (vsscanf): New function.
  (sscanf): Use it.
  (fflush): Remove stub notice; we have no buffering.
* include/stdarg.h: Declare it.
* scaffold/tests/87-sscanf.c: Test it.
* build-aux/check-mescc.sh (tests): Run it.

build-aux/check-mescc.sh
include/stdarg.h
lib/libc+tcc.c
scaffold/tests/87-sscanf.c [new file with mode: 0644]

index ea4002ed8b8851d2ad259fa6fff17607dfc62135..84d8f18d02dde3bc39f30e1cf0e83356789ee00f 100755 (executable)
@@ -133,6 +133,7 @@ t
 84-struct-field-list
 85-sizeof
 86-strncpy
+87-sscanf
 "
 
 broken="$broken
index 5d7b7eea1cfacc3751e3b2ea2e6b1c5d51ddfee7..6675bced32d2458d4bdbbbfe9429db668b547c08 100644 (file)
@@ -46,6 +46,7 @@ typedef int va_list;
 int vprintf (char const* format, va_list ap);
 int vsprintf (char *str, char const *format, va_list ap);
 int vsnprintf (char *str, size_t size, char const *format, va_list ap);
+int vsscanf (char const *s, char const *template, va_list ap);
 
 #endif // ! (__GNUC__ && POSIX)
 
index 1152e72648a30c41c7ca9c4ca88b71a0bdd66540..cd94d5c091302b8285d7fad74a54cbaf969ade07 100644 (file)
@@ -90,7 +90,6 @@ ferror (FILE *stream)
 int
 fflush (FILE *stream)
 {
-  eputs ("fflush stub\n");
   return 0;
 }
 
@@ -254,9 +253,13 @@ snprintf(char *str,  size_t size,  char const *format, ...)
 }
 
 int
-sscanf (char const *str, const char *format, ...)
+sscanf (char const *str, const char *template, ...)
 {
-  eputs ("sscanf stub\n");
+  va_list ap;
+  va_start (ap, template);
+  int r = vsscanf (str, template, ap);
+  va_end (ap);
+  return r;
   return 0;
 }
 
@@ -449,3 +452,38 @@ vfprintf (FILE* f, char const* format, va_list ap)
   va_end (ap);
   return 0;
 }
+
+int
+vsscanf (char const *s, char const *template, va_list ap)
+{
+  char const *p = s;
+  char const *t = template;
+  while (*t && *p)
+    if (*t != '%')
+      {
+        t++;
+        p++;
+      }
+    else
+      {
+        t++;
+        char c = *t;
+        switch (c)
+          {
+          case '%': {p++; break;}
+          case 'c': {char *c = va_arg (ap, char*); *c = *p++; break;}
+          case 'd': {int *d = va_arg (ap, int*); *d = abtoi (&p, 10); break;}
+          default:
+            {
+              eputs ("vsscanf: not supported: %");
+              eputc (c);
+              eputs ("\n");
+              t++;
+              p++;
+            }
+          }
+        t++;
+      }
+  va_end (ap);
+  return 0;
+}
diff --git a/scaffold/tests/87-sscanf.c b/scaffold/tests/87-sscanf.c
new file mode 100644 (file)
index 0000000..adfde72
--- /dev/null
@@ -0,0 +1,42 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "30-test.i"
+#include <stdio.h>
+
+int
+test ()
+{
+  int i;
+  int r = sscanf ("42", "%d", &i);
+  if (r)
+    return 1;
+  if (i != 42)
+    return 2;
+
+  char c;
+  r = sscanf ("foo bar", "foo%cbar", &c);
+  if (r)
+    return 3;
+  if (c != ' ')
+    return 4;
+
+  return 0;
+}