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;
93 eputs ("fflush stub\n");
98 fprintf (FILE *stream, char const *format, ...)
101 va_start (ap, format);
102 int r = vfprintf (stream, format, ap);
108 fread (void *data, size_t size, size_t count, FILE *stream)
110 if (! size || !count)
112 int bytes = read ((int)stream, data, size * count);
122 return lseek ((int)stream, 0, SEEK_CUR);
126 fseek (FILE *stream, long offset, int whence)
128 int pos = lseek ((int)stream, offset, whence);
135 gettimeofday (struct timeval *tv, struct timezone *tz)
141 ldexp (double x, int exp)
143 eputs ("ldexp stub\n");
148 localtime (time_t const *timep)
150 eputs ("localtime stub\n");
155 memmove (void *dest, void const *src, size_t n)
158 return memcpy (dest, src, n);
160 char const *q = src +n;
167 memset (void *s, int c, size_t n)
170 while (n--) *p++ = c;
175 memcmp (void const *s1, void const *s2, size_t n)
179 while (*a == *b && --n) {a++;b++;}
184 mprotect (void *addr, size_t len, int prot)
190 qswap (void *a, void *b, size_t size)
193 memcpy (buf, a, size);
195 memcpy (b, buf, size);
199 qpart (void *base, size_t count, size_t size, int (*compare)(void const *, void const *))
201 void* p = base + count*size;
203 for (size_t j = 0; j < count; j++)
205 if (compare (base+j*size, p) < 0)
207 qswap (base+i*size, base+j*size, size);
211 if (compare (base+count*size, base+i*size) < 0)
212 qswap (base+i*size, base+count*size, size);
217 qsort (void *base, size_t count, size_t size, int (*compare)(void const *, void const *))
221 int p = qpart (base, count-1, size, compare);
222 qsort (base, p, size, compare);
223 qsort (base+p*size, count-p, size, compare);
228 remove (char const *file_name)
230 eputs ("remove stub\n");
235 sigaction (int signum, struct sigaction const *act, struct sigaction *oldact)
241 sigemptyset (sigset_t *set)
247 snprintf(char *str, size_t size, char const *format, ...)
250 va_start (ap, format);
251 int r = vsprintf (str, format, ap);
257 sscanf (char const *str, const char *format, ...)
259 eputs ("sscanf stub\n");
264 strcat (char *dest, char const *src)
266 char *p = strchr (dest, '\0');
267 while (*src++) *p++ = *src++;
273 strchr (char const *s, int c)
278 if (c == *p) return p;
285 strncpy (char *dest, char const *src, size_t length)
288 while (*src && length--)
298 strrchr (char const *s, int c)
302 char const *p = s + n - 1;
305 if (c == *p) return p;
311 /** locate a substring. #memmem# finds the first occurrence of
312 #needle# in #haystack#. This is not ANSI-C.
314 The prototype is not in accordance with the Linux Programmer's
315 Manual v1.15, but it is with /usr/include/string.h */
318 _memmem (unsigned char const *haystack, int haystack_len,
319 unsigned char const *needle, int needle_len)
321 unsigned char const *end_haystack = haystack + haystack_len - needle_len + 1;
322 unsigned char const *end_needle = needle + needle_len;
324 /* Ahhh ... Some minimal lowlevel stuff. This *is* nice; Varation
325 is the spice of life */
326 while (haystack < end_haystack)
328 unsigned char const *subneedle = needle;
329 unsigned char const *subhaystack = haystack;
330 while (subneedle < end_needle)
331 if (*subneedle++ != *subhaystack++)
334 /* Completed the needle. Gotcha. */
335 return (unsigned char *) haystack;
343 memmem (void const *haystack, int haystack_len,
344 void const *needle, int needle_len)
346 unsigned char const *haystack_byte_c = (unsigned char const *)haystack;
347 unsigned char const *needle_byte_c = (unsigned char const *)needle;
348 return _memmem (haystack_byte_c, haystack_len, needle_byte_c, needle_len);
352 strstr (char const *haystack, char const *needle)
354 return memmem (haystack, strlen (haystack), needle, strlen (needle));
358 strtod (char const *nptr, char **endptr)
360 eputs ("strtoul stub\n");
364 strtof (char const *nptr, char **endptr)
366 return strtod (nptr, endptr);
370 strtold (char const *nptr, char **endptr)
372 return strtod (nptr, endptr);
376 strtol (char const *nptr, char **endptr, int base)
378 if (!strncmp (nptr, "0x", 2))
380 char const *p = nptr + 2;
381 return abtoi (&p, 16);
383 return abtoi (&nptr, base);
387 strtoll (char const *nptr, char **endptr, int base)
389 eputs ("strtoll stub\n");
394 strtoul (char const *nptr, char **endptr, int base)
396 eputs ("strtoul stub\n");
401 strtoull (char const *p, char **endptr, int base)
404 return abtoi (endptr, base);
407 time_t time (time_t *tloc)
413 vsnprintf (char *str, size_t size, char const *format, va_list ap)
415 return vsprintf (str, format, ap);
419 calloc (size_t nmemb, size_t size)
421 size_t count = nmemb * size;
422 void *p = malloc (count);
423 memset (p, 0, count);
428 vfprintf (FILE* f, char const* format, va_list ap)
431 char const *p = format;
441 case '%': {fputc (*p, fd); break;}
442 case 'c': {char c; c = va_arg (ap, char); fputc (c, fd); break;}
443 case 'd': {int d; d = va_arg (ap, int); fputs (itoa (d), fd); break;}
444 case 's': {char *s; s = va_arg (ap, char *); fputs (s, fd); break;}
445 default: {fputc (*p, fd); break;}