mescc: Refactor debug and stub printing.
[mes.git] / lib / libc.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017,2018 Jan (janneke) 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 <sys/ioctl.h>
22 #include <stdarg.h>
23 #include <stdlib.h>
24 #include <libmes.h>
25 #include <stdio.h>
26
27 #include <libmes.h>
28 #include <stdarg.h>
29 #include <stdlib.h>
30 #include <unistd.h>
31
32 #if __MESC__
33
34 #include <linux-mes.c>
35
36 #else // !__MESC__
37
38 #include <assert.h>
39
40 #include <linux-gcc.c>
41
42 #endif // !__MESC__
43
44 #include <libc-mini.c>
45 #include <libmes.c>
46 #include <linux.c>
47
48 int g_stdin = 0;
49
50 void _env ();
51
52 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
53
54 int
55 __mes_debug ()
56 {
57   static int __mes_debug = -1;
58   if (__mes_debug == -1)
59     {
60       char *p = getenv ("MES_DEBUG");
61       __mes_debug = p ? MAX (itoa (p), 1) : 0;
62     }
63   return __mes_debug;
64 }
65
66 int
67 getchar ()
68 {
69   return fdgetc (g_stdin);
70 }
71
72 int
73 putchar (int c)
74 {
75   write (STDOUT, (char*)&c, 1);
76   return 0;
77 }
78
79 int
80 fputc (int c, FILE* stream)
81 {
82   return fdputc (c, (int)stream);
83 }
84
85 int
86 fputs (char const* s, FILE* stream)
87 {
88   return fdputs (s, (int)stream);
89 }
90
91 int
92 putc (int c, FILE* stream)
93 {
94   return fdputc (c, (int)stream);
95 }
96
97 void
98 assert_fail (char* s)
99 {
100   eputs ("assert fail: ");
101   eputs (s);
102   eputs ("\n");
103   char *fail = s;
104   fail = 0;
105   *fail = 0;
106 }
107
108 int
109 getc (FILE *stream)
110 {
111   return fdgetc ((int)stream);
112 }
113
114 int
115 fgetc (FILE *stream)
116 {
117   return fdgetc ((int)stream);
118 }
119
120 void
121 free (void *ptr)
122 {
123 }
124
125 int
126 ungetc (int c, FILE *stream)
127 {
128   return fdungetc (c, (int)stream);
129 }
130
131 int
132 strcmp (char const* a, char const* b)
133 {
134   while (*a && *b && *a == *b)
135     {
136       a++;b++;
137     }
138   return *a - *b;
139 }
140
141 char *
142 strcpy (char *dest, char const *src)
143 {
144   char *p = dest;
145   while (*src) *p++ = *src++;
146   *p = 0;
147   return dest;
148 }
149
150 char *g_brk = 0;
151
152 void *
153 malloc (size_t size)
154 {
155   if (!g_brk)
156     g_brk = brk (0);
157   if (brk (g_brk + size) == (void*)-1)
158     return 0;
159   char *p = g_brk;
160   g_brk += size;
161   return p;
162 }
163
164 void *
165 memcpy (void *dest, void const *src, size_t n)
166 {
167   char* p = dest;
168   char const* q = src;
169   while (n--) *p++ = *q++;
170   return dest;
171 }
172
173 void *
174 realloc (void *ptr, size_t size)
175 {
176   void *new = malloc (size);
177   if (ptr && new)
178     {
179       memcpy (new, ptr, size);
180       free (ptr);
181     }
182   return new;
183 }
184
185 int
186 strncmp (char const* a, char const* b, size_t size)
187 {
188   if (!size)
189     return 0;
190   while (*a && *b && *a == *b && --size)
191     {
192       a++;
193       b++;
194     }
195   return *a - *b;
196 }
197
198 char *
199 getenv (char const* s)
200 {
201   char **p = environ;
202   int length = strlen (s);
203   while (*p)
204     {
205       if (!strncmp (s, *p, length) && *(*p + length) == '=') return (*p + length + 1);
206       p++;
207     }
208   return 0;
209 }
210
211 int
212 setenv (char const* s, char const* v, int overwrite_p)
213 {
214   char **p = environ;
215   int length = strlen (s);
216   while (*p)
217     {
218       if (!strncmp (s, *p, length) && *(*p + length) == '=')
219         break;
220       p++;
221     }
222   char *entry = malloc (length + strlen (v) + 2);
223   int end_p = *p == 0;
224   *p = entry;
225   strcpy (entry, s);
226   strcpy (entry + length, "=");
227   strcpy (entry + length + 1, v);
228   *(entry + length + strlen (v) + 2) = 0;
229   if (end_p)
230     *++p = 0;
231   return 0;
232 }
233
234 int
235 isatty (int fd)
236 {
237   return ioctl (fd, TCGETS, 0) & 0xf0;
238 }
239
240 int
241 wait (int *status_ptr)
242 {
243   return waitpid  (-1, status_ptr, 0);
244 }
245
246 int
247 execv (char const *file_name, char *const argv[])
248 {
249   return execve (file_name, argv, environ);
250 }