1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16: #include <ctype.h>
17:
18:
19:
20:
21:
22:
23:
24: static const char cvtIn[] = {
25: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
26: 100, 100, 100, 100, 100, 100, 100,
27: 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
28: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
29: 30, 31, 32, 33, 34, 35,
30: 100, 100, 100, 100, 100, 100,
31: 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
32: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
33: 30, 31, 32, 33, 34, 35};
34: ^L
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55: unsigned long int
56: strtoul(
57: const char *string,
58:
59:
60:
61:
62: char **endPtr,
63:
64: int base)
65:
66:
67:
68:
69:
70: {
71: register const char *p;
72: register unsigned long int result = 0;
73: register unsigned digit;
74: int anyDigits = 0;
75:
76:
77:
78:
79:
80: p = string;
81: while (isspace(*p)) {
82: p += 1;
83: }
84:
85:
86:
87:
88:
89:
90: if (base == 0)
91: {
92: if (*p == '0') {
93: p += 1;
94: if (*p == 'x') {
95: p += 1;
96: base = 16;
97: } else {
98:
99:
100:
101:
102:
103:
104: anyDigits = 1;
105: base = 8;
106: }
107: }
108: else base = 10;
109: } else if (base == 16) {
110:
111:
112:
113:
114:
115: if ((p[0] == '0') && (p[1] == 'x')) {
116: p += 2;
117: }
118: }
119:
120:
121:
122:
123:
124:
125: if (base == 8) {
126: for ( ; ; p += 1) {
127: digit = *p - '0';
128: if (digit > 7) {
129: break;
130: }
131: result = (result << 3) + digit;
132: anyDigits = 1;
133: }
134: } else if (base == 10) {
135: for ( ; ; p += 1) {
136: digit = *p - '0';
137: if (digit > 9) {
138: break;
139: }
140: result = (10*result) + digit;
141: anyDigits = 1;
142: }
143: } else if (base == 16) {
144: for ( ; ; p += 1) {
145: digit = *p - '0';
146: if (digit > ('z' - '0')) {
147: break;
148: }
149: digit = cvtIn[digit];
150: if (digit > 15) {
151: break;
152: }
153: result = (result << 4) + digit;
154: anyDigits = 1;
155: }
156: } else {
157: for ( ; ; p += 1) {
158: digit = *p - '0';
159: if (digit > ('z' - '0')) {
160: break;
161: }
162: digit = cvtIn[digit];
163: if (digit >= base) {
164: break;
165: }
166: result = result*base + digit;
167: anyDigits = 1;
168: }
169: }
170:
171:
172:
173:
174:
175: if (!anyDigits) {
176: p = string;
177: }
178:
179: if (endPtr != 0) {
180: *endPtr = (char *)p;
181: }
182:
183: return result;
184: }