From 96e9773eb764afa649b099a6e283dba4c69389a9 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 16 Apr 2012 16:55:24 -0400 Subject: use the new integer parser (FILE/shgetc based) for strtol, wcstol, etc. --- src/internal/intparse.c | 116 ------------------------------------------------ src/internal/intparse.h | 11 ----- 2 files changed, 127 deletions(-) delete mode 100644 src/internal/intparse.c delete mode 100644 src/internal/intparse.h (limited to 'src/internal') diff --git a/src/internal/intparse.c b/src/internal/intparse.c deleted file mode 100644 index fba38c0a..00000000 --- a/src/internal/intparse.c +++ /dev/null @@ -1,116 +0,0 @@ -#include -#include -#include -#include -#include "intparse.h" - -/* Lookup table for digit values. -1==255>=36 -> invalid */ -static const unsigned char digits[] = { --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, --1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, -25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1, --1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, -25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -}; - -#define SLIM (UINT_MAX/36-1) - -int __intparse(struct intparse *v, const void *buf, size_t n) -{ - const unsigned char *s = buf; - int d, b = v->base; - uintmax_t llim; - - v->cnt += n; - for (; n; n--, s++) switch (v->state) { - case 0: - v->err = EINVAL; - v->state++; - if (*s=='+' || *s=='-') { - v->neg = *s=='-'; - continue; - } - case 1: - v->state++; - if (*s=='0' && (!b || b==16)) continue; - if (!b) v->base = b = 10; - v->state++; - goto firstdigit; - case 2: - v->state++; - if ((!b || b==16) && (*s|32) == 'x') { - v->err = 0; - v->base = b = 16; - continue; - } - if (!b) v->base = b = 8; - goto seconddigit; - case 3: - firstdigit: - if (digits[*s] >= b) { - n++; - goto finished; - } - seconddigit: - v->err = 0; - v->state++; - case 4: - if (b==10) { - for (; n && *s-'0'<10U && v->small<=SLIM; n--, s++) - v->small = v->small * 10 + (*s-'0'); - } else if ((b&-b) == b) { - /* Compute bitshift for power-of-two bases - * using a De Bruijn B(2,3) sequence. */ - int bs = "\0\1\2\4\7\3\6\5"[(0x17*b)>>5&7]; - for (; n && (d=digits[*s])small<=SLIM; n--, s++) - v->small = (v->small<small<=SLIM; n--, s++) - v->small = v->small * b + d; - } - if (!n) return 1; - v->state++; - v->val = v->small; - case 5: - if (b==10) { - for (; n && *s-'0'<10U && v->val<=UINTMAX_MAX/10 && (*s-'0')<=UINTMAX_MAX-10*v->val; n--, s++) - v->val = v->val * 10 + (*s-'0'); - } else if ((b&-b) == b) { - int bs = "\0\1\2\4\7\3\6\5"[(0x17*b)>>5&7]; - llim = UINTMAX_MAX>>bs; - for (; n && (d=digits[*s])val<=llim; n--, s++) - v->val = (v->val<val<=llim && d<=UINTMAX_MAX-b*v->val; n--, s++) - v->val = v->val * b + d; - } - if (!n) return 1; - if (d >= b) goto finished; - v->state++; - case 6: - if (n && digits[*s]err = ERANGE; - v->val = UINTMAX_MAX; - n--; s++; - for (; n && digits[*s]cnt -= n; - return 0; -} diff --git a/src/internal/intparse.h b/src/internal/intparse.h deleted file mode 100644 index 78e800d1..00000000 --- a/src/internal/intparse.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -struct intparse { - uintmax_t val; - unsigned small; - size_t cnt; - char neg, base, state, err; -}; - -int __intparse(struct intparse *, const void *, size_t); -- cgit v1.2.1