mescc: Tinycc support: snprintf.
[mes.git] / mlibc / libc-gcc.c
index 6d7c6da41e7955f18f21a9b6903f4858ae5ddec4..2a636e8aef01e812e8d47a765ff8a1058e8af4e5 100644 (file)
@@ -174,37 +174,51 @@ fputc (int c, int fd)
   return 0;
 }
 
-int
-putchar (int c)
+void
+free (void *ptr)
 {
-  write (STDOUT, (char*)&c, 1);
-  return 0;
 }
 
-void *g_malloc_base = 0;
+char *g_brk = 0;
 
 void *
 malloc (size_t size)
 {
-  void *p = brk (0);
-  if (!g_malloc_base) g_malloc_base = p;
-  brk (p+size);
+  if (!g_brk)
+    g_brk = brk (0);
+  if ((int)brk (g_brk + size) == -1)
+    return 0;
+  char *p = g_brk;
+  g_brk += size;
   return p;
 }
 
 void *
-realloc (void *p, size_t size)
+memcpy (void *dest, void const *src, size_t n)
 {
-  (void)p;
-  brk (g_malloc_base + size);
-  return g_malloc_base;
+  char* p = dest;
+  char const* q = src;
+  while (n--) *p++ = *q++;
+  return dest;
 }
 
-void
-free (void *p)
+int
+putchar (int c)
 {
-  int *n = (int*)p-1;
-  //munmap ((void*)p, *n);
+  write (STDOUT, (char*)&c, 1);
+  return 0;
+}
+
+void *
+realloc (void *ptr, size_t size)
+{
+  void *new = malloc (size);
+  if (ptr && new)
+    {
+      memcpy (new, ptr, size);
+      free (ptr);
+    }
+  return new;
 }
 
 size_t
@@ -231,14 +245,6 @@ strcpy (char *dest, char const *src)
   return dest;
 }
 
-int
-eputs (char const* s)
-{
-  int i = strlen (s);
-  write (STDERR, s, i);
-  return 0;
-}
-
 int
 fputs (char const* s, int fd)
 {
@@ -383,10 +389,8 @@ printf (char const* format, ...)
 }
 
 int
-sprintf (char *str, char const* format, ...)
+vsprintf (char *str, char const* format, va_list ap)
 {
-  va_list ap;
-  va_start (ap, format);
   char const *p = format;
   while (*p)
     if (*p != '%')
@@ -405,8 +409,19 @@ sprintf (char *str, char const* format, ...)
           }
         p++;
       }
+
+  *str = 0;
+  return strlen (str);
+}
+
+int
+sprintf (char *str, char const* format, ...)
+{
+  va_list ap;
+  va_start (ap, format);
+  int r = vsprintf (str, format, ap);
   va_end (ap);
-  return 0;
+  return r;
 }
 #endif
 
@@ -455,7 +470,17 @@ fdputs (char const* s, int fd)
   return 0;
 }
 
-#if POSIX
+int
+eputc (int c)
+{
+  return fdputc (c, STDERR);
+}
+
+int
+eputs (char const* s)
+{
+  return fdputs (s, STDERR);
+}
 
 int
 fdputc (int c, int fd)
@@ -464,6 +489,8 @@ fdputc (int c, int fd)
   return 0;
 }
 
+#if POSIX
+
 int
 putchar (int c)
 {
@@ -504,6 +531,7 @@ fdungetc (int c, int fd)
 #endif // POSIX
 
 #if __GNUC__ && !POSIX
+
 void
 _start ()
 {
@@ -537,4 +565,5 @@ _start ()
        );
   exit (r);
 }
+
 #endif // __GNUC__ && !POSIX