Contents of /trunk/mkinitrd-magellan/klibc/usr/klibc/strntoumax.c
Parent Directory | Revision Log
Revision 815 -
(show annotations)
(download)
Fri Apr 24 18:32:46 2009 UTC (15 years ago) by niro
File MIME type: text/plain
File size: 1253 byte(s)
Fri Apr 24 18:32:46 2009 UTC (15 years ago) by niro
File MIME type: text/plain
File size: 1253 byte(s)
-updated to klibc-1.5.15
1 | /* |
2 | * strntoumax.c |
3 | * |
4 | * The strntoumax() function and associated |
5 | */ |
6 | |
7 | #include <stddef.h> |
8 | #include <stdint.h> |
9 | #include <ctype.h> |
10 | #include <inttypes.h> |
11 | |
12 | static inline int digitval(int ch) |
13 | { |
14 | if (ch >= '0' && ch <= '9') { |
15 | return ch - '0'; |
16 | } else if (ch >= 'A' && ch <= 'Z') { |
17 | return ch - 'A' + 10; |
18 | } else if (ch >= 'a' && ch <= 'z') { |
19 | return ch - 'a' + 10; |
20 | } else { |
21 | return -1; |
22 | } |
23 | } |
24 | |
25 | uintmax_t strntoumax(const char *nptr, char **endptr, int base, size_t n) |
26 | { |
27 | int minus = 0; |
28 | uintmax_t v = 0; |
29 | int d; |
30 | |
31 | while (n && isspace((unsigned char)*nptr)) { |
32 | nptr++; |
33 | n--; |
34 | } |
35 | |
36 | /* Single optional + or - */ |
37 | if (n) { |
38 | char c = *nptr; |
39 | if (c == '-' || c == '+') { |
40 | minus = (c == '-'); |
41 | nptr++; |
42 | n--; |
43 | } |
44 | } |
45 | |
46 | if (base == 0) { |
47 | if (n >= 2 && nptr[0] == '0' && |
48 | (nptr[1] == 'x' || nptr[1] == 'X')) { |
49 | n -= 2; |
50 | nptr += 2; |
51 | base = 16; |
52 | } else if (n >= 1 && nptr[0] == '0') { |
53 | n--; |
54 | nptr++; |
55 | base = 8; |
56 | } else { |
57 | base = 10; |
58 | } |
59 | } else if (base == 16) { |
60 | if (n >= 2 && nptr[0] == '0' && |
61 | (nptr[1] == 'x' || nptr[1] == 'X')) { |
62 | n -= 2; |
63 | nptr += 2; |
64 | } |
65 | } |
66 | |
67 | while (n && (d = digitval(*nptr)) >= 0 && d < base) { |
68 | v = v * base + d; |
69 | n--; |
70 | nptr++; |
71 | } |
72 | |
73 | if (endptr) |
74 | *endptr = (char *)nptr; |
75 | |
76 | return minus ? -v : v; |
77 | } |