POSIX says that 0[xX] prefix is _optional_ even in base 16 case, make it

really so.

"If the value of base is 16, the characters 0x or 0X may optionally
precede the sequence of letters and digits, following the sign if
present."

Found by:       joerg
This commit is contained in:
ache 2005-01-21 00:42:13 +00:00
parent da1618943d
commit b05ac67f5e
6 changed files with 30 additions and 6 deletions

View File

@ -75,7 +75,11 @@ strtoimax(const char * __restrict nptr, char ** __restrict endptr, int base)
c = *s++;
}
if ((base == 0 || base == 16) &&
c == '0' && (*s == 'x' || *s == 'X')) {
c == '0' && (*s == 'x' || *s == 'X') &&
((s[1] >= 'a' && s[1] <= 'f') ||
(s[1] >= 'A' && s[1] <= 'F') ||
(s[1] >= '0' && s[1] <= '9'))
) {
c = s[1];
s += 2;
base = 16;

View File

@ -76,7 +76,11 @@ strtol(const char * __restrict nptr, char ** __restrict endptr, int base)
c = *s++;
}
if ((base == 0 || base == 16) &&
c == '0' && (*s == 'x' || *s == 'X')) {
c == '0' && (*s == 'x' || *s == 'X') &&
((s[1] >= 'a' && s[1] <= 'f') ||
(s[1] >= 'A' && s[1] <= 'F') ||
(s[1] >= '0' && s[1] <= '9'))
) {
c = s[1];
s += 2;
base = 16;

View File

@ -75,7 +75,11 @@ strtoll(const char * __restrict nptr, char ** __restrict endptr, int base)
c = *s++;
}
if ((base == 0 || base == 16) &&
c == '0' && (*s == 'x' || *s == 'X')) {
c == '0' && (*s == 'x' || *s == 'X') &&
((s[1] >= 'a' && s[1] <= 'f') ||
(s[1] >= 'A' && s[1] <= 'F') ||
(s[1] >= '0' && s[1] <= '9'))
) {
c = s[1];
s += 2;
base = 16;

View File

@ -73,7 +73,11 @@ strtoul(const char * __restrict nptr, char ** __restrict endptr, int base)
c = *s++;
}
if ((base == 0 || base == 16) &&
c == '0' && (*s == 'x' || *s == 'X')) {
c == '0' && (*s == 'x' || *s == 'X') &&
((s[1] >= 'a' && s[1] <= 'f') ||
(s[1] >= 'A' && s[1] <= 'F') ||
(s[1] >= '0' && s[1] <= '9'))
) {
c = s[1];
s += 2;
base = 16;

View File

@ -73,7 +73,11 @@ strtoull(const char * __restrict nptr, char ** __restrict endptr, int base)
c = *s++;
}
if ((base == 0 || base == 16) &&
c == '0' && (*s == 'x' || *s == 'X')) {
c == '0' && (*s == 'x' || *s == 'X') &&
((s[1] >= 'a' && s[1] <= 'f') ||
(s[1] >= 'A' && s[1] <= 'F') ||
(s[1] >= '0' && s[1] <= '9'))
) {
c = s[1];
s += 2;
base = 16;

View File

@ -73,7 +73,11 @@ strtoumax(const char * __restrict nptr, char ** __restrict endptr, int base)
c = *s++;
}
if ((base == 0 || base == 16) &&
c == '0' && (*s == 'x' || *s == 'X')) {
c == '0' && (*s == 'x' || *s == 'X') &&
((s[1] >= 'a' && s[1] <= 'f') ||
(s[1] >= 'A' && s[1] <= 'F') ||
(s[1] >= '0' && s[1] <= '9'))
) {
c = s[1];
s += 2;
base = 16;