1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 /*
23 * AT&T Research
24 * Glenn Fowler
25 * Phong Vo
26 *
27 * common header and implementation for
28 *
29 * strtol strtoul strton
30 * strtoll strtoull strtonll
31 * strntol strntoul strnton
32 * strntoll strntoull strntonll
33 *
34 * define these macros to instantiate an implementation:
35 *
36 * S2I_function the function name
37 * S2I_number the signed number type
38 * S2I_unumber the unsigned number type
39 * S2I_unsigned 1 for unsigned, 0 for signed
40 * S2I_qualifier 1 for optional qualifier suffix, 0 otherwise
41 * S2I_multiplier 1 for optional multiplier suffix, 0 otherwise
42 * S2I_size the second argument is the input string size
43 *
44 * convert string to number
45 * errno=ERANGE on overflow (LONG_MAX) or underflow (LONG_MIN)
46 * if non-null e will point to first unrecognized char in s
47 * if basep!=0 it points to the default base on input and
48 * will point to the explicit base on return
49 * a default base of 0 will determine the base from the input
50 * a default base of 1 will determine the base from the input using bb#*
51 * a base prefix in the string overrides *b
52 * *b will not be set if the string has no base prefix
53 * if m>1 and no multipler was specified then the result is multiplied by m
54 * if m<0 then multipliers are not consumed
55 * if a base arg or prefix is specified then multiplier is not consumed
56 *
57 * integer numbers are of the form:
58 *
59 * [sign][base][number[qualifier]][multiplier]
60 *
61 * base: nnn# base nnn
62 * 0[xX] hex
63 * 0 octal
64 * [1-9] decimal
65 *
66 * number: [0-9a-zA-Z]*
67 *
68 * qualifier: [lL]
69 * [uU]
70 * [uU][lL]
71 * [lL][uU]
72 * [lL][lL][uU]
73 * [uU][lL][lL]
74 *
75 * multiplier: . pseudo-float if m>1
76 * [bB] block (512)
77 * [cC] char (1)
78 * [gG] giga (1024*1024*1024)
79 * [kK] kilo (1024)
80 * [mM] mega (1024*1024)
81 */
82
83 #include <ast.h>
84 #include <ctype.h>
85
86 #include "sfhdr.h"
87
88 #if !__STD_C && !defined(const)
89 #define const
90 #endif
91
92 #ifndef ERANGE
93 #define ERANGE EINVAL
94 #endif
95
96 #define QL 01
97 #define QU 02
98
99 #define S2I_umax (~((S2I_unumber)0))
100
101 #if S2I_unsigned
102 #define S2I_type S2I_unumber
103 #define S2I_min 0
104 #define S2I_max S2I_umax
105 #else
106 #define S2I_type S2I_number
107 #define S2I_min (-S2I_max-1)
108 #define S2I_max (S2I_umax>>1)
109 #endif
110
111 #if S2I_size
112 #define S2I_valid(s) ((s)<(z))
113 #else
114 #define S2I_valid(s) 1
115 #endif
116
117 #define ADDOVER(n,c,s) ((S2I_umax-(n))<((S2I_unumber)((c)+(s))))
118 #define MPYOVER(n,c) (((S2I_unumber)(n))>(S2I_umax/(c)))
119
120 static const S2I_unumber mm[] =
121 {
122 0,
123 S2I_umax / 1,
124 S2I_umax / 2,
125 S2I_umax / 3,
126 S2I_umax / 4,
127 S2I_umax / 5,
128 S2I_umax / 6,
129 S2I_umax / 7,
130 S2I_umax / 8,
131 S2I_umax / 9,
132 S2I_umax / 10,
133 S2I_umax / 11,
134 S2I_umax / 12,
135 S2I_umax / 13,
136 S2I_umax / 14,
137 S2I_umax / 15,
138 S2I_umax / 16,
139 S2I_umax / 17,
140 S2I_umax / 18,
141 S2I_umax / 19,
142 S2I_umax / 20,
143 S2I_umax / 21,
144 S2I_umax / 22,
145 S2I_umax / 23,
146 S2I_umax / 24,
147 S2I_umax / 25,
148 S2I_umax / 26,
149 S2I_umax / 27,
150 S2I_umax / 28,
151 S2I_umax / 29,
152 S2I_umax / 30,
153 S2I_umax / 31,
154 S2I_umax / 32,
155 S2I_umax / 33,
156 S2I_umax / 34,
157 S2I_umax / 35,
158 S2I_umax / 36,
159 S2I_umax / 37,
160 S2I_umax / 38,
161 S2I_umax / 39,
162 S2I_umax / 40,
163 S2I_umax / 41,
164 S2I_umax / 42,
165 S2I_umax / 43,
166 S2I_umax / 44,
167 S2I_umax / 45,
168 S2I_umax / 46,
169 S2I_umax / 47,
170 S2I_umax / 48,
171 S2I_umax / 49,
172 S2I_umax / 50,
173 S2I_umax / 51,
174 S2I_umax / 52,
175 S2I_umax / 53,
176 S2I_umax / 54,
177 S2I_umax / 55,
178 S2I_umax / 56,
179 S2I_umax / 57,
180 S2I_umax / 58,
181 S2I_umax / 59,
182 S2I_umax / 60,
183 S2I_umax / 61,
184 S2I_umax / 62,
185 S2I_umax / 63,
186 S2I_umax / 64,
187 };
188
189 #if defined(__EXPORT__)
190 #define extern __EXPORT__
191 #endif
192 extern S2I_type
193 #undef extern
194 #if S2I_size
195 #if S2I_multiplier
196 #if __STD_C
S2I_function(const char * a,size_t size,char ** e,char * basep,int m)197 S2I_function(const char* a, size_t size, char** e, char* basep, int m)
198 #else
199 S2I_function(a, size, e, basep, m) const char* a; size_t size; char** e; char* basep; int m;
200 #endif
201 #else
202 #if __STD_C
203 S2I_function(const char* a, size_t size, char** e, int base)
204 #else
205 S2I_function(a, size, e, base) const char* a; size_t size; char** e; int base;
206 #endif
207 #endif
208 #else
209 #if S2I_multiplier
210 #if __STD_C
211 S2I_function(const char* a, char** e, char* basep, int m)
212 #else
213 S2I_function(a, e, basep, m) const char* a; char** e; char* basep; int m;
214 #endif
215 #else
216 #if __STD_C
217 S2I_function(const char* a, char** e, int base)
218 #else
219 S2I_function(a, e, base) const char* a; char** e; int base;
220 #endif
221 #endif
222 #endif
223 {
224 register unsigned char* s = (unsigned char*)a;
225 #if S2I_size
226 register unsigned char* z = s + size;
227 #endif
228 register S2I_unumber n;
229 register S2I_unumber x;
230 register int c;
231 register int shift;
232 register unsigned char* p;
233 register unsigned char* cv;
234 unsigned char* b;
235 unsigned char* k;
236 S2I_unumber v;
237 #if S2I_multiplier
238 register int base;
239 #endif
240 int negative;
241 int overflow = 0;
242 int decimal = 0;
243 int thousand = 0;
244 #if !S2I_unsigned
245 int qualifier = 0;
246 #endif
247
248 #if S2I_multiplier
249 base = basep ? *((unsigned char*)basep) : 0;
250 #else
251 if (base > 36 && base <= SF_RADIX)
252 {
253 static int conformance = -1;
254
255 if (conformance < 0)
256 conformance = !strcmp(astconf("CONFORMANCE", NiL, NiL), "standard");
257 if (conformance)
258 base = 1;
259 }
260 #endif
261 if (base && (base < 2 || base > SF_RADIX))
262 {
263 errno = EINVAL;
264 return 0;
265 }
266 while (S2I_valid(s) && isspace(*s))
267 s++;
268 if ((negative = S2I_valid(s) && (*s == '-')) || S2I_valid(s) && *s == '+')
269 k = ++s;
270 else
271 k = 0;
272 p = s;
273 if (!base)
274 {
275 if (S2I_valid(p) && (c = *p++) >= '0' && c <= '9')
276 {
277 n = c - '0';
278 if (S2I_valid(p) && (c = *p) >= '0' && c <= '9')
279 {
280 n = (n << 3) + (n << 1) + c - '0';
281 p++;
282 }
283 if (S2I_valid(p) && *p == '#')
284 {
285 if (n >= 2 && n <= 64)
286 {
287 k = s = p + 1;
288 base = n;
289 }
290 }
291 else if (base)
292 base = 0;
293 else if (S2I_valid(s) && *s == '0' && S2I_valid(s + 1))
294 {
295 if ((c = *(s + 1)) == 'x' || c == 'X')
296 {
297 k = s += 2;
298 base = 16;
299 }
300 else if (c >= '0' && c <= '7')
301 {
302 s++;
303 base = 8;
304 }
305 }
306 }
307 if (!base)
308 base = 10;
309 else if (base < 2 || base > SF_RADIX)
310 {
311 errno = EINVAL;
312 return 0;
313 }
314 #if S2I_multiplier
315 else
316 {
317 if (basep)
318 *basep = base;
319 m = -1;
320 }
321 #endif
322 }
323 #if S2I_multiplier
324 else
325 m = -1;
326 #endif
327
328 /*
329 * this part transcribed from sfvscanf()
330 */
331
332 SFSETLOCALE(&decimal, &thousand);
333 x = mm[base];
334 n = 0;
335 if (base == 10)
336 {
337 b = s;
338 p = 0;
339 for (;;)
340 {
341 if (S2I_valid(s) && (c = *s++) >= '0' && c <= '9')
342 {
343 if (n > x)
344 overflow = 1;
345 else
346 {
347 n = (n << 3) + (n << 1);
348 c -= '0';
349 if (ADDOVER(n, c, negative))
350 overflow = 1;
351 n += c;
352 }
353 }
354 else if (p && (s - p) != (3 + S2I_valid(s)))
355 {
356 s = p;
357 n = v;
358 c = 0;
359 break;
360 }
361 else if (!S2I_valid(s) || c != thousand)
362 break;
363 else if (!p && (s - b) > 4)
364 {
365 if (e)
366 *e = (char*)s - 1;
367 if (overflow)
368 {
369 errno = ERANGE;
370 #if S2I_unsigned
371 n = S2I_max;
372 #else
373 n = negative ? S2I_min : S2I_max;
374 #endif
375 }
376 return n;
377 }
378 else
379 {
380 p = s;
381 v = n;
382 }
383 }
384 }
385 else
386 {
387 SFCVINIT();
388 cv = base <= 36 ? _Sfcv36 : _Sfcv64;
389 if ((base & ~(base - 1)) == base)
390 {
391 #if !S2I_unsigned
392 qualifier |= QU;
393 #endif
394 if (base < 8)
395 shift = base < 4 ? 1 : 2;
396 else if (base < 32)
397 shift = base < 16 ? 3 : 4;
398 else
399 shift = base < 64 ? 5 : 6;
400 while (S2I_valid(s) && (c = cv[*s++]) < base)
401 {
402 if (n > x)
403 overflow = 1;
404 else
405 {
406 n <<= shift;
407 if (ADDOVER(n, c, negative))
408 overflow = 1;
409 n += c;
410 }
411 }
412 }
413 else
414 while (S2I_valid(s) && (c = cv[*s++]) < base)
415 {
416 if (n > x)
417 overflow = 1;
418 else
419 {
420 n *= base;
421 if (ADDOVER(n, c, negative))
422 overflow = 1;
423 n += c;
424 }
425 }
426 c = *(s - 1);
427 }
428
429 #if S2I_qualifier
430
431 /*
432 * optional qualifier suffix
433 */
434
435 if (S2I_valid(s) && s > (unsigned char*)(a + 1))
436 {
437 base = 0;
438 for (;;)
439 {
440 if (!(base & QL) && (c == 'l' || c == 'L'))
441 {
442 base |= QL;
443 if (!S2I_valid(s))
444 break;
445 c = *s++;
446 if (c == 'l' || c == 'L')
447 {
448 if (!S2I_valid(s))
449 break;
450 c = *s++;
451 }
452 }
453 else if (!(base & QU) && (c == 'u' || c == 'U'))
454 {
455 base |= QU;
456 #if !S2I_unsigned
457 qualifier |= QU;
458 #endif
459 if (!S2I_valid(s))
460 break;
461 c = *s++;
462 }
463 else
464 break;
465 }
466 }
467 #endif
468 if (S2I_valid(s))
469 {
470 #if S2I_multiplier
471 /*
472 * optional multiplier suffix
473 */
474
475 if (m < 0 || s == (unsigned char*)(a + 1))
476 s--;
477 else
478 {
479 switch (c)
480 {
481 case 'b':
482 case 'B':
483 shift = 9;
484 break;
485 case 'k':
486 case 'K':
487 shift = 10;
488 break;
489 case 'm':
490 case 'M':
491 shift = 20;
492 break;
493 case 'g':
494 case 'G':
495 shift = 30;
496 break;
497 case 't':
498 case 'T':
499 shift = 40;
500 break;
501 case 'p':
502 case 'P':
503 shift = 50;
504 break;
505 case 'e':
506 case 'E':
507 shift = 60;
508 break;
509 default:
510 if (m <= 1)
511 v = 0;
512 else if (c == decimal && S2I_valid(s))
513 {
514 if (MPYOVER(n, m))
515 overflow = 1;
516 n *= m;
517 v = 0;
518 while (S2I_valid(s) && (c = *s++) >= '0' && c <= '9')
519 v += (m /= 10) * (c - '0');
520 if (ADDOVER(n, v, negative))
521 overflow = 1;
522 n += v;
523 v = 0;
524 }
525 else
526 v = m;
527 s--;
528 shift = 0;
529 break;
530 }
531 if (shift)
532 {
533 if (S2I_valid(s))
534 switch (*s)
535 {
536 case 'b':
537 case 'B':
538 case 'i':
539 case 'I':
540 s++;
541 break;
542 }
543 #if S2I_unsigned
544 if (shift >= (sizeof(S2I_type) * CHAR_BIT))
545 #else
546 if (shift >= (sizeof(S2I_type) * CHAR_BIT - 1))
547 #endif
548 {
549 v = 0;
550 overflow = 1;
551 }
552 else
553 v = ((S2I_unumber)1) << shift;
554 }
555 if (v)
556 {
557 if (MPYOVER(n, v))
558 overflow = 1;
559 n *= v;
560 }
561 }
562 #else
563 s--;
564 #endif
565 }
566 if (s == k)
567 {
568 s--;
569 #if S2I_multiplier
570 if (basep)
571 *basep = 10;
572 #endif
573 }
574 #if !S2I_unsigned
575 else if (!(qualifier & QU))
576 {
577 if (negative)
578 {
579 if (!n)
580 {
581 b = k;
582 do
583 {
584 if (b >= s)
585 {
586 negative = 0;
587 break;
588 }
589 } while (*b++ == '0');
590 }
591 if (negative && (n - 1) > S2I_max)
592 overflow = 1;
593 }
594 else if (n > S2I_max)
595 overflow = 1;
596 }
597 #endif
598 if (e)
599 *e = (char*)s;
600 if (overflow)
601 {
602 #if !S2I_unsigned
603 if (negative)
604 {
605 if (x << 1)
606 errno = ERANGE;
607 return (S2I_type)S2I_min;
608 }
609 #endif
610 errno = ERANGE;
611 return (S2I_type)S2I_max;
612 }
613 return negative ? -n : n;
614 }
615