mlibc: Cleanup.
[mes.git] / lib / libmes.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 <libmes.h>
22
23 int
24 isdigit (int c)
25 {
26   return c >= '0' && c <= '9';
27 }
28
29 int
30 isxdigit (int c)
31 {
32   return isdigit (c) || c >= 'a' && c <= 'f';
33 }
34
35 int
36 isspace (int c)
37 {
38   return (c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r' || c == ' ');
39 }
40
41 int
42 isnumber (int c, int base)
43 {
44   if (base == 2)
45     return (c >= '0') && (c <= '1');
46   if (base == 8)
47     return (c >= '0') && (c <= '7');
48   if (base == 10)
49     return isdigit (c);
50   if (base == 16)
51     return isxdigit (c);
52 }
53
54 int
55 abtoi (char const **p, int base)
56 {
57   char const *s = *p;
58   int i = 0;
59   int sign = 1;
60   if (!base) base = 10;
61   if (*s && *s == '-')
62     {
63       sign = -1;
64       s++;
65     }
66   while (isnumber (*s, base))
67     {
68       i *= base;
69       int m = *s > '9' ? 'a' - 10 : '0';
70       i += *s - m;
71       s++;
72     }
73   *p = s;
74   return i * sign;
75 }
76
77 int
78 atoi (char const *s)
79 {
80   char const *p = s;
81   return abtoi (&p, 0);
82 }
83
84 char const*
85 itoa (int x)
86 {
87   static char itoa_buf[12];
88   char *p = itoa_buf + 11;
89   *p-- = 0;
90
91   int sign = 0;
92   unsigned u = x;
93   if (x < 0)
94     {
95       sign = 1;
96       u = -x;
97     }
98
99   do
100      {
101        *p-- = '0' + (u % 10);
102        u = u / 10;
103      } while (u);
104
105   if (sign && *(p + 1) != '0')
106     *p-- = '-';
107
108   return p+1;
109 }
110
111 char const*
112 itoab (int x, int base)
113 {
114   static char itoa_buf[12];
115   char *p = itoa_buf + 11;
116   *p-- = 0;
117
118   int sign = 0;
119   unsigned u = x;
120   if (x < 0)
121     {
122       sign = 1;
123       u = -x;
124     }
125
126   do
127      {
128        int i = u % base;
129        *p-- = i > 9 ? 'a' + i - 10 : '0' + i;
130        x = u / base;
131      } while (u);
132
133   if (sign && *(p + 1) != '0')
134     *p-- = '-';
135
136   return p+1;
137 }
138
139 int _ungetc_pos = -1;
140 char _ungetc_buf[10];
141
142 int
143 fdgetc (int fd)
144 {
145   char c;
146   int i;
147   if (_ungetc_pos == -1)
148     {
149       int r = read (fd, &c, 1);
150       if (r < 1)
151         return -1;
152       i = c;
153    }
154   else
155     {
156       i = _ungetc_buf[_ungetc_pos];
157       _ungetc_pos -= 1;
158      }
159   if (i < 0)
160     i += 256;
161
162   return i;
163 }
164
165 int
166 fdputc (int c, int fd)
167 {
168   write (fd, (char*)&c, 1);
169   return 0;
170 }
171
172 int
173 putchar (int c)
174 {
175   write (STDOUT, (char*)&c, 1);
176   return 0;
177 }
178
179 int
180 fdputs (char const* s, int fd)
181 {
182   int i = strlen (s);
183   write (fd, s, i);
184   return 0;
185 }
186
187 int
188 fdungetc (int c, int fd)
189 {
190   _ungetc_pos++;
191   _ungetc_buf[_ungetc_pos] = c;
192   return c;
193 }
194
195 int
196 getchar ()
197 {
198   return fdgetc (g_stdin);
199 }