Cleanup in elf.c with .bss section clean; adm command mounts cdrom instead of floppy...
[ZeXOS.git] / kernel / lib / stdlib / strtol.c
blob8a499f2ca1e17d7ed936793669336a6f9b46511b
1 /*
2 * ZeX/OS
3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <ctype.h>
22 long strtol (const char *nptr, char **endptr, int base)
24 const char *s = nptr;
25 unsigned long acc;
26 unsigned char c;
27 unsigned long cutoff;
28 int neg = 0;
29 int any;
30 int cutlim;
32 do {
33 c = *s++;
34 } while (isspace (c));
36 if (c == '-') {
37 neg = 1;
38 c = *s++;
39 } else if (c == '+')
40 c = *s ++;
42 if ((base == 0 || base == 16) &&
43 c == '0' && (*s == 'x' || *s == 'X')) {
44 c = s[1];
45 s += 2;
46 base = 16;
49 if (base == 0)
50 base = c == '0' ? 8 : 10;
52 cutoff = 2147483647;
53 cutlim = cutoff % (unsigned long) base;
54 cutoff /= (unsigned long) base;
56 for (acc = 0, any = 0;; c = *s ++) {
57 if (!isascii (c))
58 break;
59 if (isdigit (c))
60 c -= '0';
61 else if (isalpha(c))
62 c -= isupper(c) ? 'A' - 10 : 'a' - 10;
63 else
64 break;
66 if (c >= base)
67 break;
68 if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
69 any = -1;
70 else {
71 any = 1;
72 acc *= base;
73 acc += c;
77 if (any < 0) {
78 acc = 2147483647;
80 } else if (neg)
81 acc = -acc;
83 if (endptr != 0)
84 *endptr = (char *) (any ? s - 1 : nptr);
86 return acc;