From e9d9e80980f7a2ae1544213f6ffeac77e472ceeb Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Wed, 22 Aug 2018 07:23:27 +0200 Subject: [PATCH] mescc: Mes C Library: Explode libc+tcc.c. * 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. --- include/libmes.h | 1 + include/string.h | 3 + lib/ctype/islower.c | 27 + lib/ctype/isupper.c | 27 + lib/ctype/tolower.c | 29 ++ lib/ctype/toupper.c | 29 ++ lib/libc+tcc.c | 1094 ++------------------------------------- lib/mes/search-path.c | 57 ++ lib/posix/execvp.c | 45 ++ lib/stdio/fclose.c | 28 + lib/stdio/fdopen.c | 27 + lib/stdio/ferror.c | 30 ++ lib/stdio/fflush.c | 27 + lib/stdio/fopen.c | 66 +++ lib/stdio/fprintf.c | 32 ++ lib/stdio/fread.c | 68 +++ lib/stdio/fseek.c | 36 ++ lib/stdio/ftell.c | 27 + lib/stdio/fwrite.c | 45 ++ lib/stdio/printf.c | 32 ++ lib/stdio/remove.c | 32 ++ lib/stdio/snprintf.c | 32 ++ lib/stdio/sprintf.c | 32 ++ lib/stdio/sscanf.c | 32 ++ lib/stdio/vfprintf.c | 193 +++++++ lib/stdio/vprintf.c | 28 + lib/stdio/vsnprintf.c | 28 + lib/stdio/vsprintf.c | 194 +++++++ lib/stdio/vsscanf.c | 74 +++ lib/stdlib/calloc.c | 31 ++ lib/stdlib/qsort.c | 60 +++ lib/stdlib/strtof.c | 27 + lib/stdlib/strtol.c | 39 ++ lib/stdlib/strtold.c | 27 + lib/stdlib/strtoll.c | 27 + lib/stdlib/strtoul.c | 27 + lib/stdlib/strtoull.c | 27 + lib/string/memcmp.c | 36 ++ lib/string/memmem.c | 62 +++ lib/string/memmove.c | 33 ++ lib/string/memset.c | 30 ++ lib/string/strcat.c | 31 ++ lib/string/strchr.c | 34 ++ lib/string/strlwr.c | 33 ++ lib/string/strncpy.c | 36 ++ lib/string/strrchr.c | 40 ++ lib/string/strstr.c | 27 + lib/string/strupr.c | 34 ++ lib/stub/gettimeofday.c | 34 ++ lib/stub/ldexp.c | 32 ++ lib/stub/localtime.c | 34 ++ lib/stub/mprotect.c | 28 + lib/stub/sigaction.c | 28 + lib/stub/sigemptyset.c | 28 + lib/stub/strtod.c | 32 ++ lib/stub/time.c | 34 ++ 56 files changed, 2245 insertions(+), 1041 deletions(-) create mode 100644 lib/ctype/islower.c create mode 100644 lib/ctype/isupper.c create mode 100644 lib/ctype/tolower.c create mode 100644 lib/ctype/toupper.c create mode 100644 lib/mes/search-path.c create mode 100644 lib/posix/execvp.c create mode 100644 lib/stdio/fclose.c create mode 100644 lib/stdio/fdopen.c create mode 100644 lib/stdio/ferror.c create mode 100644 lib/stdio/fflush.c create mode 100644 lib/stdio/fopen.c create mode 100644 lib/stdio/fprintf.c create mode 100644 lib/stdio/fread.c create mode 100644 lib/stdio/fseek.c create mode 100644 lib/stdio/ftell.c create mode 100644 lib/stdio/fwrite.c create mode 100644 lib/stdio/printf.c create mode 100644 lib/stdio/remove.c create mode 100644 lib/stdio/snprintf.c create mode 100644 lib/stdio/sprintf.c create mode 100644 lib/stdio/sscanf.c create mode 100644 lib/stdio/vfprintf.c create mode 100644 lib/stdio/vprintf.c create mode 100644 lib/stdio/vsnprintf.c create mode 100644 lib/stdio/vsprintf.c create mode 100644 lib/stdio/vsscanf.c create mode 100644 lib/stdlib/calloc.c create mode 100644 lib/stdlib/qsort.c create mode 100644 lib/stdlib/strtof.c create mode 100644 lib/stdlib/strtol.c create mode 100644 lib/stdlib/strtold.c create mode 100644 lib/stdlib/strtoll.c create mode 100644 lib/stdlib/strtoul.c create mode 100644 lib/stdlib/strtoull.c create mode 100644 lib/string/memcmp.c create mode 100644 lib/string/memmem.c create mode 100644 lib/string/memmove.c create mode 100644 lib/string/memset.c create mode 100644 lib/string/strcat.c create mode 100644 lib/string/strchr.c create mode 100644 lib/string/strlwr.c create mode 100644 lib/string/strncpy.c create mode 100644 lib/string/strrchr.c create mode 100644 lib/string/strstr.c create mode 100644 lib/string/strupr.c create mode 100644 lib/stub/gettimeofday.c create mode 100644 lib/stub/ldexp.c create mode 100644 lib/stub/localtime.c create mode 100644 lib/stub/mprotect.c create mode 100644 lib/stub/sigaction.c create mode 100644 lib/stub/sigemptyset.c create mode 100644 lib/stub/strtod.c create mode 100644 lib/stub/time.c diff --git a/include/libmes.h b/include/libmes.h index 44548072..faa4be17 100644 --- a/include/libmes.h +++ b/include/libmes.h @@ -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 diff --git a/include/string.h b/include/string.h index dea3072b..bf34011d 100644 --- a/include/string.h +++ b/include/string.h @@ -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 index 00000000..4a34e7dc --- /dev/null +++ b/lib/ctype/islower.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..7b702e30 --- /dev/null +++ b/lib/ctype/isupper.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..19fa82c1 --- /dev/null +++ b/lib/ctype/tolower.c @@ -0,0 +1,29 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..444bae20 --- /dev/null +++ b/lib/ctype/toupper.c @@ -0,0 +1,29 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +int +toupper (int c) +{ + if (islower (c)) + return c - ('a' - 'A'); + return c; +} diff --git a/lib/libc+tcc.c b/lib/libc+tcc.c index a9ed2751..75da8292 100644 --- a/lib/libc+tcc.c +++ b/lib/libc+tcc.c @@ -1,8 +1,6 @@ /* -*-comment-start: "//";comment-end:""-*- * GNU Mes --- Maxwell Equations of Software * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen - * Copyright © 2018 Jeremiah Orians - * Copyright (C) 2018 Han-Wen Nienhuys * * This file is part of GNU Mes. * @@ -55,1042 +53,56 @@ #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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/lib/mes/search-path.c b/lib/mes/search-path.c new file mode 100644 index 00000000..7db59578 --- /dev/null +++ b/lib/mes/search-path.c @@ -0,0 +1,57 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..15d84604 --- /dev/null +++ b/lib/posix/execvp.c @@ -0,0 +1,45 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..29192de2 --- /dev/null +++ b/lib/stdio/fclose.c @@ -0,0 +1,28 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..eb39d7c2 --- /dev/null +++ b/lib/stdio/fdopen.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..4e5582de --- /dev/null +++ b/lib/stdio/ferror.c @@ -0,0 +1,30 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..c92587eb --- /dev/null +++ b/lib/stdio/fflush.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +int +fflush (FILE *stream) +{ + fsync ((int)stream); +} diff --git a/lib/stdio/fopen.c b/lib/stdio/fopen.c new file mode 100644 index 00000000..b0227a01 --- /dev/null +++ b/lib/stdio/fopen.c @@ -0,0 +1,66 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * Copyright © 2018 Jeremiah Orians + * + * 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 . + */ + +#include +#include + +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 index 00000000..07e8c35a --- /dev/null +++ b/lib/stdio/fprintf.c @@ -0,0 +1,32 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..593f8ded --- /dev/null +++ b/lib/stdio/fread.c @@ -0,0 +1,68 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..91e687c2 --- /dev/null +++ b/lib/stdio/fseek.c @@ -0,0 +1,36 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..4d1fab04 --- /dev/null +++ b/lib/stdio/ftell.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..7fc163de --- /dev/null +++ b/lib/stdio/fwrite.c @@ -0,0 +1,45 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..f9787ab8 --- /dev/null +++ b/lib/stdio/printf.c @@ -0,0 +1,32 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..f50b1d0a --- /dev/null +++ b/lib/stdio/remove.c @@ -0,0 +1,32 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..0da3c132 --- /dev/null +++ b/lib/stdio/snprintf.c @@ -0,0 +1,32 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..2cc90a17 --- /dev/null +++ b/lib/stdio/sprintf.c @@ -0,0 +1,32 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..cf3714ce --- /dev/null +++ b/lib/stdio/sscanf.c @@ -0,0 +1,32 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..57cf079b --- /dev/null +++ b/lib/stdio/vfprintf.c @@ -0,0 +1,193 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include +#include + +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 index 00000000..850a9556 --- /dev/null +++ b/lib/stdio/vprintf.c @@ -0,0 +1,28 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..d375ac76 --- /dev/null +++ b/lib/stdio/vsnprintf.c @@ -0,0 +1,28 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..2194f68e --- /dev/null +++ b/lib/stdio/vsprintf.c @@ -0,0 +1,194 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..9f2568a8 --- /dev/null +++ b/lib/stdio/vsscanf.c @@ -0,0 +1,74 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..1a106189 --- /dev/null +++ b/lib/stdlib/calloc.c @@ -0,0 +1,31 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..bac7f426 --- /dev/null +++ b/lib/stdlib/qsort.c @@ -0,0 +1,60 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..56f62571 --- /dev/null +++ b/lib/stdlib/strtof.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..3a5f7a14 --- /dev/null +++ b/lib/stdlib/strtol.c @@ -0,0 +1,39 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..1f301505 --- /dev/null +++ b/lib/stdlib/strtold.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..44e17b7e --- /dev/null +++ b/lib/stdlib/strtoll.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..51d5d150 --- /dev/null +++ b/lib/stdlib/strtoul.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..e72b43fc --- /dev/null +++ b/lib/stdlib/strtoull.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..1d67e202 --- /dev/null +++ b/lib/string/memcmp.c @@ -0,0 +1,36 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..a4883e7a --- /dev/null +++ b/lib/string/memmem.c @@ -0,0 +1,62 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 1997--2015,2017,2018 Jan (janneke) Nieuwenhuizen + * Copyright (C) 1997--2015,2018 Han-Wen Nienhuys + * + * 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 . + */ + +#include + +/** 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 index 00000000..3149d696 --- /dev/null +++ b/lib/string/memmove.c @@ -0,0 +1,33 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..cca90095 --- /dev/null +++ b/lib/string/memset.c @@ -0,0 +1,30 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..bb1f575b --- /dev/null +++ b/lib/string/strcat.c @@ -0,0 +1,31 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..d6d0cbc8 --- /dev/null +++ b/lib/string/strchr.c @@ -0,0 +1,34 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..a33a82b6 --- /dev/null +++ b/lib/string/strlwr.c @@ -0,0 +1,33 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * 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 . + */ + +#include +#include + +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 index 00000000..34ea0f8d --- /dev/null +++ b/lib/string/strncpy.c @@ -0,0 +1,36 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..175ab2a2 --- /dev/null +++ b/lib/string/strrchr.c @@ -0,0 +1,40 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..fa783b4a --- /dev/null +++ b/lib/string/strstr.c @@ -0,0 +1,27 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include + +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 index 00000000..6cc724e3 --- /dev/null +++ b/lib/string/strupr.c @@ -0,0 +1,34 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..9b379e13 --- /dev/null +++ b/lib/stub/gettimeofday.c @@ -0,0 +1,34 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include +#include + +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 index 00000000..9e28e4c5 --- /dev/null +++ b/lib/stub/ldexp.c @@ -0,0 +1,32 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..5010557c --- /dev/null +++ b/lib/stub/localtime.c @@ -0,0 +1,34 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include +#include + +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 index 00000000..09ce99a0 --- /dev/null +++ b/lib/stub/mprotect.c @@ -0,0 +1,28 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..683ddf35 --- /dev/null +++ b/lib/stub/sigaction.c @@ -0,0 +1,28 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..337e3f8c --- /dev/null +++ b/lib/stub/sigemptyset.c @@ -0,0 +1,28 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +int +sigemptyset (sigset_t *set) +{ + return 0; +} diff --git a/lib/stub/strtod.c b/lib/stub/strtod.c new file mode 100644 index 00000000..9a74fe0f --- /dev/null +++ b/lib/stub/strtod.c @@ -0,0 +1,32 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include + +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 index 00000000..78a1d25e --- /dev/null +++ b/lib/stub/time.c @@ -0,0 +1,34 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen + * + * 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 . + */ + +#include +#include +#include + +time_t +time (time_t *tloc) +{ + static int stub = 0; + if (__mes_debug () && !stub) + eputs ("time stub\n"); + stub = 1; + errno = 0; + return 0; +}