diff options
Diffstat (limited to 'lib/libc/locale/wcstoull.c')
-rw-r--r-- | lib/libc/locale/wcstoull.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/lib/libc/locale/wcstoull.c b/lib/libc/locale/wcstoull.c index 6a04d213ff9b..db77acd2a55d 100644 --- a/lib/libc/locale/wcstoull.c +++ b/lib/libc/locale/wcstoull.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,15 +34,6 @@ * SUCH DAMAGE. */ -#include <sys/cdefs.h> -#if 0 -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strtouq.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ -__FBSDID("FreeBSD: src/lib/libc/stdlib/strtoull.c,v 1.18 2002/09/06 11:23:59 tjr Exp "); -#endif -__FBSDID("$FreeBSD$"); - #include <errno.h> #include <limits.h> #include <stdlib.h> @@ -80,11 +71,21 @@ wcstoull_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, 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; |