2008-11-24 Craig Howland <howland@LGSInnovations.com>
* libc/stdlib/wcstoull_r.c: Add EINVAL return for bad base value, include wchar.h for prototype, remove extraneous includes, use C99/POSIX ULLONG_MAX (but allow for poor limits.h). * libc/stdlib/wcstoull.c: Fix usage comments (mistakes and to add base value check noted above), remove extraneous includes. * libc/stdio/asnprintf.c: Add #include "local.h" to get function prototype for _svfprintf_r(). * libc/stdio/vasnprintf.c: Ditto. * libc/stdio/local.h: Add function prototype for __submore(). * libc/include/stdio.h: Add function prototypes for _fseeko_r and _ftello_r. * libc/posix/namespace.h: Commented out define for write to eliminate write() prototype being missing for collate.c (which is the only file that presently includes namespace.h). * libc/include/reent.h: Added _rename_r. * libc/reent/renamer.c: Corrected function prototypes in synopses. * libc/locale/ldpart.c: Use struct stat64 when calling fstat64.
This commit is contained in:
@ -16,7 +16,7 @@ ANSI_SYNOPSIS
|
||||
wchar_t **<[ptr]>, int <[base]>);
|
||||
|
||||
TRAD_SYNOPSIS
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
unsigned long long wcstoull(<[s]>, <[ptr]>, <[base]>)
|
||||
wchar_t *<[s]>;
|
||||
wchar_t **<[ptr]>;
|
||||
@ -40,8 +40,9 @@ to convert the subject string into an unsigned long long integer, and returns th
|
||||
result.
|
||||
|
||||
If the value of <[base]> is zero, the subject string is expected to look
|
||||
like a normal C integer constant (save that no optional sign is permitted):
|
||||
a possible <<0x>> indicating hexadecimal radix, and a number.
|
||||
like a normal C integer constant: an optional sign (<<+>> or <<->>),
|
||||
a possible <<0x>> indicating hexadecimal radix or a possible <0> indicating
|
||||
octal radix, and a number.
|
||||
If <[base]> is between 2 and 36, the expected form of the subject is a
|
||||
sequence of digits (which may include letters, depending on the
|
||||
base) representing an integer in the radix specified by <[base]>.
|
||||
@ -73,10 +74,13 @@ extra argument <[reent]> is a pointer to a reentrancy structure.
|
||||
|
||||
|
||||
RETURNS
|
||||
<<wcstoull>> returns <<0>> and sets <<errno>> to <<EINVAL>> if the value of
|
||||
<[base]> is not supported.
|
||||
|
||||
<<wcstoull>> returns the converted value, if any. If no conversion was
|
||||
made, <<0>> is returned.
|
||||
|
||||
<<wcstoull>> returns <<ULONG_LONG_MAX>> if the magnitude of the converted
|
||||
<<wcstoull>> returns <<ULLONG_MAX>> if the magnitude of the converted
|
||||
value is too large, and sets <<errno>> to <<ERANGE>>.
|
||||
|
||||
PORTABILITY
|
||||
@ -119,10 +123,7 @@ PORTABILITY
|
||||
*/
|
||||
|
||||
#include <_ansi.h>
|
||||
#include <limits.h>
|
||||
#include <wctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <reent.h>
|
||||
|
||||
#ifndef _REENT_ONLY
|
||||
|
@ -45,11 +45,17 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <_ansi.h>
|
||||
#include <limits.h>
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <reent.h>
|
||||
|
||||
/* Make up for older non-compliant limits.h. (This is a C99/POSIX function,
|
||||
* and both require ULLONG_MAX in limits.h.) */
|
||||
#if !defined(ULLONG_MAX)
|
||||
# define ULLONG_MAX ULONG_LONG_MAX
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Convert a wide string to an unsigned long long integer.
|
||||
*
|
||||
@ -69,6 +75,10 @@ _DEFUN (_wcstoull_r, (rptr, nptr, endptr, base),
|
||||
register unsigned long long cutoff;
|
||||
register int neg = 0, any, cutlim;
|
||||
|
||||
if(base < 0 || base == 1 || base > 36) {
|
||||
rptr->_errno = EINVAL;
|
||||
return(0ULL);
|
||||
}
|
||||
/*
|
||||
* See strtol for comments as to the logic used.
|
||||
*/
|
||||
@ -88,8 +98,8 @@ _DEFUN (_wcstoull_r, (rptr, nptr, endptr, base),
|
||||
}
|
||||
if (base == 0)
|
||||
base = c == L'0' ? 8 : 10;
|
||||
cutoff = (unsigned long long)ULONG_LONG_MAX / (unsigned long long)base;
|
||||
cutlim = (unsigned long long)ULONG_LONG_MAX % (unsigned long long)base;
|
||||
cutoff = (unsigned long long)ULLONG_MAX / (unsigned long long)base;
|
||||
cutlim = (unsigned long long)ULLONG_MAX % (unsigned long long)base;
|
||||
for (acc = 0, any = 0;; c = *s++) {
|
||||
if (iswdigit(c))
|
||||
c -= L'0';
|
||||
@ -108,7 +118,7 @@ _DEFUN (_wcstoull_r, (rptr, nptr, endptr, base),
|
||||
}
|
||||
}
|
||||
if (any < 0) {
|
||||
acc = ULONG_LONG_MAX;
|
||||
acc = ULLONG_MAX;
|
||||
rptr->_errno = ERANGE;
|
||||
} else if (neg)
|
||||
acc = -acc;
|
||||
|
Reference in New Issue
Block a user