mescc: drop naive realloc.
[mes.git] / mlibc / libc-mes+tcc.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2017 Jan Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <setjmp.h>
22 #include <stdarg.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <time.h>
27 #include <signal.h>
28 #include <sys/mman.h>
29 #include <sys/time.h>
30 #include <unistd.h>
31
32 #if !__GNUC__
33 #include <libc-mes.c>
34
35 int errno;
36
37 int
38 close (int fd)
39 {
40   asm ("mov____0x8(%ebp),%ebx !8");
41
42   asm ("mov____$i32,%eax SYS_close");
43   asm ("int____$0x80");
44 }
45
46 int
47 unlink (char const *file_name)
48 {
49   asm ("mov____0x8(%ebp),%ebx !8");
50
51   asm ("mov____$i32,%eax SYS_unlink");
52   asm ("int____$0x80");
53 }
54
55 off_t
56 lseek (int fd, off_t offset, int whence)
57 {
58   asm ("mov____0x8(%ebp),%ebx !8");
59   asm ("mov____0x8(%ebp),%ecx !12");
60   asm ("mov____0x8(%ebp),%edx !16");
61
62   asm ("mov____$i32,%eax SYS_lseek");
63   asm ("int____$0x80");
64 }
65
66 char *
67 getcwd (char *buf, size_t size)
68 {
69   asm ("mov____0x8(%ebp),%ebx !8");
70   asm ("mov____0x8(%ebp),%ecx !12");
71
72   asm ("mov____$i32,%eax SYS_getcwd");
73   asm ("int____$0x80");
74 }
75 #endif // !__GNUC__
76
77
78 int
79 dlclose (void *handle)
80 {
81   return 0;
82 }
83
84 void *
85 dlopen (char const *filename, int flags)
86 {
87   return 0;
88 }
89
90 int
91 execvp (char const *file, char *const argv[])
92 {
93   eputs ("execvp stub\n");
94   return 0;
95 }
96
97 int
98 fclose (FILE *stream)
99 {
100   int fd = (int)stream;
101   return close (fd);
102 }
103
104 FILE *
105 fdopen (int fd, char const *mode)
106 {
107   return (FILE*)fd;
108 }
109
110 int
111 fflush (FILE *stream)
112 {
113   eputs ("fflush stub\n");
114   return 0;
115 }
116
117 FILE *
118 fopen (char const *pathname, char const *mode)
119 {
120   eputs ("fopen stub\n");
121   return 0;
122 }
123
124 int
125 fprintf (FILE *stream, char const *format, ...)
126 {
127   va_list ap;
128   va_start (ap, format);
129   int r = vfprintf (stream, format, ap);
130   va_end (ap);
131   return r;
132 }
133
134 size_t
135 fread (void *ptr, size_t size, size_t nmemb, FILE *stream)
136 {
137   eputs ("fread stub\n");
138   return 0;
139 }
140
141 int
142 fseek (FILE *stream, long offset, int whence)
143 {
144   eputs ("fseek stub\n");
145   return 0;
146 }
147
148 long
149 ftell (FILE *stream)
150 {
151   eputs ("ftell stub\n");
152   return 0;
153 }
154
155 size_t
156 fwrite (void const *ptr, size_t size, size_t nmemb, FILE *stream)
157 {
158   int fd = (int)stream;
159   return write (fd, ptr, size * nmemb);
160 }
161
162 int
163 gettimeofday (struct timeval *tv, struct timezone *tz)
164 {
165   return 0;
166 }
167
168 struct tm *
169 localtime (time_t const *timep)
170 {
171   eputs ("localtime stub\n");
172   return 0;
173 }
174
175 void
176 longjmp (jmp_buf env, int val)
177 {
178   eputs ("longjmp stub\n");
179 }
180
181 void *
182 memmove (void *dest, void const *src, size_t n)
183 {
184   if (dest < src)
185     return memcpy (dest, src, n);
186   char *p = dest + n;
187   char const *q = src +n;
188   while (n--)
189     *--p = *--q;
190   return dest;
191 }
192
193 void *
194 memset (void *s, int c, size_t n)
195 {
196   char *p = s;
197   while (n--) *p++ = c;
198   return s;
199 }
200
201 int
202 memcmp (void const *s1, void const *s2, size_t n)
203 {
204   char *a = s1;
205   char *b = s2;
206   while (*a == *b && --n) {a++;b++;}
207   return *a - *b;
208 }
209
210 int
211 mprotect (void *addr, size_t len, int prot)
212 {
213   return 0;
214 }
215
216 void
217 qsort (void *base, size_t nmemb, size_t size, int (*compar)(void const *, void const *))
218 {
219   eputs ("qsort stub\n");
220 }
221
222 int
223 remove (char const *file_name)
224 {
225   eputs ("remove stub\n");
226   return 0;
227 }
228
229 int
230 setjmp (jmp_buf env)
231 {
232   eputs ("setjmp stub\n");
233   return 0;
234 }
235
236 int
237 sigaction (int signum, struct sigaction const *act, struct sigaction *oldact)
238 {
239   return 0;
240 }
241
242 int
243 sigemptyset (sigset_t *set)
244 {
245   return 0;
246 }
247
248 int
249 snprintf(char *str,  size_t size,  char const *format, ...)
250 {
251   eputs ("snprintf stub\n");
252   return 0;
253 }
254
255 int
256 sscanf (char const *str, const char *format, ...)
257 {
258   eputs ("sscanf stub\n");
259   return 0;
260 }
261
262 char *
263 strcat (char *dest, char const *src)
264 {
265   eputs ("strcat stub\n");
266   return 0;
267 }
268
269 char *
270 strchr (char const *s, int c)
271 {
272   char const *p = s;
273   while (*p || !c)
274     {
275       if (c == *p) return p;
276       *p++;
277     }
278   return 0;
279 }
280
281 char *
282 strrchr (char const *s, int c)
283 {
284   int n = strlen (s);
285   if (!n) return 0;
286   char const *p = s + n - 1;
287   while (*p || !c)
288     {
289       if (c == *p) return p;
290       *p--;
291     }
292   return 0;
293 }
294
295 char *
296 strstr (char const *haystack, char const *needle)
297 {
298   eputs ("strstr stub\n");
299   return 0;
300 }
301
302 long
303 strtol (char const *nptr, char **endptr, int base)
304 {
305   eputs ("strtol stub\n");
306   return 0;
307 }
308
309 long long int
310 strtoll (char const *nptr, char **endptr, int base)
311 {
312   eputs ("strtoll stub\n");
313   return 0;
314 }
315
316 unsigned long
317 strtoul (char const *nptr, char **endptr, int base)
318 {
319   eputs ("strtoul stub\n");
320   return 0;
321 }
322
323 unsigned long long
324 strtoull (char const *nptr, char **endptr, int base)
325 {
326   eputs ("strtoull stub\n");
327   return 0;
328 }
329
330 time_t time (time_t *tloc)
331 {
332   return 0;
333 }
334
335 int
336 vsnprintf (char *str, size_t size, char const *format, va_list ap)
337 {
338   eputs ("vsnprintf stub\n");
339   return 0;
340 }
341
342 void *
343 calloc (size_t nmemb, size_t size)
344 {
345   size_t count = nmemb * size;
346   void *p = malloc (count);
347   memset (p, 0, count);
348   return p;
349 }
350
351 int
352 vfprintf (FILE* f, char const* format, va_list ap)
353 {
354   int fd = (int)f;
355   char const *p = format;
356   while (*p)
357     if (*p != '%')
358       putchar (*p++);
359     else
360       {
361         p++;
362         char c = *p;
363         switch (c)
364           {
365           case '%': {fputc (*p, fd); break;}
366           case 'c': {char c; c = va_arg (ap, char); fputc (c, fd); break;}
367           case 'd': {int d; d = va_arg (ap, int); fputs (itoa (d), fd); break;}
368           case 's': {char *s; s = va_arg (ap, char *); fputs (s, fd); break;}
369           default: {fputc (*p, fd); break;}
370           }
371         p++;
372       }
373   va_end (ap);
374   return 0;
375 }