mescc: m4 support: WIP
[mes.git] / lib / libc+tcc.c
index db9eff9ad2d2051455355fe80e4385e9ef538571..e9b77cbdfb526f983041dd32e59ddc9a31b69682 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * Mes --- Maxwell Equations of Software
- * Copyright © 2017 Jan Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
  *
  * This file is part of Mes.
  *
@@ -76,13 +76,6 @@ fflush (FILE *stream)
   return 0;
 }
 
-FILE *
-fopen (char const *pathname, char const *mode)
-{
-  eputs ("fopen stub\n");
-  return 0;
-}
-
 int
 fprintf (FILE *stream, char const *format, ...)
 {
@@ -94,10 +87,15 @@ fprintf (FILE *stream, char const *format, ...)
 }
 
 size_t
-fread (void *ptr, size_t size, size_t nmemb, FILE *stream)
+fread (void *data, size_t size, size_t count, FILE *stream)
 {
-  eputs ("fread stub\n");
-  return 0;
+  if (! size || !count)
+    return 0;
+  int bytes = read ((int)stream, data, size * count);
+  if (bytes > 0)
+    return bytes/size;
+
+  return bytes;
 }
 
 int
@@ -114,16 +112,16 @@ ftell (FILE *stream)
   return 0;
 }
 
-size_t
-fwrite (void const *ptr, size_t size, size_t nmemb, FILE *stream)
+int
+gettimeofday (struct timeval *tv, struct timezone *tz)
 {
-  int fd = (int)stream;
-  return write (fd, ptr, size * nmemb);
+  return 0;
 }
 
-int
-gettimeofday (struct timeval *tv, struct timezone *tz)
+double
+ldexp (double x, int exp)
 {
+  eputs ("ldexp stub\n");
   return 0;
 }
 
@@ -170,9 +168,41 @@ mprotect (void *addr, size_t len, int prot)
 }
 
 void
-qsort (void *base, size_t nmemb, size_t size, int (*compar)(void const *, void const *))
+qswap (void *a, void *b, size_t size)
+{
+  char *buf[8];
+  memcpy (buf, a, size);
+  memcpy (a, b, size);
+  memcpy (b, buf, size);
+}
+
+size_t
+qpart (void *base, size_t count, size_t size, int (*compare)(void const *, void const *))
+{
+  void* p = base + count*size;
+  size_t i = 0;
+  for (size_t j = 0; j < count; j++)
+    {
+      if (compare (base+j*size, p) < 0)
+        {
+          qswap (base+i*size, base+j*size, size);
+          i++;
+        }
+    }
+  if (compare (base+count*size, base+i*size) < 0)
+    qswap (base+i*size, base+count*size, size);
+  return i;
+}
+
+void
+qsort (void *base, size_t count, size_t size, int (*compare)(void const *, void const *))
 {
-  eputs ("qsort stub\n");
+  if (count > 1)
+    {
+      int p = qpart (base, count-1, size, compare);
+      qsort (base, p, size, compare);
+      qsort (base+p*size, count-p, size, compare);
+    }
 }
 
 int
@@ -232,6 +262,19 @@ strchr (char const *s, int c)
   return 0;
 }
 
+char *
+strncpy (char *dest, char const *src, size_t length)
+{
+  char *p = dest;
+  while (*src && length--)
+    *p++ = *src++;
+  if (*src)
+    length++;
+  while (length--)
+    *p++ = 0;
+  return dest;
+}
+
 char *
 strrchr (char const *s, int c)
 {
@@ -253,6 +296,24 @@ strstr (char const *haystack, char const *needle)
   return 0;
 }
 
+double
+strtod (char const *nptr, char **endptr)
+{
+  eputs ("strtoul stub\n");
+}
+
+float
+strtof (char const *nptr, char **endptr)
+{
+  return strtod (nptr, endptr);
+}
+
+long double
+strtold (char const *nptr, char **endptr)
+{
+  return strtod (nptr, endptr);
+}
+
 long
 strtol (char const *nptr, char **endptr, int base)
 {