diff options
Diffstat (limited to 'lib/libc/locale/wcstol.c')
-rw-r--r-- | lib/libc/locale/wcstol.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/libc/locale/wcstol.c b/lib/libc/locale/wcstol.c index 98bd5f85a4d1..2b83187347c2 100644 --- a/lib/libc/locale/wcstol.c +++ b/lib/libc/locale/wcstol.c @@ -5,7 +5,7 @@ * The Regents of the University of California. All rights reserved. * * Copyright (c) 2011 The FreeBSD Foundation - * All rights reserved. + * * Portions of this software were developed by David Chisnall * under sponsorship from the FreeBSD Foundation. * @@ -34,9 +34,6 @@ * SUCH DAMAGE. */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - #include <ctype.h> #include <errno.h> #include <limits.h> @@ -65,7 +62,7 @@ wcstol_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, int do { c = *s++; } while (iswspace_l(c, locale)); - if (c == '-') { + if (c == L'-') { neg = 1; c = *s++; } else { @@ -74,11 +71,21 @@ wcstol_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, int c = *s++; } if ((base == 0 || base == 16) && - c == L'0' && (*s == L'x' || *s == L'X')) { + c == L'0' && (*s == L'x' || *s == L'X') && + ((s[1] >= L'0' && s[1] <= L'9') || + (s[1] >= L'A' && s[1] <= L'F') || + (s[1] >= L'a' && s[1] <= L'f'))) { c = s[1]; s += 2; base = 16; } + if ((base == 0 || base == 2) && + c == L'0' && (*s == L'b' || *s == L'B') && + (s[1] >= L'0' && s[1] <= L'1')) { + c = s[1]; + s += 2; + base = 2; + } if (base == 0) base = c == L'0' ? 8 : 10; acc = any = 0; |