mescc: Tinycc support: vsnprintf.
authorJan Nieuwenhuizen <janneke@gnu.org>
Tue, 1 Aug 2017 11:24:23 +0000 (13:24 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Tue, 1 Aug 2017 11:24:23 +0000 (13:24 +0200)
* module/language/c99/compiler.mes (ast-type->type): Support *p++ in test.
* mlibc/libc-mes+tcc.c (vsnprintf): Implement.

mlibc/libc-mes+tcc.c
module/language/c99/compiler.mes

index e075768f947bbec9609e805b53f96f7df646a289..24657e966bcd0b0ba51575895157c56c1eb107ae 100644 (file)
@@ -335,8 +335,27 @@ time_t time (time_t *tloc)
 int
 vsnprintf (char *str, size_t size, char const *format, va_list ap)
 {
-  eputs ("vsnprintf stub\n");
-  return 0;
+  char const *p = format;
+  while (*p)
+    if (*p != '%')
+      *str++ = *p++;
+    else
+      {
+        p++;
+        char c = *p;
+        switch (c)
+          {
+          case '%': {*str++ = *p; break;}
+          case 'c': {char c; c = va_arg (ap, char); *str++=c; break;}
+          case 'd': {int d; d = va_arg (ap, int); strcpy (str, itoa (d)); break;}
+          case 's': {char *s; s = va_arg (ap, char *); strcpy (str, s); break;}
+          default: {*str++ = *p; break;}
+          }
+        p++;
+      }
+  va_end (ap);
+  *str = 0;
+  return strlen (str);
 }
 
 void *
index 36cd72cd59b015fcd6b4fb3237cb5fdf189ca28c..1d14824b46296677a58002da7b2f409d598a3a4e 100644 (file)
 (define (ast-type->type info o)
   (pmatch o
     ((p-expr ,expr) (ast-type->type info (p-expr->type info o)))
+    ((pre-inc ,expr) (ast-type->type info expr))
+    ((post-inc ,expr) (ast-type->type info expr))
     ((decl-spec-list ,type-spec)
      (ast-type->type info type-spec))
     ((decl-spec-list (type-qual ,qual) (type-spec (fixed-type ,type)))