Print this page
cpp: don't handroll an incorrect strtoul(3c), use the one in libc
The previous implementation would parse 0x7ff as 0x755 (etc).
*** 78,88 ****
#define COFF 128
#else
#define COFF 0
#endif
! static int tobinary(char *, int);
int
yylex(void)
{
static int ifdef=0;
--- 78,88 ----
#define COFF 128
#else
#define COFF 0
#endif
! static long tobinary(char *, int);
int
yylex(void)
{
static int ifdef=0;
*** 133,165 ****
ret:
*newp=savc; outp=inp=newp; return(val);
}
}
! static int
! tobinary(st, b)
! char *st;
! int b;
{
! int n, c, t;
! char *s;
! n=0;
! s=st;
! while ((c = *s++) != '\0') {
! switch(c) {
! case '0': case '1': case '2': case '3': case '4':
! case '5': case '6': case '7': case '8': case '9':
! t = c-'0'; break;
! case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
! t = c-'a'; if (b>10) break;
! case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
! t = c - 'A'; if (b>10) break;
! default:
! t = -1;
! if ( c=='l' || c=='L') if (*s=='\0') break;
! pperror("Illegal number %s", st);
}
! if (t<0) break;
! n = n*b+t;
! }
! return(n);
}
--- 133,152 ----
ret:
*newp=savc; outp=inp=newp; return(val);
}
}
! static long
! tobinary(char *st, int b)
{
! char *tmp;
! int n;
! n = strtoul(st, &tmp, b);
! if (*tmp != '\0') {
! if ((strcasecmp(tmp, "L") != 0) &&
! (strcasecmp(tmp, "LL") != 0) &&
! (strcasecmp(tmp, "UL") != 0) &&
! (strcasecmp(tmp, "ULL") != 0))
! pperror("illegal number: %s", st);
}
! return(n);
}