mescc: Support gcc-3.2: puts with newline.
[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 int
53 getchar ()
54 {
55   return fdgetc (g_stdin);
56 }
57
58 int
59 putchar (int c)
60 {
61   write (STDOUT, (char*)&c, 1);
62   return 0;
63 }
64
65 int
66 fputc (int c, FILE* stream)
67 {
68   return fdputc (c, (int)stream);
69 }
70
71 int
72 fputs (char const* s, FILE* stream)
73 {
74   return fdputs (s, (int)stream);
75 }
76
77 int
78 putc (int c, FILE* stream)
79 {
80   return fdputc (c, (int)stream);
81 }
82
83 void
84 assert_fail (char* s)
85 {
86   eputs ("assert fail: ");
87   eputs (s);
88   eputs ("\n");
89   char *fail = s;
90   fail = 0;
91   *fail = 0;
92 }
93
94 int
95 getc (FILE *stream)
96 {
97   return fdgetc ((int)stream);
98 }
99
100 int
101 fgetc (FILE *stream)
102 {
103   return fdgetc ((int)stream);
104 }
105
106 void
107 free (void *ptr)
108 {
109 }
110
111 int
112 ungetc (int c, FILE *stream)
113 {
114   return fdungetc (c, (int)stream);
115 }
116
117 int
118 strcmp (char const* a, char const* b)
119 {
120   while (*a && *b && *a == *b)
121     {
122       a++;b++;
123     }
124   return *a - *b;
125 }
126
127 char *
128 strcpy (char *dest, char const *src)
129 {
130   char *p = dest;
131   while (*src) *p++ = *src++;
132   *p = 0;
133   return dest;
134 }
135
136 char *g_brk = 0;
137
138 void *
139 malloc (size_t size)
140 {
141   if (!g_brk)
142     g_brk = brk (0);
143   if (brk (g_brk + size) == (void*)-1)
144     return 0;
145   char *p = g_brk;
146   g_brk += size;
147   return p;
148 }
149
150 void *
151 memcpy (void *dest, void const *src, size_t n)
152 {
153   char* p = dest;
154   char const* q = src;
155   while (n--) *p++ = *q++;
156   return dest;
157 }
158
159 void *
160 realloc (void *ptr, size_t size)
161 {
162   void *new = malloc (size);
163   if (ptr && new)
164     {
165       memcpy (new, ptr, size);
166       free (ptr);
167     }
168   return new;
169 }
170
171 int
172 strncmp (char const* a, char const* b, size_t size)
173 {
174   if (!size)
175     return 0;
176   while (*a && *b && *a == *b && --size)
177     {
178       a++;
179       b++;
180     }
181   return *a - *b;
182 }
183
184 char *
185 getenv (char const* s)
186 {
187   char **p = environ;
188   int length = strlen (s);
189   while (*p)
190     {
191       if (!strncmp (s, *p, length) && *(*p + length) == '=') return (*p + length + 1);
192       p++;
193     }
194   return 0;
195 }
196
197 int
198 setenv (char const* s, char const* v, int overwrite_p)
199 {
200   char **p = environ;
201   int length = strlen (s);
202   while (*p)
203     {
204       if (!strncmp (s, *p, length) && *(*p + length) == '=')
205         break;
206       p++;
207     }
208   char *entry = malloc (length + strlen (v) + 2);
209   int end_p = *p == 0;
210   *p = entry;
211   strcpy (entry, s);
212   strcpy (entry + length, "=");
213   strcpy (entry + length + 1, v);
214   *(entry + length + strlen (v) + 2) = 0;
215   if (end_p)
216     *++p = 0;
217   return 0;
218 }
219
220 int
221 isatty (int fd)
222 {
223   return ioctl (fd, TCGETS, 0) & 0xf0;
224 }
225
226 int
227 wait (int *status_ptr)
228 {
229   return waitpid  (-1, status_ptr, 0);
230 }
231
232 int
233 execv (char const *file_name, char *const argv[])
234 {
235   return execve (file_name, argv, environ);
236 }