mescc: Mes C Library: Explode libc+tcc.c.
authorJan Nieuwenhuizen <janneke@gnu.org>
Wed, 22 Aug 2018 05:23:27 +0000 (07:23 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 22 Aug 2018 05:23:27 +0000 (07:23 +0200)
* include/libmes.h: Add declarations.
* include/string.h: Likewise.
* lib/ctype/islower.c: New file, explode from lib/libc+tcc.c.
* lib/ctype/isupper.c: Likewise.
* lib/ctype/tolower.c: Likewise.
* lib/ctype/toupper.c: Likewise.
* lib/mes/search-path.c: Likewise.
* lib/posix/execvp.c: Likewise.
* lib/stdio/fclose.c: Likewise.
* lib/stdio/fdopen.c: Likewise.
* lib/stdio/ferror.c: Likewise.
* lib/stdio/fflush.c: Likewise.
* lib/stdio/fopen.c: Likewise.
* lib/stdio/fprintf.c: Likewise.
* lib/stdio/fread.c: Likewise.
* lib/stdio/fseek.c: Likewise.
* lib/stdio/ftell.c: Likewise.
* lib/stdio/fwrite.c: Likewise.
* lib/stdio/printf.c: Likewise.
* lib/stdio/remove.c: Likewise.
* lib/stdio/snprintf.c: Likewise.
* lib/stdio/sprintf.c: Likewise.
* lib/stdio/sscanf.c: Likewise.
* lib/stdio/vfprintf.c: Likewise.
* lib/stdio/vprintf.c: Likewise.
* lib/stdio/vsnprintf.c: Likewise.
* lib/stdio/vsprintf.c: Likewise.
* lib/stdio/vsscanf.c: Likewise.
* lib/stdlib/calloc.c: Likewise.
* lib/stdlib/qsort.c: Likewise.
* lib/stdlib/strtof.c: Likewise.
* lib/stdlib/strtol.c: Likewise.
* lib/stdlib/strtold.c: Likewise.
* lib/stdlib/strtoll.c: Likewise.
* lib/stdlib/strtoul.c: Likewise.
* lib/stdlib/strtoull.c: Likewise.
* lib/string/memcmp.c: Likewise.
* lib/string/memmem.c: Likewise.
* lib/string/memmove.c: Likewise.
* lib/string/memset.c: Likewise.
* lib/string/strcat.c: Likewise.
* lib/string/strchr.c: Likewise.
* lib/string/strlwr.c: Likewise.
* lib/string/strncpy.c: Likewise.
* lib/string/strrchr.c: Likewise.
* lib/string/strstr.c: Likewise.
* lib/string/strupr.c: Likewise.
* lib/stub/gettimeofday.c: Likewise.
* lib/stub/ldexp.c: Likewise.
* lib/stub/localtime.c: Likewise.
* lib/stub/mprotect.c: Likewise.
* lib/stub/sigaction.c: Likewise.
* lib/stub/sigemptyset.c: Likewise.
* lib/stub/strtod.c: Likewise.
* lib/stub/time.c: Likewise.
* lib/libc+tcc.c: Include explodings.

56 files changed:
include/libmes.h
include/string.h
lib/ctype/islower.c [new file with mode: 0644]
lib/ctype/isupper.c [new file with mode: 0644]
lib/ctype/tolower.c [new file with mode: 0644]
lib/ctype/toupper.c [new file with mode: 0644]
lib/libc+tcc.c
lib/mes/search-path.c [new file with mode: 0644]
lib/posix/execvp.c [new file with mode: 0644]
lib/stdio/fclose.c [new file with mode: 0644]
lib/stdio/fdopen.c [new file with mode: 0644]
lib/stdio/ferror.c [new file with mode: 0644]
lib/stdio/fflush.c [new file with mode: 0644]
lib/stdio/fopen.c [new file with mode: 0644]
lib/stdio/fprintf.c [new file with mode: 0644]
lib/stdio/fread.c [new file with mode: 0644]
lib/stdio/fseek.c [new file with mode: 0644]
lib/stdio/ftell.c [new file with mode: 0644]
lib/stdio/fwrite.c [new file with mode: 0644]
lib/stdio/printf.c [new file with mode: 0644]
lib/stdio/remove.c [new file with mode: 0644]
lib/stdio/snprintf.c [new file with mode: 0644]
lib/stdio/sprintf.c [new file with mode: 0644]
lib/stdio/sscanf.c [new file with mode: 0644]
lib/stdio/vfprintf.c [new file with mode: 0644]
lib/stdio/vprintf.c [new file with mode: 0644]
lib/stdio/vsnprintf.c [new file with mode: 0644]
lib/stdio/vsprintf.c [new file with mode: 0644]
lib/stdio/vsscanf.c [new file with mode: 0644]
lib/stdlib/calloc.c [new file with mode: 0644]
lib/stdlib/qsort.c [new file with mode: 0644]
lib/stdlib/strtof.c [new file with mode: 0644]
lib/stdlib/strtol.c [new file with mode: 0644]
lib/stdlib/strtold.c [new file with mode: 0644]
lib/stdlib/strtoll.c [new file with mode: 0644]
lib/stdlib/strtoul.c [new file with mode: 0644]
lib/stdlib/strtoull.c [new file with mode: 0644]
lib/string/memcmp.c [new file with mode: 0644]
lib/string/memmem.c [new file with mode: 0644]
lib/string/memmove.c [new file with mode: 0644]
lib/string/memset.c [new file with mode: 0644]
lib/string/strcat.c [new file with mode: 0644]
lib/string/strchr.c [new file with mode: 0644]
lib/string/strlwr.c [new file with mode: 0644]
lib/string/strncpy.c [new file with mode: 0644]
lib/string/strrchr.c [new file with mode: 0644]
lib/string/strstr.c [new file with mode: 0644]
lib/string/strupr.c [new file with mode: 0644]
lib/stub/gettimeofday.c [new file with mode: 0644]
lib/stub/ldexp.c [new file with mode: 0644]
lib/stub/localtime.c [new file with mode: 0644]
lib/stub/mprotect.c [new file with mode: 0644]
lib/stub/sigaction.c [new file with mode: 0644]
lib/stub/sigemptyset.c [new file with mode: 0644]
lib/stub/strtod.c [new file with mode: 0644]
lib/stub/time.c [new file with mode: 0644]

index 44548072d73fce0e99cb0ea0abf3c46575c6ab62..faa4be17127be064d87dd086459fac8111d677d1 100644 (file)
@@ -76,5 +76,6 @@ int isspace (int c);
 int isxdigit (int c);
 int oputs (char const* s);
 ssize_t write (int filedes, void const *buffer, size_t size);
+char *search_path (char const *file_name);
 
 #endif //__MES_LIBMES_H
index dea3072bf9de2940cae4e958be59ab4b62aa5355..bf34011d0d6a50c4cd08160332542e43feba63b7 100644 (file)
@@ -62,6 +62,9 @@ int strncasecmp (char const *s1, char const *s2, size_t size);
 int strncmp (char const*, char const*, size_t);
 char *strrchr (char const *s, int c);
 char *strstr (char const *haystack, char const *needle);
+char * strlwr (char *string);
+char * strupr (char *string);
+
 
 char *strerror (int errnum);
 void perror (char const *message);
diff --git a/lib/ctype/islower.c b/lib/ctype/islower.c
new file mode 100644 (file)
index 0000000..4a34e7d
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+
+int
+islower (int c)
+{
+  return c >= 'a' && c <= 'z';
+}
diff --git a/lib/ctype/isupper.c b/lib/ctype/isupper.c
new file mode 100644 (file)
index 0000000..7b702e3
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+
+int
+isupper (int c)
+{
+  return c >= 'A' && c <= 'Z';
+}
diff --git a/lib/ctype/tolower.c b/lib/ctype/tolower.c
new file mode 100644 (file)
index 0000000..19fa82c
--- /dev/null
@@ -0,0 +1,29 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+
+int
+tolower (int c)
+{
+  if (isupper (c))
+    return c + ('a' - 'A');
+  return c;
+}
diff --git a/lib/ctype/toupper.c b/lib/ctype/toupper.c
new file mode 100644 (file)
index 0000000..444bae2
--- /dev/null
@@ -0,0 +1,29 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+
+int
+toupper (int c)
+{
+  if (islower (c))
+    return c - ('a' - 'A');
+  return c;
+}
index a9ed2751635a6e801e1d4225eafaeea3057e5cfa..75da82926354f2f86804dfcf2fcef9e1e035be6a 100644 (file)
@@ -1,8 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * GNU Mes --- Maxwell Equations of Software
  * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- * Copyright © 2018 Jeremiah Orians <jeremiah@pdp10.guru>
- * Copyright (C) 2018 Han-Wen Nienhuys <hanwen@xs4all.nl>
  *
  * This file is part of GNU Mes.
  *
 #error arch not supported
 #endif
 
-char *
-search_path (char const *file_name)
-{
-  static char buf[256];
-  char *path = getenv ("PATH");
-  if (__mes_debug ())
-    {
-      eputs ("\n search-path: "); eputs (file_name); eputs ("\n");
-    }
-  while (*path)
-    {
-      char *end = strchr (path, ':');
-      if (!end)
-        end = strchr (path, '\0');
-      strncpy (buf, path, end - path);
-      buf[end - path] = 0;
-      if (__mes_debug ())
-        {
-          eputs (" dir: "); eputs (buf); eputs ("\n");
-        }
-      if (buf[end - path] != '/')
-        strcat (buf, "/");
-      strcat (buf, file_name);
-      if (!access (buf, X_OK))
-        {
-          if (__mes_debug ())
-            {
-              eputs (" found: "); eputs (buf); eputs ("\n");
-            }
-          return buf;
-        }
-      path = end + 1;
-    }
-  return 0;
-}
-
-int
-execvp (char const *file_name, char *const argv[])
-{
-  if (file_name[0] != '/')
-    file_name = search_path (file_name);
-  if (!file_name)
-    {
-      errno = ENOENT;
-      return -1;
-    }
-  if (__mes_debug ())
-    {
-      eputs (" EXEC: "); eputs (file_name); eputs ("\n");
-      int i = 0;
-      while (argv[i])
-        {
-          eputs (" arg["); eputs (itoa (i)); eputs ("]: "); eputs (argv[i]); eputs ("\n");
-          i++;
-        }
-    }
-  return execve (file_name, argv, environ);
-}
-
-int
-fclose (FILE *stream)
-{
-  int fd = (int)stream;
-  return close (fd);
-}
-
-FILE *
-fdopen (int fd, char const *mode)
-{
-  return (FILE*)fd;
-}
-
-int
-ferror (FILE *stream)
-{
-  int fd = (int)stream;
-  if (fd == -1) return -1;
-  return 0;
-}
-
-int
-fflush (FILE *stream)
-{
-  fsync ((int)stream);
-}
-
-int
-fprintf (FILE *stream, char const *format, ...)
-{
-  va_list ap;
-  va_start (ap, format);
-  int r = vfprintf (stream, format, ap);
-  va_end (ap);
-  return r;
-}
-
-int
-_fungetc_p (FILE *stream)
-{
-  return _fdungetc_p ((int)stream);
-}
-
-size_t
-fread (void *data, size_t size, size_t count, FILE *stream)
-{
-  if (! size || !count)
-    return 0;
-
-  size_t todo = size * count;
-  char *buf = (char*)data;
-
-  int bytes = 0;
-  while (_fungetc_p (stream) && todo-- && ++bytes)
-    *buf++ = fgetc (stream);
-  if (todo)
-    {
-      int r = read ((int)stream, buf, todo);
-      if (r < 0 && !bytes)
-        bytes = r;
-      else
-        bytes += r;
-    }
-
-  if (__mes_debug ())
-    {
-      eputs ("fread fd="); eputs (itoa ((int)stream));
-      eputs (" bytes="); eputs (itoa (bytes)); eputs ("\n");
-      static char buf[4096];
-      if (bytes > 0 && bytes < sizeof (buf))
-        {
-          strncpy (buf, data, bytes);
-          buf[bytes] = 0;
-          eputs ("fread buf="); eputs (buf); eputs ("\n");
-        }
-    }
-
-  if (bytes > 0)
-    return bytes/size;
-
-  return 0;
-}
-
-size_t
-fwrite (void const *data, size_t size, size_t count, FILE *stream)
-{
-  if (__mes_debug () > 1)
-    {
-      eputs ("fwrite "); eputs (itoa ((int)stream));
-      eputs ("  "); eputs (itoa (size)); eputs ("\n");
-    }
-
-  if (! size || !count)
-    return 0;
-  int bytes = write ((int)stream, data, size * count);
-
-  if (__mes_debug () > 2)
-    {
-      eputs (" => "); eputs (itoa (bytes)); eputs ("\n");
-    }
-
-  if (bytes > 0)
-    return bytes/size;
-  return 0;
-}
-
-long
-ftell (FILE *stream)
-{
-  return lseek ((int)stream, 0, SEEK_CUR);
-}
-
-FILE*
-fopen (char const *file_name, char const *opentype)
-{
-  if (__mes_debug ())
-    {
-      eputs ("fopen "); eputs (file_name);
-      eputs (" "); eputs (opentype); eputs ("\n");
-    }
-
-  int fd;
-  int mode = 0600;
-  if ((opentype[0] == 'a' || !strcmp (opentype, "r+"))
-      && !access (file_name, O_RDONLY))
-    {
-      int flags = O_RDWR;
-      if (opentype[0] == 'a')
-        flags |= O_APPEND;
-      fd = open (file_name, flags, mode);
-    }
-  else if (opentype[0] == 'w' || opentype[0] == 'a' || !strcmp (opentype, "r+"))
-    {
-      char *plus_p = strchr (opentype, '+');
-      int flags = plus_p ? O_RDWR | O_CREAT : O_WRONLY | O_CREAT | O_TRUNC;
-      fd = open (file_name, flags, mode);
-    }
-  else
-    fd = open (file_name, 0, 0);
-
-  if (__mes_debug ())
-    {
-      eputs (" => fd="); eputs (itoa (fd)); eputs ("\n");
-    }
-
-  if (!fd)
-    {
-      eputs (" ***MES LIB C*** fopen of stdin: signal me in band\n");
-      exit (1);
-    }
-  if (fd < 0)
-    fd = 0;
-  return (FILE*)fd;
-}
-
-int
-fseek (FILE *stream, long offset, int whence)
-{
-  int pos = lseek ((int)stream, offset, whence);
-  if (__mes_debug ())
-    {
-      eputs ("fread fd="); eputs (itoa ((int)stream));
-      eputs ("  =>"); eputs (itoa (pos)); eputs ("\n");
-    }
-  if (pos >= 0)
-    return 0;
-  return -1;
-}
-
-int
-gettimeofday (struct timeval *tv, struct timezone *tz)
-{
-  static int stub = 0;
-  if (__mes_debug () && !stub)
-    eputs ("gettimeofday stub\n");
-  stub = 1;
-  errno = 0;
-  return 0;
-}
-
-double
-ldexp (double x, int exp)
-{
-  static int stub = 0;
-  if (__mes_debug () && !stub)
-    eputs ("ldexp stub\n");
-  stub = 1;
-  return 0;
-}
-
-struct tm *
-localtime (time_t const *timep)
-{
-  static int stub = 0;
-  if (__mes_debug () && !stub)
-    eputs ("localtime stub\n");
-  stub = 1;
-  errno = 0;
-  return 0;
-}
-
-void *
-memmove (void *dest, void const *src, size_t n)
-{
-  if (dest < src)
-    return memcpy (dest, src, n);
-  char *p = dest + n;
-  char const *q = src +n;
-  while (n--)
-    *--p = *--q;
-  return dest;
-}
-
-void *
-memset (void *s, int c, size_t n)
-{
-  char *p = s;
-  while (n--) *p++ = c;
-  return s;
-}
-
-int
-memcmp (void const *s1, void const *s2, size_t size)
-{
-  if (!size)
-    return 0;
-  char *a = s1;
-  char *b = s2;
-  while (*a == *b && --size)
-    {
-      a++;
-      b++;
-    }
-  return *a - *b;
-}
-
-int
-mprotect (void *addr, size_t len, int prot)
-{
-  return 0;
-}
-
-void
-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 *))
-{
-  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
-remove (char const *file_name)
-{
-  struct stat buf;
-  if (stat (file_name, &buf) < 0)
-    return -1;
-  if (S_ISDIR (buf.st_mode))
-    return rmdir (file_name);
-  return unlink (file_name);
-}
-
-int
-sigaction (int signum, struct sigaction const *act, struct sigaction *oldact)
-{
-  return 0;
-}
-
-int
-sigemptyset (sigset_t *set)
-{
-  return 0;
-}
-
-int
-snprintf(char *str,  size_t size,  char const *format, ...)
-{
-  va_list ap;
-  va_start (ap, format);
-  int r = vsprintf (str, format, ap);
-  va_end (ap);
-  return r;
-}
-
-int
-sscanf (char const *str, const char *template, ...)
-{
-  va_list ap;
-  va_start (ap, template);
-  int r = vsscanf (str, template, ap);
-  va_end (ap);
-  return r;
-}
-
-char *
-strcat (char *to, char const *from)
-{
-  char *p = strchr (to, '\0');
-  while (*from)
-    *p++ = *from++;
-  *p = 0;
-  return to;
-}
-
-char *
-strchr (char const *s, int c)
-{
-  char const *p = s;
-  while (*p || !c)
-    {
-      if (c == *p)
-        return p;
-      p++;
-    }
-  return 0;
-}
-
-char *
-strncpy (char *to, char const *from, size_t size)
-{
-  if (size == 0)
-    return to;
-  char *p = to;
-  while (*from && size--)
-    *p++ = *from++;
-  if (*from)
-    size++;
-  while (size--)
-    *p++ = 0;
-  return to;
-}
-
-char *
-strrchr (char const *s, int c)
-{
-  int n = strlen (s);
-  if (!n)
-    return 0;
-  char const *p = s + n;
-  if (!*p && !c)
-    return p;
-  p--;
-  while (n-- && (*p || !c))
-    {
-      if (c == *p)
-        return p;
-      p--;
-    }
-  return 0;
-}
-
-/** locate a substring. #memmem# finds the first occurrence of
-    #needle# in #haystack#.  This is not ANSI-C.
-
-    The prototype is not in accordance with the Linux Programmer's
-    Manual v1.15, but it is with /usr/include/string.h   */
-
-unsigned char *
-_memmem (unsigned char const *haystack, int haystack_len,
-         unsigned char const *needle, int needle_len)
-{
-  unsigned char const *end_haystack = haystack + haystack_len - needle_len + 1;
-  unsigned char const *end_needle = needle + needle_len;
-
-  /* Ahhh ... Some minimal lowlevel stuff. This *is* nice; Varation
-     is the spice of life */
-  while (haystack < end_haystack)
-    {
-      unsigned char const *subneedle = needle;
-      unsigned char const *subhaystack = haystack;
-      while (subneedle < end_needle)
-        if (*subneedle++ != *subhaystack++)
-          goto next;
-
-      /* Completed the needle.  Gotcha.  */
-      return (unsigned char *) haystack;
-    next:
-      haystack++;
-    }
-  return 0;
-}
-
-void *
-memmem (void const *haystack, int haystack_len,
-        void const *needle, int needle_len)
-{
-  unsigned char const *haystack_byte_c = (unsigned char const *)haystack;
-  unsigned char const *needle_byte_c = (unsigned char const *)needle;
-  return _memmem (haystack_byte_c, haystack_len, needle_byte_c, needle_len);
-}
-
-char *
-strstr (char const *haystack, char const *needle)
-{
-  return memmem (haystack, strlen (haystack), needle, strlen (needle));
-}
-
-double
-strtod (char const *string, char **tailptr)
-{
-  static int stub = 0;
-  if (__mes_debug () && !stub)
-    eputs ("strtod stub\n");
-  stub = 1;
-  return 0;
-}
-
-float
-strtof (char const *string, char **tailptr)
-{
-  return strtod (string, tailptr);
-}
-
-long double
-strtold (char const *string, char **tailptr)
-{
-  return strtod (string, tailptr);
-}
-
-long
-strtol (char const *string, char **tailptr, int base)
-{
-  if (!strncmp (string, "0x", 2))
-    {
-      string += 2;
-      base = 16;
-    }
-  if (tailptr)
-    {
-      *tailptr = string;
-      return abtol (tailptr, base);
-    }
-  char **p = &string;
-  return abtol (p, base);
-}
-
-long long int
-strtoll (char const *string, char **tailptr, int base)
-{
-  return strtol (string, tailptr, base);
-}
-
-unsigned long
-strtoul (char const *string, char **tailptr, int base)
-{
-  return strtol (string, tailptr, base);
-}
-
-unsigned long long
-strtoull (char const *string, char **tailptr, int base)
-{
-  return strtol (string, tailptr, base);
-}
-
-time_t
-time (time_t *tloc)
-{
-  static int stub = 0;
-  if (__mes_debug () && !stub)
-    eputs ("time stub\n");
-  stub = 1;
-  errno = 0;
-  return 0;
-}
-
-int
-vsnprintf (char *str, size_t size, char const *format, va_list ap)
-{
-  return vsprintf (str, format, ap);
-}
-
-void *
-calloc (size_t nmemb, size_t size)
-{
-  size_t count = nmemb * size;
-  void *p = malloc (count);
-  memset (p, 0, count);
-  return p;
-}
-
-int
-islower (int c)
-{
-  return c >= 'a' && c <= 'z';
-}
-
-int
-isupper (int c)
-{
-  return c >= 'A' && c <= 'Z';
-}
-
-int
-tolower (int c)
-{
-  if (isupper (c))
-    return c + ('a' - 'A');
-  return c;
-}
-
-int
-toupper (int c)
-{
-  if (islower (c))
-    return c - ('a' - 'A');
-  return c;
-}
-
-char *
-strlwr (char *string)
-{
-  char *p = string;
-  while (*p)
-    {
-      *p = tolower (*p);
-      p++;
-    }
-  return string;
-}
-
-char *
-strupr (char *string)
-{
-  char *p = string;
-  while (*p)
-    {
-      *p = toupper (*p);
-      p++;
-    }
-  return string;
-}
-
-int
-vfprintf (FILE* f, char const* format, va_list ap)
-{
-  int fd = (int)f;
-  char const *p = format;
-  int count = 0;
-  while (*p)
-    if (*p != '%')
-      {
-        count++;
-        fputc (*p++, fd);
-      }
-    else
-      {
-        p++;
-        char c = *p;
-        int left_p = 0;
-        int precision = -1;
-        int width = -1;
-        if (c == '-')
-          {
-            left_p = 1;
-            c = *++p;
-          }
-        char pad = ' ';
-        if (c == '0')
-          {
-            pad = c;
-            c = *p++;
-          }
-        if (c >= '0' && c <= '9')
-          {
-            width = abtol (&p, 10);
-            c = *p;
-          }
-        else if (c == '*')
-          {
-            width = va_arg (ap, int);
-            c = *++p;
-          }
-        if (c == '.')
-          {
-            c = *++p;
-            if (c >= '0' && c <= '9')
-              {
-                precision = abtol (&p, 10);
-                c = *p;
-              }
-            else if (c == '*')
-              {
-                precision = va_arg (ap, int);
-                c = *++p;
-              }
-          }
-        if (c == 'l')
-          c = *++p;
-        if (c == 'l')
-          {
-            eputs ("vfprintf: skipping second: l\n");
-            c = *++p;
-          }
-        switch (c)
-          {
-          case '%': {fputc (*p, fd); count++; break;}
-          case 'c': {char c; c = va_arg (ap, int); fputc (c, fd); break;}
-          case 'd':
-          case 'i':
-          case 'o':
-          case 'u':
-          case 'x':
-          case 'X':
-            {
-              int d = va_arg (ap, int);
-              int base = c == 'o' ? 8
-                : c == 'x' || c == 'X' ? 16
-                : 10;
-              char const *s = ntoab (d, base, c != 'u' && c != 'x' && c != 'X');
-              if (c == 'X')
-                strupr (s);
-              int length = strlen (s);
-              if (precision == -1)
-                precision = length;
-              if (!left_p)
-                {
-                  while (width-- > precision)
-                    {
-                      fputc (pad, f);
-                      count++;
-                    }
-                  while (precision > length)
-                    {
-                      fputc ('0', f);
-                      precision--;
-                      width--;
-                      count++;
-                    }
-                }
-              while (*s)
-                {
-                  if (precision-- <= 0)
-                    break;
-                  width--;
-                  fputc (*s++, f);
-                  count++;
-                }
-              while (width > 0)
-                {
-                  width--;
-                  fputc (pad, f);
-                  count++;
-                }
-              break;
-            }
-          case 's':
-            {
-              char *s = va_arg (ap, char *);
-              int length = strlen (s);
-              if (precision == -1)
-                precision = length;
-              if (!left_p)
-                {
-                  while (width-- > precision)
-                    {
-                      fputc (pad, f);
-                      count++;
-                    }
-                  while (precision > length)
-                    {
-                      fputc (' ', f);
-                      precision--;
-                      width--;
-                      count++;
-                    }
-                }
-              while (*s)
-                {
-                  if (precision-- <= 0)
-                    break;
-                  width--;
-                  fputc (*s++, f);
-                  count++;
-                }
-              while (width > 0)
-                {
-                  width--;
-                  fputc (pad, f);
-                  count++;
-                }
-              break;
-            }
-          case 'n':
-            {
-              int *n = va_arg (ap, int *);
-              *n = count;
-              break;
-            }
-          default:
-            {
-              eputs ("vfprintf: not supported: %:");
-              eputc (c);
-              eputs ("\n");
-              p++;
-            }
-          }
-        p++;
-      }
-  va_end (ap);
-  return 0;
-}
-
-int
-vprintf (char const* format, va_list ap)
-{
-  return vfprintf (STDOUT, format, ap);
-}
-
-int
-vsscanf (char const *s, char const *template, va_list ap)
-{
-  char const *p = s;
-  char const *t = template;
-  int count = 0;
-  while (*t && *p)
-    if (*t != '%')
-      {
-        t++;
-        p++;
-      }
-    else
-      {
-        t++;
-        char c = *t;
-        if (c == 'l')
-          c = *++t;
-        switch (c)
-          {
-          case '%': {p++; break;}
-          case 'c':
-            {
-              char *c = va_arg (ap, char*);
-              *c = *p++;
-              count++;
-              break;
-            }
-          case 'd':
-          case 'i':
-          case 'u':
-            {
-              int *d = va_arg (ap, int*);
-              *d = abtol (&p, 10);
-              count++;
-              break;
-            }
-          default:
-            {
-              eputs ("vsscanf: not supported: %:");
-              eputc (c);
-              eputs ("\n");
-              t++;
-              p++;
-            }
-          }
-        t++;
-      }
-  va_end (ap);
-  return count;
-}
-
-int
-vsprintf (char *str, char const* format, va_list ap)
-{
-  char const *p = format;
-  int count = 0;
-  while (*p)
-    if (*p != '%')
-      {
-        *str++ = *p++;
-        count++;
-      }
-    else
-      {
-        p++;
-        char c = *p;
-        int left_p = 0;
-        int precision = -1;
-        int width = -1;
-        if (c == '-')
-          {
-            left_p = 1;
-            c = *++p;
-          }
-        char pad = ' ';
-        if (c == '0')
-          {
-            pad = c;
-            c = *p++;
-          }
-        if (c >= '0' && c <= '9')
-          {
-            width = abtol (&p, 10);
-            c = *p;
-          }
-        else if (c == '*')
-          {
-            width = va_arg (ap, int);
-            c = *++p;
-          }
-        if (c == '.')
-          {
-            c = *++p;
-            if (c >= '0' && c <= '9')
-              {
-                precision = abtol (&p, 10);
-                c = *p;
-              }
-            else if (c == '*')
-              {
-                precision = va_arg (ap, int);
-                c = *++p;
-              }
-          }
-        if (c == 'l')
-          c = *++p;
-        if (c == 'l')
-          c = *++p;
-        if (c == 'l')
-          {
-            eputs ("vfprintf: skipping second: l\n");
-            c = *++p;
-          }
-        switch (c)
-          {
-          case '%': {*str++ = *p; count++; break;}
-          case 'c': {c = va_arg (ap, int); *str++ = c; count++; break;}
-          case 'd':
-          case 'i':
-          case 'o':
-          case 'u':
-          case 'x':
-          case 'X':
-            {
-              int d = va_arg (ap, int);
-              int base = c == 'o' ? 8
-                : c == 'x' || c == 'X' ? 16
-                : 10;
-              char const *s = ntoab (d, base, c != 'u' && c != 'x' && c != 'X');
-              if (c == 'X')
-                strupr (s);
-              int length = strlen (s);
-              if (precision == -1)
-                precision = length;
-              if (!left_p)
-                {
-                  while (width-- > precision)
-                    {
-                      *str++ = pad;
-                      count++;
-                    }
-                  while (precision > length)
-                    {
-                      *str++ = '0';
-                      precision--;
-                      width--;
-                      count++;
-                    }
-                }
-              while (*s)
-                {
-                  if (precision-- <= 0)
-                    break;
-                  width--;
-                  *str++ = *s++;
-                  count++;
-                }
-              while (width > 0)
-                {
-                  width--;
-                  *str++ = pad;
-                  count++;
-                }
-              break;
-            }
-          case 's':
-            {
-              char *s = va_arg (ap, char *);
-              int length = strlen (s);
-              if (precision == -1)
-                precision = length;
-              if (!left_p)
-                {
-                  while (width-- > precision)
-                    {
-                      *str++ = pad;
-                      count++;
-                    }
-                  while (width > length)
-                    {
-                      *str++ = ' ';
-                      precision--;
-                      width--;
-                      count++;
-                    }
-                }
-              while (*s)
-                {
-                  if (precision-- <= 0)
-                    break;
-                  width--;
-                  *str++ = *s++;
-                  count++;
-                }
-              while (width > 0)
-                {
-                  width--;
-                  *str++ = pad;
-                  count++;
-                }
-              break;
-            }
-          case 'n':
-            {
-              int *n = va_arg (ap, int *);
-              *n = count;
-              break;
-            }
-          default:
-            {
-              eputs ("vsprintf: not supported: %:");
-              eputc (c);
-              eputs ("\n");
-              p++;
-            }
-          }
-        p++;
-      }
-  va_end (ap);
-  *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 r;
-}
-
-int
-printf (char const* format, ...)
-{
-  va_list ap;
-  va_start (ap, format);
-  int r = vprintf (format, ap);
-  va_end (ap);
-  return r;
-}
+#include <ctype/islower.c>
+#include <ctype/isupper.c>
+#include <ctype/tolower.c>
+#include <ctype/toupper.c>
+#include <mes/search-path.c>
+#include <posix/execvp.c>
+#include <stdio/fclose.c>
+#include <stdio/fdopen.c>
+#include <stdio/ferror.c>
+#include <stdio/fflush.c>
+#include <stdio/fopen.c>
+#include <stdio/fprintf.c>
+#include <stdio/fread.c>
+#include <stdio/fseek.c>
+#include <stdio/ftell.c>
+#include <stdio/fwrite.c>
+#include <stdio/printf.c>
+#include <stdio/remove.c>
+#include <stdio/snprintf.c>
+#include <stdio/sprintf.c>
+#include <stdio/sscanf.c>
+#include <stdio/vfprintf.c>
+#include <stdio/vprintf.c>
+#include <stdio/vsnprintf.c>
+#include <stdio/vsprintf.c>
+#include <stdio/vsscanf.c>
+#include <stdlib/calloc.c>
+#include <stdlib/qsort.c>
+#include <stdlib/strtof.c>
+#include <stdlib/strtol.c>
+#include <stdlib/strtold.c>
+#include <stdlib/strtoll.c>
+#include <stdlib/strtoul.c>
+#include <stdlib/strtoull.c>
+#include <string/memcmp.c>
+#include <string/memmem.c>
+#include <string/memmove.c>
+#include <string/memset.c>
+#include <string/strcat.c>
+#include <string/strchr.c>
+#include <string/strlwr.c>
+#include <string/strncpy.c>
+#include <string/strrchr.c>
+#include <string/strstr.c>
+#include <string/strupr.c>
+#include <stub/time.c>
+#include <stub/sigaction.c>
+#include <stub/gettimeofday.c>
+#include <stub/ldexp.c>
+#include <stub/mprotect.c>
+#include <stub/localtime.c>
+#include <stub/strtod.c>
+#include <stub/sigemptyset.c>
diff --git a/lib/mes/search-path.c b/lib/mes/search-path.c
new file mode 100644 (file)
index 0000000..7db5957
--- /dev/null
@@ -0,0 +1,57 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+
+char *
+search_path (char const *file_name)
+{
+  static char buf[256];
+  char *path = getenv ("PATH");
+  if (__mes_debug ())
+    {
+      eputs ("\n search-path: "); eputs (file_name); eputs ("\n");
+    }
+  while (*path)
+    {
+      char *end = strchr (path, ':');
+      if (!end)
+        end = strchr (path, '\0');
+      strncpy (buf, path, end - path);
+      buf[end - path] = 0;
+      if (__mes_debug ())
+        {
+          eputs (" dir: "); eputs (buf); eputs ("\n");
+        }
+      if (buf[end - path] != '/')
+        strcat (buf, "/");
+      strcat (buf, file_name);
+      if (!access (buf, X_OK))
+        {
+          if (__mes_debug ())
+            {
+              eputs (" found: "); eputs (buf); eputs ("\n");
+            }
+          return buf;
+        }
+      path = end + 1;
+    }
+  return 0;
+}
diff --git a/lib/posix/execvp.c b/lib/posix/execvp.c
new file mode 100644 (file)
index 0000000..15d8460
--- /dev/null
@@ -0,0 +1,45 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <unistd.h>
+
+int
+execvp (char const *file_name, char *const argv[])
+{
+  if (file_name[0] != '/')
+    file_name = search_path (file_name);
+  if (!file_name)
+    {
+      errno = ENOENT;
+      return -1;
+    }
+  if (__mes_debug ())
+    {
+      eputs (" EXEC: "); eputs (file_name); eputs ("\n");
+      int i = 0;
+      while (argv[i])
+        {
+          eputs (" arg["); eputs (itoa (i)); eputs ("]: "); eputs (argv[i]); eputs ("\n");
+          i++;
+        }
+    }
+  return execve (file_name, argv, environ);
+}
diff --git a/lib/stdio/fclose.c b/lib/stdio/fclose.c
new file mode 100644 (file)
index 0000000..29192de
--- /dev/null
@@ -0,0 +1,28 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+
+int
+fclose (FILE *stream)
+{
+  int fd = (int)stream;
+  return close (fd);
+}
diff --git a/lib/stdio/fdopen.c b/lib/stdio/fdopen.c
new file mode 100644 (file)
index 0000000..eb39d7c
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+
+FILE *
+fdopen (int fd, char const *mode)
+{
+  return (FILE*)fd;
+}
diff --git a/lib/stdio/ferror.c b/lib/stdio/ferror.c
new file mode 100644 (file)
index 0000000..4e5582d
--- /dev/null
@@ -0,0 +1,30 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+
+int
+ferror (FILE *stream)
+{
+  int fd = (int)stream;
+  if (fd == -1)
+    return -1;
+  return 0;
+}
diff --git a/lib/stdio/fflush.c b/lib/stdio/fflush.c
new file mode 100644 (file)
index 0000000..c92587e
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+
+int
+fflush (FILE *stream)
+{
+  fsync ((int)stream);
+}
diff --git a/lib/stdio/fopen.c b/lib/stdio/fopen.c
new file mode 100644 (file)
index 0000000..b0227a0
--- /dev/null
@@ -0,0 +1,66 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2018 Jeremiah Orians <jeremiah@pdp10.guru>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <stdio.h>
+
+FILE*
+fopen (char const *file_name, char const *opentype)
+{
+  if (__mes_debug ())
+    {
+      eputs ("fopen "); eputs (file_name);
+      eputs (" "); eputs (opentype); eputs ("\n");
+    }
+
+  int fd;
+  int mode = 0600;
+  if ((opentype[0] == 'a' || !strcmp (opentype, "r+"))
+      && !access (file_name, O_RDONLY))
+    {
+      int flags = O_RDWR;
+      if (opentype[0] == 'a')
+        flags |= O_APPEND;
+      fd = open (file_name, flags, mode);
+    }
+  else if (opentype[0] == 'w' || opentype[0] == 'a' || !strcmp (opentype, "r+"))
+    {
+      char *plus_p = strchr (opentype, '+');
+      int flags = plus_p ? O_RDWR | O_CREAT : O_WRONLY | O_CREAT | O_TRUNC;
+      fd = open (file_name, flags, mode);
+    }
+  else
+    fd = open (file_name, 0, 0);
+
+  if (__mes_debug ())
+    {
+      eputs (" => fd="); eputs (itoa (fd)); eputs ("\n");
+    }
+
+  if (!fd)
+    {
+      eputs (" ***MES LIB C*** fopen of stdin: signal me in band\n");
+      exit (1);
+    }
+  if (fd < 0)
+    fd = 0;
+  return (FILE*)fd;
+}
diff --git a/lib/stdio/fprintf.c b/lib/stdio/fprintf.c
new file mode 100644 (file)
index 0000000..07e8c35
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int
+fprintf (FILE *stream, char const *format, ...)
+{
+  va_list ap;
+  va_start (ap, format);
+  int r = vfprintf (stream, format, ap);
+  va_end (ap);
+  return r;
+}
diff --git a/lib/stdio/fread.c b/lib/stdio/fread.c
new file mode 100644 (file)
index 0000000..593f8de
--- /dev/null
@@ -0,0 +1,68 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <stdio.h>
+
+int
+_fungetc_p (FILE *stream)
+{
+  return _fdungetc_p ((int)stream);
+}
+
+size_t
+fread (void *data, size_t size, size_t count, FILE *stream)
+{
+  if (! size || !count)
+    return 0;
+
+  size_t todo = size * count;
+  char *buf = (char*)data;
+
+  int bytes = 0;
+  while (_fungetc_p (stream) && todo-- && ++bytes)
+    *buf++ = fgetc (stream);
+  if (todo)
+    {
+      int r = read ((int)stream, buf, todo);
+      if (r < 0 && !bytes)
+        bytes = r;
+      else
+        bytes += r;
+    }
+
+  if (__mes_debug ())
+    {
+      eputs ("fread fd="); eputs (itoa ((int)stream));
+      eputs (" bytes="); eputs (itoa (bytes)); eputs ("\n");
+      static char buf[4096];
+      if (bytes > 0 && bytes < sizeof (buf))
+        {
+          strncpy (buf, data, bytes);
+          buf[bytes] = 0;
+          eputs ("fread buf="); eputs (buf); eputs ("\n");
+        }
+    }
+
+  if (bytes > 0)
+    return bytes/size;
+
+  return 0;
+}
diff --git a/lib/stdio/fseek.c b/lib/stdio/fseek.c
new file mode 100644 (file)
index 0000000..91e687c
--- /dev/null
@@ -0,0 +1,36 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <stdio.h>
+
+int
+fseek (FILE *stream, long offset, int whence)
+{
+  int pos = lseek ((int)stream, offset, whence);
+  if (__mes_debug ())
+    {
+      eputs ("fread fd="); eputs (itoa ((int)stream));
+      eputs ("  =>"); eputs (itoa (pos)); eputs ("\n");
+    }
+  if (pos >= 0)
+    return 0;
+  return -1;
+}
diff --git a/lib/stdio/ftell.c b/lib/stdio/ftell.c
new file mode 100644 (file)
index 0000000..4d1fab0
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+
+long
+ftell (FILE *stream)
+{
+  return lseek ((int)stream, 0, SEEK_CUR);
+}
diff --git a/lib/stdio/fwrite.c b/lib/stdio/fwrite.c
new file mode 100644 (file)
index 0000000..7fc163d
--- /dev/null
@@ -0,0 +1,45 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <stdio.h>
+
+size_t
+fwrite (void const *data, size_t size, size_t count, FILE *stream)
+{
+  if (__mes_debug () > 1)
+    {
+      eputs ("fwrite "); eputs (itoa ((int)stream));
+      eputs ("  "); eputs (itoa (size)); eputs ("\n");
+    }
+
+  if (! size || !count)
+    return 0;
+  int bytes = write ((int)stream, data, size * count);
+
+  if (__mes_debug () > 2)
+    {
+      eputs (" => "); eputs (itoa (bytes)); eputs ("\n");
+    }
+
+  if (bytes > 0)
+    return bytes/size;
+  return 0;
+}
diff --git a/lib/stdio/printf.c b/lib/stdio/printf.c
new file mode 100644 (file)
index 0000000..f9787ab
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int
+printf (char const* format, ...)
+{
+  va_list ap;
+  va_start (ap, format);
+  int r = vprintf (format, ap);
+  va_end (ap);
+  return r;
+}
diff --git a/lib/stdio/remove.c b/lib/stdio/remove.c
new file mode 100644 (file)
index 0000000..f50b1d0
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+
+int
+remove (char const *file_name)
+{
+  struct stat buf;
+  if (stat (file_name, &buf) < 0)
+    return -1;
+  if (S_ISDIR (buf.st_mode))
+    return rmdir (file_name);
+  return unlink (file_name);
+}
diff --git a/lib/stdio/snprintf.c b/lib/stdio/snprintf.c
new file mode 100644 (file)
index 0000000..0da3c13
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int
+snprintf (char *str,  size_t size,  char const *format, ...)
+{
+  va_list ap;
+  va_start (ap, format);
+  int r = vsprintf (str, format, ap);
+  va_end (ap);
+  return r;
+}
diff --git a/lib/stdio/sprintf.c b/lib/stdio/sprintf.c
new file mode 100644 (file)
index 0000000..2cc90a1
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int
+sprintf (char *str, char const* format, ...)
+{
+  va_list ap;
+  va_start (ap, format);
+  int r = vsprintf (str, format, ap);
+  va_end (ap);
+  return r;
+}
diff --git a/lib/stdio/sscanf.c b/lib/stdio/sscanf.c
new file mode 100644 (file)
index 0000000..cf3714c
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int
+sscanf (char const *str, const char *template, ...)
+{
+  va_list ap;
+  va_start (ap, template);
+  int r = vsscanf (str, template, ap);
+  va_end (ap);
+  return r;
+}
diff --git a/lib/stdio/vfprintf.c b/lib/stdio/vfprintf.c
new file mode 100644 (file)
index 0000000..57cf079
--- /dev/null
@@ -0,0 +1,193 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+int
+vfprintf (FILE* f, char const* format, va_list ap)
+{
+  int fd = (int)f;
+  char const *p = format;
+  int count = 0;
+  while (*p)
+    if (*p != '%')
+      {
+        count++;
+        fputc (*p++, fd);
+      }
+    else
+      {
+        p++;
+        char c = *p;
+        int left_p = 0;
+        int precision = -1;
+        int width = -1;
+        if (c == '-')
+          {
+            left_p = 1;
+            c = *++p;
+          }
+        char pad = ' ';
+        if (c == '0')
+          {
+            pad = c;
+            c = *p++;
+          }
+        if (c >= '0' && c <= '9')
+          {
+            width = abtol (&p, 10);
+            c = *p;
+          }
+        else if (c == '*')
+          {
+            width = va_arg (ap, int);
+            c = *++p;
+          }
+        if (c == '.')
+          {
+            c = *++p;
+            if (c >= '0' && c <= '9')
+              {
+                precision = abtol (&p, 10);
+                c = *p;
+              }
+            else if (c == '*')
+              {
+                precision = va_arg (ap, int);
+                c = *++p;
+              }
+          }
+        if (c == 'l')
+          c = *++p;
+        if (c == 'l')
+          {
+            eputs ("vfprintf: skipping second: l\n");
+            c = *++p;
+          }
+        switch (c)
+          {
+          case '%': {fputc (*p, fd); count++; break;}
+          case 'c': {char c; c = va_arg (ap, int); fputc (c, fd); break;}
+          case 'd':
+          case 'i':
+          case 'o':
+          case 'u':
+          case 'x':
+          case 'X':
+            {
+              int d = va_arg (ap, int);
+              int base = c == 'o' ? 8
+                : c == 'x' || c == 'X' ? 16
+                : 10;
+              char const *s = ntoab (d, base, c != 'u' && c != 'x' && c != 'X');
+              if (c == 'X')
+                strupr (s);
+              int length = strlen (s);
+              if (precision == -1)
+                precision = length;
+              if (!left_p)
+                {
+                  while (width-- > precision)
+                    {
+                      fputc (pad, f);
+                      count++;
+                    }
+                  while (precision > length)
+                    {
+                      fputc ('0', f);
+                      precision--;
+                      width--;
+                      count++;
+                    }
+                }
+              while (*s)
+                {
+                  if (precision-- <= 0)
+                    break;
+                  width--;
+                  fputc (*s++, f);
+                  count++;
+                }
+              while (width > 0)
+                {
+                  width--;
+                  fputc (pad, f);
+                  count++;
+                }
+              break;
+            }
+          case 's':
+            {
+              char *s = va_arg (ap, char *);
+              int length = strlen (s);
+              if (precision == -1)
+                precision = length;
+              if (!left_p)
+                {
+                  while (width-- > precision)
+                    {
+                      fputc (pad, f);
+                      count++;
+                    }
+                  while (precision > length)
+                    {
+                      fputc (' ', f);
+                      precision--;
+                      width--;
+                      count++;
+                    }
+                }
+              while (*s)
+                {
+                  if (precision-- <= 0)
+                    break;
+                  width--;
+                  fputc (*s++, f);
+                  count++;
+                }
+              while (width > 0)
+                {
+                  width--;
+                  fputc (pad, f);
+                  count++;
+                }
+              break;
+            }
+          case 'n':
+            {
+              int *n = va_arg (ap, int *);
+              *n = count;
+              break;
+            }
+          default:
+            {
+              eputs ("vfprintf: not supported: %:");
+              eputc (c);
+              eputs ("\n");
+              p++;
+            }
+          }
+        p++;
+      }
+  va_end (ap);
+  return 0;
+}
diff --git a/lib/stdio/vprintf.c b/lib/stdio/vprintf.c
new file mode 100644 (file)
index 0000000..850a955
--- /dev/null
@@ -0,0 +1,28 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int
+vprintf (char const* format, va_list ap)
+{
+  return vfprintf (STDOUT, format, ap);
+}
diff --git a/lib/stdio/vsnprintf.c b/lib/stdio/vsnprintf.c
new file mode 100644 (file)
index 0000000..d375ac7
--- /dev/null
@@ -0,0 +1,28 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+vsnprintf (char *str, size_t size, char const *format, va_list ap)
+{
+  return vsprintf (str, format, ap);
+}
diff --git a/lib/stdio/vsprintf.c b/lib/stdio/vsprintf.c
new file mode 100644 (file)
index 0000000..2194f68
--- /dev/null
@@ -0,0 +1,194 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int
+vsprintf (char *str, char const* format, va_list ap)
+{
+  char const *p = format;
+  int count = 0;
+  while (*p)
+    if (*p != '%')
+      {
+        *str++ = *p++;
+        count++;
+      }
+    else
+      {
+        p++;
+        char c = *p;
+        int left_p = 0;
+        int precision = -1;
+        int width = -1;
+        if (c == '-')
+          {
+            left_p = 1;
+            c = *++p;
+          }
+        char pad = ' ';
+        if (c == '0')
+          {
+            pad = c;
+            c = *p++;
+          }
+        if (c >= '0' && c <= '9')
+          {
+            width = abtol (&p, 10);
+            c = *p;
+          }
+        else if (c == '*')
+          {
+            width = va_arg (ap, int);
+            c = *++p;
+          }
+        if (c == '.')
+          {
+            c = *++p;
+            if (c >= '0' && c <= '9')
+              {
+                precision = abtol (&p, 10);
+                c = *p;
+              }
+            else if (c == '*')
+              {
+                precision = va_arg (ap, int);
+                c = *++p;
+              }
+          }
+        if (c == 'l')
+          c = *++p;
+        if (c == 'l')
+          c = *++p;
+        if (c == 'l')
+          {
+            eputs ("vfprintf: skipping second: l\n");
+            c = *++p;
+          }
+        switch (c)
+          {
+          case '%': {*str++ = *p; count++; break;}
+          case 'c': {c = va_arg (ap, int); *str++ = c; count++; break;}
+          case 'd':
+          case 'i':
+          case 'o':
+          case 'u':
+          case 'x':
+          case 'X':
+            {
+              int d = va_arg (ap, int);
+              int base = c == 'o' ? 8
+                : c == 'x' || c == 'X' ? 16
+                : 10;
+              char const *s = ntoab (d, base, c != 'u' && c != 'x' && c != 'X');
+              if (c == 'X')
+                strupr (s);
+              int length = strlen (s);
+              if (precision == -1)
+                precision = length;
+              if (!left_p)
+                {
+                  while (width-- > precision)
+                    {
+                      *str++ = pad;
+                      count++;
+                    }
+                  while (precision > length)
+                    {
+                      *str++ = '0';
+                      precision--;
+                      width--;
+                      count++;
+                    }
+                }
+              while (*s)
+                {
+                  if (precision-- <= 0)
+                    break;
+                  width--;
+                  *str++ = *s++;
+                  count++;
+                }
+              while (width > 0)
+                {
+                  width--;
+                  *str++ = pad;
+                  count++;
+                }
+              break;
+            }
+          case 's':
+            {
+              char *s = va_arg (ap, char *);
+              int length = strlen (s);
+              if (precision == -1)
+                precision = length;
+              if (!left_p)
+                {
+                  while (width-- > precision)
+                    {
+                      *str++ = pad;
+                      count++;
+                    }
+                  while (width > length)
+                    {
+                      *str++ = ' ';
+                      precision--;
+                      width--;
+                      count++;
+                    }
+                }
+              while (*s)
+                {
+                  if (precision-- <= 0)
+                    break;
+                  width--;
+                  *str++ = *s++;
+                  count++;
+                }
+              while (width > 0)
+                {
+                  width--;
+                  *str++ = pad;
+                  count++;
+                }
+              break;
+            }
+          case 'n':
+            {
+              int *n = va_arg (ap, int *);
+              *n = count;
+              break;
+            }
+          default:
+            {
+              eputs ("vsprintf: not supported: %:");
+              eputc (c);
+              eputs ("\n");
+              p++;
+            }
+          }
+        p++;
+      }
+  va_end (ap);
+  *str = 0;
+  return strlen (str);
+}
diff --git a/lib/stdio/vsscanf.c b/lib/stdio/vsscanf.c
new file mode 100644 (file)
index 0000000..9f2568a
--- /dev/null
@@ -0,0 +1,74 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int
+vsscanf (char const *s, char const *template, va_list ap)
+{
+  char const *p = s;
+  char const *t = template;
+  int count = 0;
+  while (*t && *p)
+    if (*t != '%')
+      {
+        t++;
+        p++;
+      }
+    else
+      {
+        t++;
+        char c = *t;
+        if (c == 'l')
+          c = *++t;
+        switch (c)
+          {
+          case '%': {p++; break;}
+          case 'c':
+            {
+              char *c = va_arg (ap, char*);
+              *c = *p++;
+              count++;
+              break;
+            }
+          case 'd':
+          case 'i':
+          case 'u':
+            {
+              int *d = va_arg (ap, int*);
+              *d = abtol (&p, 10);
+              count++;
+              break;
+            }
+          default:
+            {
+              eputs ("vsscanf: not supported: %:");
+              eputc (c);
+              eputs ("\n");
+              t++;
+              p++;
+            }
+          }
+        t++;
+      }
+  va_end (ap);
+  return count;
+}
diff --git a/lib/stdlib/calloc.c b/lib/stdlib/calloc.c
new file mode 100644 (file)
index 0000000..1a10618
--- /dev/null
@@ -0,0 +1,31 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+void *
+calloc (size_t nmemb, size_t size)
+{
+  size_t count = nmemb * size;
+  void *p = malloc (count);
+  memset (p, 0, count);
+  return p;
+}
diff --git a/lib/stdlib/qsort.c b/lib/stdlib/qsort.c
new file mode 100644 (file)
index 0000000..bac7f42
--- /dev/null
@@ -0,0 +1,60 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+void
+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 *))
+{
+  if (count > 1)
+    {
+      int p = qpart (base, count-1, size, compare);
+      qsort (base, p, size, compare);
+      qsort (base+p*size, count-p, size, compare);
+    }
+}
diff --git a/lib/stdlib/strtof.c b/lib/stdlib/strtof.c
new file mode 100644 (file)
index 0000000..56f6257
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+
+float
+strtof (char const *string, char **tailptr)
+{
+  return strtod (string, tailptr);
+}
diff --git a/lib/stdlib/strtol.c b/lib/stdlib/strtol.c
new file mode 100644 (file)
index 0000000..3a5f7a1
--- /dev/null
@@ -0,0 +1,39 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <stdlib.h>
+
+long
+strtol (char const *string, char **tailptr, int base)
+{
+  if (!strncmp (string, "0x", 2))
+    {
+      string += 2;
+      base = 16;
+    }
+  if (tailptr)
+    {
+      *tailptr = string;
+      return abtol (tailptr, base);
+    }
+  char **p = &string;
+  return abtol (p, base);
+}
diff --git a/lib/stdlib/strtold.c b/lib/stdlib/strtold.c
new file mode 100644 (file)
index 0000000..1f30150
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+
+long double
+strtold (char const *string, char **tailptr)
+{
+  return strtod (string, tailptr);
+}
diff --git a/lib/stdlib/strtoll.c b/lib/stdlib/strtoll.c
new file mode 100644 (file)
index 0000000..44e17b7
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+
+long long int
+strtoll (char const *string, char **tailptr, int base)
+{
+  return strtol (string, tailptr, base);
+}
diff --git a/lib/stdlib/strtoul.c b/lib/stdlib/strtoul.c
new file mode 100644 (file)
index 0000000..51d5d15
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+
+unsigned long
+strtoul (char const *string, char **tailptr, int base)
+{
+  return strtol (string, tailptr, base);
+}
diff --git a/lib/stdlib/strtoull.c b/lib/stdlib/strtoull.c
new file mode 100644 (file)
index 0000000..e72b43f
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+
+unsigned long long
+strtoull (char const *string, char **tailptr, int base)
+{
+  return strtol (string, tailptr, base);
+}
diff --git a/lib/string/memcmp.c b/lib/string/memcmp.c
new file mode 100644 (file)
index 0000000..1d67e20
--- /dev/null
@@ -0,0 +1,36 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+int
+memcmp (void const *s1, void const *s2, size_t size)
+{
+  if (!size)
+    return 0;
+  char *a = s1;
+  char *b = s2;
+  while (*a == *b && --size)
+    {
+      a++;
+      b++;
+    }
+  return *a - *b;
+}
diff --git a/lib/string/memmem.c b/lib/string/memmem.c
new file mode 100644 (file)
index 0000000..a4883e7
--- /dev/null
@@ -0,0 +1,62 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 1997--2015,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ * Copyright (C) 1997--2015,2018 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+/** locate a substring. #memmem# finds the first occurrence of
+    #needle# in #haystack#.  This is not ANSI-C.
+
+    The prototype is not in accordance with the Linux Programmer's
+    Manual v1.15, but it is with /usr/include/string.h   */
+
+unsigned char *
+_memmem (unsigned char const *haystack, int haystack_len,
+         unsigned char const *needle, int needle_len)
+{
+  unsigned char const *end_haystack = haystack + haystack_len - needle_len + 1;
+  unsigned char const *end_needle = needle + needle_len;
+
+  /* Ahhh ... Some minimal lowlevel stuff. This *is* nice; Varation
+     is the spice of life */
+  while (haystack < end_haystack)
+    {
+      unsigned char const *subneedle = needle;
+      unsigned char const *subhaystack = haystack;
+      while (subneedle < end_needle)
+        if (*subneedle++ != *subhaystack++)
+          goto next;
+
+      /* Completed the needle.  Gotcha.  */
+      return (unsigned char *) haystack;
+    next:
+      haystack++;
+    }
+  return 0;
+}
+
+void *
+memmem (void const *haystack, int haystack_len,
+        void const *needle, int needle_len)
+{
+  unsigned char const *haystack_byte_c = (unsigned char const *)haystack;
+  unsigned char const *needle_byte_c = (unsigned char const *)needle;
+  return _memmem (haystack_byte_c, haystack_len, needle_byte_c, needle_len);
+}
diff --git a/lib/string/memmove.c b/lib/string/memmove.c
new file mode 100644 (file)
index 0000000..3149d69
--- /dev/null
@@ -0,0 +1,33 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+void *
+memmove (void *dest, void const *src, size_t n)
+{
+  if (dest < src)
+    return memcpy (dest, src, n);
+  char *p = dest + n;
+  char const *q = src +n;
+  while (n--)
+    *--p = *--q;
+  return dest;
+}
diff --git a/lib/string/memset.c b/lib/string/memset.c
new file mode 100644 (file)
index 0000000..cca9009
--- /dev/null
@@ -0,0 +1,30 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+void *
+memset (void *s, int c, size_t n)
+{
+  char *p = s;
+  while (n--)
+    *p++ = c;
+  return s;
+}
diff --git a/lib/string/strcat.c b/lib/string/strcat.c
new file mode 100644 (file)
index 0000000..bb1f575
--- /dev/null
@@ -0,0 +1,31 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+char *
+strcat (char *to, char const *from)
+{
+  char *p = strchr (to, '\0');
+  while (*from)
+    *p++ = *from++;
+  *p = 0;
+  return to;
+}
diff --git a/lib/string/strchr.c b/lib/string/strchr.c
new file mode 100644 (file)
index 0000000..d6d0cbc
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+char *
+strchr (char const *s, int c)
+{
+  char const *p = s;
+  while (*p || !c)
+    {
+      if (c == *p)
+        return p;
+      p++;
+    }
+  return 0;
+}
diff --git a/lib/string/strlwr.c b/lib/string/strlwr.c
new file mode 100644 (file)
index 0000000..a33a82b
--- /dev/null
@@ -0,0 +1,33 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+#include <string.h>
+
+char *
+strlwr (char *string)
+{
+  char *p = string;
+  while (*p)
+    {
+      *p = tolower (*p);
+      p++;
+    }
+  return string;
+}
diff --git a/lib/string/strncpy.c b/lib/string/strncpy.c
new file mode 100644 (file)
index 0000000..34ea0f8
--- /dev/null
@@ -0,0 +1,36 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+char *
+strncpy (char *to, char const *from, size_t size)
+{
+  if (size == 0)
+    return to;
+  char *p = to;
+  while (*from && size--)
+    *p++ = *from++;
+  if (*from)
+    size++;
+  while (size--)
+    *p++ = 0;
+  return to;
+}
diff --git a/lib/string/strrchr.c b/lib/string/strrchr.c
new file mode 100644 (file)
index 0000000..175ab2a
--- /dev/null
@@ -0,0 +1,40 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+char *
+strrchr (char const *s, int c)
+{
+  int n = strlen (s);
+  if (!n)
+    return 0;
+  char const *p = s + n;
+  if (!*p && !c)
+    return p;
+  p--;
+  while (n-- && (*p || !c))
+    {
+      if (c == *p)
+        return p;
+      p--;
+    }
+  return 0;
+}
diff --git a/lib/string/strstr.c b/lib/string/strstr.c
new file mode 100644 (file)
index 0000000..fa783b4
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+char *
+strstr (char const *haystack, char const *needle)
+{
+  return memmem (haystack, strlen (haystack), needle, strlen (needle));
+}
diff --git a/lib/string/strupr.c b/lib/string/strupr.c
new file mode 100644 (file)
index 0000000..6cc724e
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+#include <string.h>
+
+char *
+strupr (char *string)
+{
+  char *p = string;
+  while (*p)
+    {
+      *p = toupper (*p);
+      p++;
+    }
+  return string;
+}
diff --git a/lib/stub/gettimeofday.c b/lib/stub/gettimeofday.c
new file mode 100644 (file)
index 0000000..9b379e1
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <time.h>
+#include <sys/time.h>
+
+int
+gettimeofday (struct timeval *tv, struct timezone *tz)
+{
+  static int stub = 0;
+  if (__mes_debug () && !stub)
+    eputs ("gettimeofday stub\n");
+  stub = 1;
+  errno = 0;
+  return 0;
+}
diff --git a/lib/stub/ldexp.c b/lib/stub/ldexp.c
new file mode 100644 (file)
index 0000000..9e28e4c
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <stdlib.h>
+
+double
+ldexp (double x, int exp)
+{
+  static int stub = 0;
+  if (__mes_debug () && !stub)
+    eputs ("ldexp stub\n");
+  stub = 1;
+  return 0;
+}
diff --git a/lib/stub/localtime.c b/lib/stub/localtime.c
new file mode 100644 (file)
index 0000000..5010557
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <time.h>
+#include <sys/time.h>
+
+struct tm *
+localtime (time_t const *timep)
+{
+  static int stub = 0;
+  if (__mes_debug () && !stub)
+    eputs ("localtime stub\n");
+  stub = 1;
+  errno = 0;
+  return 0;
+}
diff --git a/lib/stub/mprotect.c b/lib/stub/mprotect.c
new file mode 100644 (file)
index 0000000..09ce99a
--- /dev/null
@@ -0,0 +1,28 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <string.h>
+
+int
+mprotect (void *addr, size_t len, int prot)
+{
+  return 0;
+}
diff --git a/lib/stub/sigaction.c b/lib/stub/sigaction.c
new file mode 100644 (file)
index 0000000..683ddf3
--- /dev/null
@@ -0,0 +1,28 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <signal.h>
+
+int
+sigaction (int signum, struct sigaction const *act, struct sigaction *oldact)
+{
+  return 0;
+}
diff --git a/lib/stub/sigemptyset.c b/lib/stub/sigemptyset.c
new file mode 100644 (file)
index 0000000..337e3f8
--- /dev/null
@@ -0,0 +1,28 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <signal.h>
+
+int
+sigemptyset (sigset_t *set)
+{
+  return 0;
+}
diff --git a/lib/stub/strtod.c b/lib/stub/strtod.c
new file mode 100644 (file)
index 0000000..9a74fe0
--- /dev/null
@@ -0,0 +1,32 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <stdlib.h>
+
+double
+strtod (char const *string, char **tailptr)
+{
+  static int stub = 0;
+  if (__mes_debug () && !stub)
+    eputs ("strtod stub\n");
+  stub = 1;
+  return 0;
+}
diff --git a/lib/stub/time.c b/lib/stub/time.c
new file mode 100644 (file)
index 0000000..78a1d25
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU 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.
+ *
+ * GNU 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 GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <time.h>
+#include <sys/time.h>
+
+time_t
+time (time_t *tloc)
+{
+  static int stub = 0;
+  if (__mes_debug () && !stub)
+    eputs ("time stub\n");
+  stub = 1;
+  errno = 0;
+  return 0;
+}