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:
Andrey A. Chernov 2005-01-21 00:42:13 +00:00
parent f3f8276732
commit 2571c7f720
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=140536
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;