1 /* -*-comment-start: "//";comment-end:""-*-
2 * Mes --- Maxwell Equations of Software
3 * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4 * Copyright (C) 2018 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 * This file is part of Mes.
8 * Mes is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or (at
11 * your option) any later version.
13 * Mes is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with Mes. If not, see <http://www.gnu.org/licenses/>.
37 #include <linux+tcc-mes.c>
38 #include <libc+tcc-mes.c>
43 #include <linux+tcc-gcc.c>
44 #include <libc+tcc-gcc.c>
51 dlclose (void *handle)
57 dlopen (char const *filename, int flags)
63 execvp (char const *file, char *const argv[])
65 eputs ("execvp stub\n");
77 fdopen (int fd, char const *mode)
86 if (fd == -1) return -1;
97 fprintf (FILE *stream, char const *format, ...)
100 va_start (ap, format);
101 int r = vfprintf (stream, format, ap);
107 fread (void *data, size_t size, size_t count, FILE *stream)
109 if (! size || !count)
111 int bytes = read ((int)stream, data, size * count);
121 return lseek ((int)stream, 0, SEEK_CUR);
125 fseek (FILE *stream, long offset, int whence)
127 int pos = lseek ((int)stream, offset, whence);
134 gettimeofday (struct timeval *tv, struct timezone *tz)
140 ldexp (double x, int exp)
142 eputs ("ldexp stub\n");
147 localtime (time_t const *timep)
149 eputs ("localtime stub\n");
154 memmove (void *dest, void const *src, size_t n)
157 return memcpy (dest, src, n);
159 char const *q = src +n;
166 memset (void *s, int c, size_t n)
169 while (n--) *p++ = c;
174 memcmp (void const *s1, void const *s2, size_t n)
178 while (*a == *b && --n) {a++;b++;}
183 mprotect (void *addr, size_t len, int prot)
189 qswap (void *a, void *b, size_t size)
192 memcpy (buf, a, size);
194 memcpy (b, buf, size);
198 qpart (void *base, size_t count, size_t size, int (*compare)(void const *, void const *))
200 void* p = base + count*size;
202 for (size_t j = 0; j < count; j++)
204 if (compare (base+j*size, p) < 0)
206 qswap (base+i*size, base+j*size, size);
210 if (compare (base+count*size, base+i*size) < 0)
211 qswap (base+i*size, base+count*size, size);
216 qsort (void *base, size_t count, size_t size, int (*compare)(void const *, void const *))
220 int p = qpart (base, count-1, size, compare);
221 qsort (base, p, size, compare);
222 qsort (base+p*size, count-p, size, compare);
227 remove (char const *file_name)
229 eputs ("remove stub\n");
234 sigaction (int signum, struct sigaction const *act, struct sigaction *oldact)
240 sigemptyset (sigset_t *set)
246 snprintf(char *str, size_t size, char const *format, ...)
249 va_start (ap, format);
250 int r = vsprintf (str, format, ap);
256 sscanf (char const *str, const char *template, ...)
259 va_start (ap, template);
260 int r = vsscanf (str, template, ap);
267 strcat (char *dest, char const *src)
269 char *p = strchr (dest, '\0');
270 while (*src++) *p++ = *src++;
276 strchr (char const *s, int c)
281 if (c == *p) return p;
288 strncpy (char *dest, char const *src, size_t length)
291 while (*src && length--)
301 strrchr (char const *s, int c)
305 char const *p = s + n - 1;
308 if (c == *p) return p;
314 /** locate a substring. #memmem# finds the first occurrence of
315 #needle# in #haystack#. This is not ANSI-C.
317 The prototype is not in accordance with the Linux Programmer's
318 Manual v1.15, but it is with /usr/include/string.h */
321 _memmem (unsigned char const *haystack, int haystack_len,
322 unsigned char const *needle, int needle_len)
324 unsigned char const *end_haystack = haystack + haystack_len - needle_len + 1;
325 unsigned char const *end_needle = needle + needle_len;
327 /* Ahhh ... Some minimal lowlevel stuff. This *is* nice; Varation
328 is the spice of life */
329 while (haystack < end_haystack)
331 unsigned char const *subneedle = needle;
332 unsigned char const *subhaystack = haystack;
333 while (subneedle < end_needle)
334 if (*subneedle++ != *subhaystack++)
337 /* Completed the needle. Gotcha. */
338 return (unsigned char *) haystack;
346 memmem (void const *haystack, int haystack_len,
347 void const *needle, int needle_len)
349 unsigned char const *haystack_byte_c = (unsigned char const *)haystack;
350 unsigned char const *needle_byte_c = (unsigned char const *)needle;
351 return _memmem (haystack_byte_c, haystack_len, needle_byte_c, needle_len);
355 strstr (char const *haystack, char const *needle)
357 return memmem (haystack, strlen (haystack), needle, strlen (needle));
361 strtod (char const *nptr, char **endptr)
363 eputs ("strtoul stub\n");
367 strtof (char const *nptr, char **endptr)
369 return strtod (nptr, endptr);
373 strtold (char const *nptr, char **endptr)
375 return strtod (nptr, endptr);
379 strtol (char const *nptr, char **endptr, int base)
381 if (!strncmp (nptr, "0x", 2))
383 char const *p = nptr + 2;
384 return abtoi (&p, 16);
386 return abtoi (&nptr, base);
390 strtoll (char const *nptr, char **endptr, int base)
392 eputs ("strtoll stub\n");
397 strtoul (char const *nptr, char **endptr, int base)
399 eputs ("strtoul stub\n");
404 strtoull (char const *p, char **endptr, int base)
407 return abtoi (endptr, base);
410 time_t time (time_t *tloc)
416 vsnprintf (char *str, size_t size, char const *format, va_list ap)
418 return vsprintf (str, format, ap);
422 calloc (size_t nmemb, size_t size)
424 size_t count = nmemb * size;
425 void *p = malloc (count);
426 memset (p, 0, count);
431 vfprintf (FILE* f, char const* format, va_list ap)
434 char const *p = format;
444 case '%': {fputc (*p, fd); break;}
445 case 'c': {char c; c = va_arg (ap, char); fputc (c, fd); break;}
446 case 'd': {int d; d = va_arg (ap, int); fputs (itoa (d), fd); break;}
447 case 's': {char *s; s = va_arg (ap, char *); fputs (s, fd); break;}
448 default: {fputc (*p, fd); break;}
457 vsscanf (char const *s, char const *template, va_list ap)
460 char const *t = template;
473 case '%': {p++; break;}
474 case 'c': {char *c = va_arg (ap, char*); *c = *p++; break;}
475 case 'd': {int *d = va_arg (ap, int*); *d = abtoi (&p, 10); break;}
478 eputs ("vsscanf: not supported: %");