* libc/include/wchar.h: Declare wcstol, wcstoll, wcstoul,
wcstoull, _wcstol_r, _wcstoll_r, _wcstoul_r and _wcstoull_r. * libc/stdlib/Makefile.am (GENERAL_SOURCES): Add wcstol.c and wcstoul.c. (EXTENDED_SOURCES): Add wcstoll.c, wcstoll_r.c, wcstoull.c and wcstoull_r.c. (CHEWOUT_FILES): Add .def files accordingly. * libc/stdlib/Makefile.in: Regenerate. * libc/stdlib/stdlib.tex: Add documentation links for above functions. * libc/stdlib/strtoll.c: Fix portability note. * libc/stdlib/strtoull.c: Ditto. * libc/stdlib/wcstol.c: New file. * libc/stdlib/wcstoll.c: New file. * libc/stdlib/wcstoll_r.c: New file. * libc/stdlib/wcstoul.c: New file. * libc/stdlib/wcstoull.c: New file. * libc/stdlib/wcstoull_r.c: New file.
This commit is contained in:
parent
4cd2304ab6
commit
dec27025b2
@ -1,3 +1,22 @@
|
|||||||
|
2007-07-06 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* libc/include/wchar.h: Declare wcstol, wcstoll, wcstoul,
|
||||||
|
wcstoull, _wcstol_r, _wcstoll_r, _wcstoul_r and _wcstoull_r.
|
||||||
|
* libc/stdlib/Makefile.am (GENERAL_SOURCES): Add wcstol.c and wcstoul.c.
|
||||||
|
(EXTENDED_SOURCES): Add wcstoll.c, wcstoll_r.c, wcstoull.c and
|
||||||
|
wcstoull_r.c.
|
||||||
|
(CHEWOUT_FILES): Add .def files accordingly.
|
||||||
|
* libc/stdlib/Makefile.in: Regenerate.
|
||||||
|
* libc/stdlib/stdlib.tex: Add documentation links for above functions.
|
||||||
|
* libc/stdlib/strtoll.c: Fix portability note.
|
||||||
|
* libc/stdlib/strtoull.c: Ditto.
|
||||||
|
* libc/stdlib/wcstol.c: New file.
|
||||||
|
* libc/stdlib/wcstoll.c: New file.
|
||||||
|
* libc/stdlib/wcstoll_r.c: New file.
|
||||||
|
* libc/stdlib/wcstoul.c: New file.
|
||||||
|
* libc/stdlib/wcstoull.c: New file.
|
||||||
|
* libc/stdlib/wcstoull_r.c: New file.
|
||||||
|
|
||||||
2007-07-06 Jeff Johnston <jjohnstn@redhat.com>
|
2007-07-06 Jeff Johnston <jjohnstn@redhat.com>
|
||||||
|
|
||||||
* libc/include/sys/time.h (gettimeofday): Change to proper
|
* libc/include/sys/time.h (gettimeofday): Change to proper
|
||||||
|
@ -79,6 +79,15 @@ wchar_t *_EXFUN(wmemcpy, (wchar_t * , const wchar_t * , size_t));
|
|||||||
wchar_t *_EXFUN(wmemmove, (wchar_t *, const wchar_t *, size_t));
|
wchar_t *_EXFUN(wmemmove, (wchar_t *, const wchar_t *, size_t));
|
||||||
wchar_t *_EXFUN(wmemset, (wchar_t *, wchar_t, size_t));
|
wchar_t *_EXFUN(wmemset, (wchar_t *, wchar_t, size_t));
|
||||||
|
|
||||||
|
long _EXFUN(wcstol, (const wchar_t *, wchar_t **, int));
|
||||||
|
long long _EXFUN(wcstoll, (const wchar_t *, wchar_t **, int));
|
||||||
|
unsigned long _EXFUN(wcstoul, (const wchar_t *, wchar_t **, int));
|
||||||
|
unsigned long long _EXFUN(wcstoull, (const wchar_t *, wchar_t **, int));
|
||||||
|
long _EXFUN(_wcstol_r, (struct _reent *, const wchar_t *, wchar_t **, int));
|
||||||
|
long long _EXFUN(_wcstoll_r, (struct _reent *, const wchar_t *, wchar_t **, int));
|
||||||
|
unsigned long _EXFUN(_wcstoul_r, (struct _reent *, const wchar_t *, wchar_t **, int));
|
||||||
|
unsigned long long _EXFUN(_wcstoull_r, (struct _reent *, const wchar_t *, wchar_t **, int));
|
||||||
|
|
||||||
_END_STD_C
|
_END_STD_C
|
||||||
|
|
||||||
#endif /* _WCHAR_H_ */
|
#endif /* _WCHAR_H_ */
|
||||||
|
@ -50,6 +50,8 @@ GENERAL_SOURCES = \
|
|||||||
strtod.c \
|
strtod.c \
|
||||||
strtol.c \
|
strtol.c \
|
||||||
strtoul.c \
|
strtoul.c \
|
||||||
|
wcstol.c \
|
||||||
|
wcstoul.c \
|
||||||
wcstombs.c \
|
wcstombs.c \
|
||||||
wcstombs_r.c \
|
wcstombs_r.c \
|
||||||
wctomb.c \
|
wctomb.c \
|
||||||
@ -76,6 +78,10 @@ EXTENDED_SOURCES = \
|
|||||||
strtoll_r.c \
|
strtoll_r.c \
|
||||||
strtoull.c \
|
strtoull.c \
|
||||||
strtoull_r.c \
|
strtoull_r.c \
|
||||||
|
wcstoll.c \
|
||||||
|
wcstoll_r.c \
|
||||||
|
wcstoull.c \
|
||||||
|
wcstoull_r.c \
|
||||||
atoll.c \
|
atoll.c \
|
||||||
llabs.c \
|
llabs.c \
|
||||||
lldiv.c
|
lldiv.c
|
||||||
@ -231,7 +237,12 @@ CHEWOUT_FILES= \
|
|||||||
strtoll.def \
|
strtoll.def \
|
||||||
strtoul.def \
|
strtoul.def \
|
||||||
strtoull.def \
|
strtoull.def \
|
||||||
|
wcstol.def \
|
||||||
|
wcstoll.def \
|
||||||
|
wcstoul.def \
|
||||||
|
wcstoull.def \
|
||||||
system.def \
|
system.def \
|
||||||
|
wcstol.def \
|
||||||
wcstombs.def \
|
wcstombs.def \
|
||||||
wctomb.def
|
wctomb.def
|
||||||
|
|
||||||
|
@ -86,7 +86,8 @@ am__objects_1 = lib_a-__adjust.$(OBJEXT) lib_a-__atexit.$(OBJEXT) \
|
|||||||
lib_a-mstats.$(OBJEXT) lib_a-rand.$(OBJEXT) \
|
lib_a-mstats.$(OBJEXT) lib_a-rand.$(OBJEXT) \
|
||||||
lib_a-rand_r.$(OBJEXT) lib_a-realloc.$(OBJEXT) \
|
lib_a-rand_r.$(OBJEXT) lib_a-realloc.$(OBJEXT) \
|
||||||
lib_a-strtod.$(OBJEXT) lib_a-strtol.$(OBJEXT) \
|
lib_a-strtod.$(OBJEXT) lib_a-strtol.$(OBJEXT) \
|
||||||
lib_a-strtoul.$(OBJEXT) lib_a-wcstombs.$(OBJEXT) \
|
lib_a-strtoul.$(OBJEXT) lib_a-wcstol.$(OBJEXT) \
|
||||||
|
lib_a-wcstoul.$(OBJEXT) lib_a-wcstombs.$(OBJEXT) \
|
||||||
lib_a-wcstombs_r.$(OBJEXT) lib_a-wctomb.$(OBJEXT) \
|
lib_a-wcstombs_r.$(OBJEXT) lib_a-wctomb.$(OBJEXT) \
|
||||||
lib_a-wctomb_r.$(OBJEXT)
|
lib_a-wctomb_r.$(OBJEXT)
|
||||||
am__objects_2 = lib_a-cxa_atexit.$(OBJEXT) \
|
am__objects_2 = lib_a-cxa_atexit.$(OBJEXT) \
|
||||||
@ -100,6 +101,8 @@ am__objects_2 = lib_a-cxa_atexit.$(OBJEXT) \
|
|||||||
lib_a-srand48.$(OBJEXT) lib_a-strtoll.$(OBJEXT) \
|
lib_a-srand48.$(OBJEXT) lib_a-strtoll.$(OBJEXT) \
|
||||||
lib_a-strtoll_r.$(OBJEXT) lib_a-strtoull.$(OBJEXT) \
|
lib_a-strtoll_r.$(OBJEXT) lib_a-strtoull.$(OBJEXT) \
|
||||||
lib_a-strtoull_r.$(OBJEXT) lib_a-atoll.$(OBJEXT) \
|
lib_a-strtoull_r.$(OBJEXT) lib_a-atoll.$(OBJEXT) \
|
||||||
|
lib_a-wcstoll.$(OBJEXT) lib_a-wcstoll_r.$(OBJEXT) \
|
||||||
|
lib_a-wcstoull.$(OBJEXT) lib_a-wcstoull_r.$(OBJEXT) \
|
||||||
lib_a-llabs.$(OBJEXT) lib_a-lldiv.$(OBJEXT)
|
lib_a-llabs.$(OBJEXT) lib_a-lldiv.$(OBJEXT)
|
||||||
am__objects_3 = lib_a-a64l.$(OBJEXT) lib_a-btowc.$(OBJEXT) \
|
am__objects_3 = lib_a-a64l.$(OBJEXT) lib_a-btowc.$(OBJEXT) \
|
||||||
lib_a-getopt.$(OBJEXT) lib_a-getsubopt.$(OBJEXT) \
|
lib_a-getopt.$(OBJEXT) lib_a-getsubopt.$(OBJEXT) \
|
||||||
@ -131,12 +134,14 @@ am__objects_7 = __adjust.lo __atexit.lo __call_atexit.lo __exp10.lo \
|
|||||||
ldiv.lo ldtoa.lo malloc.lo mblen.lo mblen_r.lo mbstowcs.lo \
|
ldiv.lo ldtoa.lo malloc.lo mblen.lo mblen_r.lo mbstowcs.lo \
|
||||||
mbstowcs_r.lo mbtowc.lo mbtowc_r.lo mlock.lo mprec.lo \
|
mbstowcs_r.lo mbtowc.lo mbtowc_r.lo mlock.lo mprec.lo \
|
||||||
mstats.lo rand.lo rand_r.lo realloc.lo strtod.lo strtol.lo \
|
mstats.lo rand.lo rand_r.lo realloc.lo strtod.lo strtol.lo \
|
||||||
strtoul.lo wcstombs.lo wcstombs_r.lo wctomb.lo wctomb_r.lo
|
strtoul.lo wcstol.lo wcstoul.lo wcstombs.lo wcstombs_r.lo \
|
||||||
|
wctomb.lo wctomb_r.lo
|
||||||
am__objects_8 = cxa_atexit.lo cxa_finalize.lo drand48.lo ecvtbuf.lo \
|
am__objects_8 = cxa_atexit.lo cxa_finalize.lo drand48.lo ecvtbuf.lo \
|
||||||
efgcvt.lo erand48.lo jrand48.lo lcong48.lo lrand48.lo \
|
efgcvt.lo erand48.lo jrand48.lo lcong48.lo lrand48.lo \
|
||||||
mrand48.lo msize.lo mtrim.lo nrand48.lo rand48.lo seed48.lo \
|
mrand48.lo msize.lo mtrim.lo nrand48.lo rand48.lo seed48.lo \
|
||||||
srand48.lo strtoll.lo strtoll_r.lo strtoull.lo strtoull_r.lo \
|
srand48.lo strtoll.lo strtoll_r.lo strtoull.lo strtoull_r.lo \
|
||||||
atoll.lo llabs.lo lldiv.lo
|
wcstoll.lo wcstoll_r.lo wcstoull.o wcstoull_r.lo atoll.lo \
|
||||||
|
llabs.lo lldiv.lo
|
||||||
am__objects_9 = a64l.lo btowc.lo getopt.lo getsubopt.lo l64a.lo \
|
am__objects_9 = a64l.lo btowc.lo getopt.lo getsubopt.lo l64a.lo \
|
||||||
malign.lo mbrlen.lo mbrtowc.lo mbsinit.lo mbsrtowcs.lo \
|
malign.lo mbrlen.lo mbrtowc.lo mbsinit.lo mbsrtowcs.lo \
|
||||||
on_exit.lo valloc.lo wcrtomb.lo wcsrtombs.lo wctob.lo
|
on_exit.lo valloc.lo wcrtomb.lo wcsrtombs.lo wctob.lo
|
||||||
@ -374,6 +379,8 @@ GENERAL_SOURCES = \
|
|||||||
strtod.c \
|
strtod.c \
|
||||||
strtol.c \
|
strtol.c \
|
||||||
strtoul.c \
|
strtoul.c \
|
||||||
|
wcstol.c \
|
||||||
|
wcstoul.c \
|
||||||
wcstombs.c \
|
wcstombs.c \
|
||||||
wcstombs_r.c \
|
wcstombs_r.c \
|
||||||
wctomb.c \
|
wctomb.c \
|
||||||
@ -400,6 +407,10 @@ EXTENDED_SOURCES = \
|
|||||||
strtoll_r.c \
|
strtoll_r.c \
|
||||||
strtoull.c \
|
strtoull.c \
|
||||||
strtoull_r.c \
|
strtoull_r.c \
|
||||||
|
wcstoll.c \
|
||||||
|
wcstoll_r.c \
|
||||||
|
wcstoull.c \
|
||||||
|
wcstoull_r.c \
|
||||||
atoll.c \
|
atoll.c \
|
||||||
llabs.c \
|
llabs.c \
|
||||||
lldiv.c
|
lldiv.c
|
||||||
@ -503,6 +514,10 @@ CHEWOUT_FILES = \
|
|||||||
strtoul.def \
|
strtoul.def \
|
||||||
strtoull.def \
|
strtoull.def \
|
||||||
system.def \
|
system.def \
|
||||||
|
wcstol.def \
|
||||||
|
wcstoll.def \
|
||||||
|
wcstoul.def \
|
||||||
|
wcstoull.def \
|
||||||
wcstombs.def \
|
wcstombs.def \
|
||||||
wctomb.def
|
wctomb.def
|
||||||
|
|
||||||
@ -847,6 +862,18 @@ lib_a-strtoul.o: strtoul.c
|
|||||||
lib_a-strtoul.obj: strtoul.c
|
lib_a-strtoul.obj: strtoul.c
|
||||||
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strtoul.obj `if test -f 'strtoul.c'; then $(CYGPATH_W) 'strtoul.c'; else $(CYGPATH_W) '$(srcdir)/strtoul.c'; fi`
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strtoul.obj `if test -f 'strtoul.c'; then $(CYGPATH_W) 'strtoul.c'; else $(CYGPATH_W) '$(srcdir)/strtoul.c'; fi`
|
||||||
|
|
||||||
|
lib_a-wcstol.o: wcstol.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstol.o `test -f 'wcstol.c' || echo '$(srcdir)/'`wcstol.c
|
||||||
|
|
||||||
|
lib_a-wcstol.obj: wcstol.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstol.obj `if test -f 'wcstol.c'; then $(CYGPATH_W) 'wcstol.c'; else $(CYGPATH_W) '$(srcdir)/wcstol.c'; fi`
|
||||||
|
|
||||||
|
lib_a-wcstoul.o: wcstoul.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoul.o `test -f 'wcstoul.c' || echo '$(srcdir)/'`wcstoul.c
|
||||||
|
|
||||||
|
lib_a-wcstoul.obj: wcstoul.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoul.obj `if test -f 'wcstoul.c'; then $(CYGPATH_W) 'wcstoul.c'; else $(CYGPATH_W) '$(srcdir)/wcstoul.c'; fi`
|
||||||
|
|
||||||
lib_a-wcstombs.o: wcstombs.c
|
lib_a-wcstombs.o: wcstombs.c
|
||||||
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstombs.o `test -f 'wcstombs.c' || echo '$(srcdir)/'`wcstombs.c
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstombs.o `test -f 'wcstombs.c' || echo '$(srcdir)/'`wcstombs.c
|
||||||
|
|
||||||
@ -991,6 +1018,30 @@ lib_a-strtoull_r.o: strtoull_r.c
|
|||||||
lib_a-strtoull_r.obj: strtoull_r.c
|
lib_a-strtoull_r.obj: strtoull_r.c
|
||||||
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strtoull_r.obj `if test -f 'strtoull_r.c'; then $(CYGPATH_W) 'strtoull_r.c'; else $(CYGPATH_W) '$(srcdir)/strtoull_r.c'; fi`
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strtoull_r.obj `if test -f 'strtoull_r.c'; then $(CYGPATH_W) 'strtoull_r.c'; else $(CYGPATH_W) '$(srcdir)/strtoull_r.c'; fi`
|
||||||
|
|
||||||
|
lib_a-wcstoll.o: wcstoll.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoll.o `test -f 'wcstoll.c' || echo '$(srcdir)/'`wcstoll.c
|
||||||
|
|
||||||
|
lib_a-wcstoll.obj: wcstoll.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoll.obj `if test -f 'wcstoll.c'; then $(CYGPATH_W) 'wcstoll.c'; else $(CYGPATH_W) '$(srcdir)/wcstoll.c'; fi`
|
||||||
|
|
||||||
|
lib_a-wcstoll_r.o: wcstoll_r.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoll_r.o `test -f 'wcstoll_r.c' || echo '$(srcdir)/'`wcstoll_r.c
|
||||||
|
|
||||||
|
lib_a-wcstoll_r.obj: wcstoll_r.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoll_r.obj `if test -f 'wcstoll_r.c'; then $(CYGPATH_W) 'wcstoll_r.c'; else $(CYGPATH_W) '$(srcdir)/wcstoll_r.c'; fi`
|
||||||
|
|
||||||
|
lib_a-wcstoull.o: wcstoull.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoull.o `test -f 'wcstoull.c' || echo '$(srcdir)/'`wcstoull.c
|
||||||
|
|
||||||
|
lib_a-wcstoull.obj: wcstoull.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoull.obj `if test -f 'wcstoull.c'; then $(CYGPATH_W) 'wcstoull.c'; else $(CYGPATH_W) '$(srcdir)/wcstoull.c'; fi`
|
||||||
|
|
||||||
|
lib_a-wcstoull_r.o: wcstoull_r.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoull_r.o `test -f 'wcstoull_r.c' || echo '$(srcdir)/'`wcstoull_r.c
|
||||||
|
|
||||||
|
lib_a-wcstoull_r.obj: wcstoull_r.c
|
||||||
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcstoull_r.obj `if test -f 'wcstoull_r.c'; then $(CYGPATH_W) 'wcstoull_r.c'; else $(CYGPATH_W) '$(srcdir)/wcstoull_r.c'; fi`
|
||||||
|
|
||||||
lib_a-atoll.o: atoll.c
|
lib_a-atoll.o: atoll.c
|
||||||
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-atoll.o `test -f 'atoll.c' || echo '$(srcdir)/'`atoll.c
|
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-atoll.o `test -f 'atoll.c' || echo '$(srcdir)/'`atoll.c
|
||||||
|
|
||||||
|
@ -40,6 +40,10 @@ The corresponding declarations are in the header file @file{stdlib.h}.
|
|||||||
* strtoll:: String to long long
|
* strtoll:: String to long long
|
||||||
* strtoul:: String to unsigned long
|
* strtoul:: String to unsigned long
|
||||||
* strtoull:: String to unsigned long long
|
* strtoull:: String to unsigned long long
|
||||||
|
* wcstol:: Wide string to long
|
||||||
|
* wcstoll:: Wide string to long long
|
||||||
|
* wcstoul:: Wide string to unsigned long
|
||||||
|
* wcstoull:: Wide string to unsigned long long
|
||||||
* system:: Execute command string
|
* system:: Execute command string
|
||||||
* wcstombs:: Minimal wide string to multibyte string converter
|
* wcstombs:: Minimal wide string to multibyte string converter
|
||||||
* wctomb:: Minimal wide character to multibyte converter
|
* wctomb:: Minimal wide character to multibyte converter
|
||||||
@ -147,6 +151,18 @@ The corresponding declarations are in the header file @file{stdlib.h}.
|
|||||||
@page
|
@page
|
||||||
@include stdlib/strtoull.def
|
@include stdlib/strtoull.def
|
||||||
|
|
||||||
|
@page
|
||||||
|
@include stdlib/wcstol.def
|
||||||
|
|
||||||
|
@page
|
||||||
|
@include stdlib/wcstoll.def
|
||||||
|
|
||||||
|
@page
|
||||||
|
@include stdlib/wcstoul.def
|
||||||
|
|
||||||
|
@page
|
||||||
|
@include stdlib/wcstoull.def
|
||||||
|
|
||||||
@page
|
@page
|
||||||
@include stdlib/system.def
|
@include stdlib/system.def
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ made, 0 is returned.
|
|||||||
the converted value is too large, and sets <<errno>> to <<ERANGE>>.
|
the converted value is too large, and sets <<errno>> to <<ERANGE>>.
|
||||||
|
|
||||||
PORTABILITY
|
PORTABILITY
|
||||||
<<strtoll>> is nonstandard.
|
<<strtoll>> is ANSI.
|
||||||
|
|
||||||
No supporting OS subroutines are required.
|
No supporting OS subroutines are required.
|
||||||
*/
|
*/
|
||||||
|
@ -80,7 +80,7 @@ made, <<0>> is returned.
|
|||||||
value is too large, and sets <<errno>> to <<ERANGE>>.
|
value is too large, and sets <<errno>> to <<ERANGE>>.
|
||||||
|
|
||||||
PORTABILITY
|
PORTABILITY
|
||||||
<<strtoull>> is nonstandard.
|
<<strtoull>> is ANSI.
|
||||||
|
|
||||||
<<strtoull>> requires no supporting OS subroutines.
|
<<strtoull>> requires no supporting OS subroutines.
|
||||||
*/
|
*/
|
||||||
|
226
newlib/libc/stdlib/wcstol.c
Normal file
226
newlib/libc/stdlib/wcstol.c
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
/*
|
||||||
|
FUNCTION
|
||||||
|
<<wcstol>>---wide string to long
|
||||||
|
|
||||||
|
INDEX
|
||||||
|
wcstol
|
||||||
|
INDEX
|
||||||
|
_wcstol_r
|
||||||
|
|
||||||
|
ANSI_SYNOPSIS
|
||||||
|
#include <wchar.h>
|
||||||
|
long wcstol(const wchar_t *<[s]>, wchar_t **<[ptr]>,int <[base]>);
|
||||||
|
|
||||||
|
long _wcstol_r(void *<[reent]>,
|
||||||
|
const wchar_t *<[s]>, wchar_t **<[ptr]>,int <[base]>);
|
||||||
|
|
||||||
|
TRAD_SYNOPSIS
|
||||||
|
#include <stdlib.h>
|
||||||
|
long wcstol (<[s]>, <[ptr]>, <[base]>)
|
||||||
|
wchar_t *<[s]>;
|
||||||
|
wchar_t **<[ptr]>;
|
||||||
|
int <[base]>;
|
||||||
|
|
||||||
|
long _wcstol_r (<[reent]>, <[s]>, <[ptr]>, <[base]>)
|
||||||
|
struct _reent *<[reent]>;
|
||||||
|
wchar_t *<[s]>;
|
||||||
|
wchar_t **<[ptr]>;
|
||||||
|
int <[base]>;
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
The function <<wcstol>> converts the wide string <<*<[s]>>> to
|
||||||
|
a <<long>>. First, it breaks down the string into three parts:
|
||||||
|
leading whitespace, which is ignored; a subject string consisting
|
||||||
|
of characters resembling an integer in the radix specified by <[base]>;
|
||||||
|
and a trailing portion consisting of zero or more unparseable characters,
|
||||||
|
and always including the terminating null character. Then, it attempts
|
||||||
|
to convert the subject string into a <<long>> and returns the
|
||||||
|
result.
|
||||||
|
|
||||||
|
If the value of <[base]> is 0, the subject string is expected to look
|
||||||
|
like a normal C integer constant: an optional sign, a possible `<<0x>>'
|
||||||
|
indicating a hexadecimal base, and a number. If <[base]> is between
|
||||||
|
2 and 36, the expected form of the subject is a sequence of letters
|
||||||
|
and digits representing an integer in the radix specified by <[base]>,
|
||||||
|
with an optional plus or minus sign. The letters <<a>>--<<z>> (or,
|
||||||
|
equivalently, <<A>>--<<Z>>) are used to signify values from 10 to 35;
|
||||||
|
only letters whose ascribed values are less than <[base]> are
|
||||||
|
permitted. If <[base]> is 16, a leading <<0x>> is permitted.
|
||||||
|
|
||||||
|
The subject sequence is the longest initial sequence of the input
|
||||||
|
string that has the expected form, starting with the first
|
||||||
|
non-whitespace character. If the string is empty or consists entirely
|
||||||
|
of whitespace, or if the first non-whitespace character is not a
|
||||||
|
permissible letter or digit, the subject string is empty.
|
||||||
|
|
||||||
|
If the subject string is acceptable, and the value of <[base]> is zero,
|
||||||
|
<<wcstol>> attempts to determine the radix from the input string. A
|
||||||
|
string with a leading <<0x>> is treated as a hexadecimal value; a string with
|
||||||
|
a leading 0 and no <<x>> is treated as octal; all other strings are
|
||||||
|
treated as decimal. If <[base]> is between 2 and 36, it is used as the
|
||||||
|
conversion radix, as described above. If the subject string begins with
|
||||||
|
a minus sign, the value is negated. Finally, a pointer to the first
|
||||||
|
character past the converted subject string is stored in <[ptr]>, if
|
||||||
|
<[ptr]> is not <<NULL>>.
|
||||||
|
|
||||||
|
If the subject string is empty (or not in acceptable form), no conversion
|
||||||
|
is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is
|
||||||
|
not <<NULL>>).
|
||||||
|
|
||||||
|
The alternate function <<_wcstol_r>> is a reentrant version. The
|
||||||
|
extra argument <[reent]> is a pointer to a reentrancy structure.
|
||||||
|
|
||||||
|
RETURNS
|
||||||
|
<<wcstol>> returns the converted value, if any. If no conversion was
|
||||||
|
made, 0 is returned.
|
||||||
|
|
||||||
|
<<wcstol>> returns <<LONG_MAX>> or <<LONG_MIN>> if the magnitude of
|
||||||
|
the converted value is too large, and sets <<errno>> to <<ERANGE>>.
|
||||||
|
|
||||||
|
PORTABILITY
|
||||||
|
<<wcstol>> is ANSI.
|
||||||
|
|
||||||
|
No supporting OS subroutines are required.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1990 The Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <_ansi.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <reent.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a wide string to a long integer.
|
||||||
|
*
|
||||||
|
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||||
|
* alphabets and digits are each contiguous.
|
||||||
|
*/
|
||||||
|
long
|
||||||
|
_DEFUN (_wcstol_r, (rptr, nptr, endptr, base),
|
||||||
|
struct _reent *rptr _AND
|
||||||
|
_CONST wchar_t *nptr _AND
|
||||||
|
wchar_t **endptr _AND
|
||||||
|
int base)
|
||||||
|
{
|
||||||
|
register const wchar_t *s = nptr;
|
||||||
|
register unsigned long acc;
|
||||||
|
register int c;
|
||||||
|
register unsigned long cutoff;
|
||||||
|
register int neg = 0, any, cutlim;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Skip white space and pick up leading +/- sign if any.
|
||||||
|
* If base is 0, allow 0x for hex and 0 for octal, else
|
||||||
|
* assume decimal; if base is already 16, allow 0x.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
c = *s++;
|
||||||
|
} while (iswspace(c));
|
||||||
|
if (c == L'-') {
|
||||||
|
neg = 1;
|
||||||
|
c = *s++;
|
||||||
|
} else if (c == L'+')
|
||||||
|
c = *s++;
|
||||||
|
if ((base == 0 || base == 16) &&
|
||||||
|
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||||
|
c = s[1];
|
||||||
|
s += 2;
|
||||||
|
base = 16;
|
||||||
|
}
|
||||||
|
if (base == 0)
|
||||||
|
base = c == L'0' ? 8 : 10;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compute the cutoff value between legal numbers and illegal
|
||||||
|
* numbers. That is the largest legal value, divided by the
|
||||||
|
* base. An input number that is greater than this value, if
|
||||||
|
* followed by a legal input character, is too big. One that
|
||||||
|
* is equal to this value may be valid or not; the limit
|
||||||
|
* between valid and invalid numbers is then based on the last
|
||||||
|
* digit. For instance, if the range for longs is
|
||||||
|
* [-2147483648..2147483647] and the input base is 10,
|
||||||
|
* cutoff will be set to 214748364 and cutlim to either
|
||||||
|
* 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
|
||||||
|
* a value > 214748364, or equal but the next digit is > 7 (or 8),
|
||||||
|
* the number is too big, and we will return a range error.
|
||||||
|
*
|
||||||
|
* Set any if any `digits' consumed; make it negative to indicate
|
||||||
|
* overflow.
|
||||||
|
*/
|
||||||
|
cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
|
||||||
|
cutlim = cutoff % (unsigned long)base;
|
||||||
|
cutoff /= (unsigned long)base;
|
||||||
|
for (acc = 0, any = 0;; c = *s++) {
|
||||||
|
if (iswdigit(c))
|
||||||
|
c -= L'0';
|
||||||
|
else if (iswalpha(c))
|
||||||
|
c -= iswupper(c) ? L'A' - 10 : L'a' - 10;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
if (c >= base)
|
||||||
|
break;
|
||||||
|
if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
|
||||||
|
any = -1;
|
||||||
|
else {
|
||||||
|
any = 1;
|
||||||
|
acc *= base;
|
||||||
|
acc += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (any < 0) {
|
||||||
|
acc = neg ? LONG_MIN : LONG_MAX;
|
||||||
|
rptr->_errno = ERANGE;
|
||||||
|
} else if (neg)
|
||||||
|
acc = -acc;
|
||||||
|
if (endptr != 0)
|
||||||
|
*endptr = (wchar_t *) (any ? s - 1 : nptr);
|
||||||
|
return (acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef _REENT_ONLY
|
||||||
|
|
||||||
|
long
|
||||||
|
_DEFUN (wcstol, (s, ptr, base),
|
||||||
|
_CONST wchar_t *s _AND
|
||||||
|
wchar_t **ptr _AND
|
||||||
|
int base)
|
||||||
|
{
|
||||||
|
return _wcstol_r (_REENT, s, ptr, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
138
newlib/libc/stdlib/wcstoll.c
Normal file
138
newlib/libc/stdlib/wcstoll.c
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/*
|
||||||
|
FUNCTION
|
||||||
|
<<wcstoll>>---wide string to long long
|
||||||
|
|
||||||
|
INDEX
|
||||||
|
wcstoll
|
||||||
|
INDEX
|
||||||
|
_wcstoll_r
|
||||||
|
|
||||||
|
ANSI_SYNOPSIS
|
||||||
|
#include <wchar.h>
|
||||||
|
long long wcstoll(const wchar_t *<[s]>, wchar_t **<[ptr]>,int <[base]>);
|
||||||
|
|
||||||
|
long long _wcstoll_r(void *<[reent]>,
|
||||||
|
const wchar_t *<[s]>, wchar_t **<[ptr]>,int <[base]>);
|
||||||
|
|
||||||
|
TRAD_SYNOPSIS
|
||||||
|
#include <stdlib.h>
|
||||||
|
long long wcstoll (<[s]>, <[ptr]>, <[base]>)
|
||||||
|
const wchar_t *<[s]>;
|
||||||
|
wchar_t **<[ptr]>;
|
||||||
|
int <[base]>;
|
||||||
|
|
||||||
|
long long _wcstoll_r (<[reent]>, <[s]>, <[ptr]>, <[base]>)
|
||||||
|
wchar_t *<[reent]>;
|
||||||
|
const wchar_t *<[s]>;
|
||||||
|
wchar_t **<[ptr]>;
|
||||||
|
int <[base]>;
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
The function <<wcstoll>> converts the wide string <<*<[s]>>> to
|
||||||
|
a <<long long>>. First, it breaks down the string into three parts:
|
||||||
|
leading whitespace, which is ignored; a subject string consisting
|
||||||
|
of characters resembling an integer in the radix specified by <[base]>;
|
||||||
|
and a trailing portion consisting of zero or more unparseable characters,
|
||||||
|
and always including the terminating null character. Then, it attempts
|
||||||
|
to convert the subject string into a <<long long>> and returns the
|
||||||
|
result.
|
||||||
|
|
||||||
|
If the value of <[base]> is 0, the subject string is expected to look
|
||||||
|
like a normal C integer constant: an optional sign, a possible `<<0x>>'
|
||||||
|
indicating a hexadecimal base, and a number. If <[base]> is between
|
||||||
|
2 and 36, the expected form of the subject is a sequence of letters
|
||||||
|
and digits representing an integer in the radix specified by <[base]>,
|
||||||
|
with an optional plus or minus sign. The letters <<a>>--<<z>> (or,
|
||||||
|
equivalently, <<A>>--<<Z>>) are used to signify values from 10 to 35;
|
||||||
|
only letters whose ascribed values are less than <[base]> are
|
||||||
|
permitted. If <[base]> is 16, a leading <<0x>> is permitted.
|
||||||
|
|
||||||
|
The subject sequence is the longest initial sequence of the input
|
||||||
|
string that has the expected form, starting with the first
|
||||||
|
non-whitespace character. If the string is empty or consists entirely
|
||||||
|
of whitespace, or if the first non-whitespace character is not a
|
||||||
|
permissible letter or digit, the subject string is empty.
|
||||||
|
|
||||||
|
If the subject string is acceptable, and the value of <[base]> is zero,
|
||||||
|
<<wcstoll>> attempts to determine the radix from the input string. A
|
||||||
|
string with a leading <<0x>> is treated as a hexadecimal value; a string with
|
||||||
|
a leading 0 and no <<x>> is treated as octal; all other strings are
|
||||||
|
treated as decimal. If <[base]> is between 2 and 36, it is used as the
|
||||||
|
conversion radix, as described above. If the subject string begins with
|
||||||
|
a minus sign, the value is negated. Finally, a pointer to the first
|
||||||
|
character past the converted subject string is stored in <[ptr]>, if
|
||||||
|
<[ptr]> is not <<NULL>>.
|
||||||
|
|
||||||
|
If the subject string is empty (or not in acceptable form), no conversion
|
||||||
|
is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is
|
||||||
|
not <<NULL>>).
|
||||||
|
|
||||||
|
The alternate function <<_wcstoll_r>> is a reentrant version. The
|
||||||
|
extra argument <[reent]> is a pointer to a reentrancy structure.
|
||||||
|
|
||||||
|
RETURNS
|
||||||
|
<<wcstoll>> returns the converted value, if any. If no conversion was
|
||||||
|
made, 0 is returned.
|
||||||
|
|
||||||
|
<<wcstoll>> returns <<LONG_LONG_MAX>> or <<LONG_LONG_MIN>> if the magnitude of
|
||||||
|
the converted value is too large, and sets <<errno>> to <<ERANGE>>.
|
||||||
|
|
||||||
|
PORTABILITY
|
||||||
|
<<wcstoll>> is ANSI.
|
||||||
|
|
||||||
|
No supporting OS subroutines are required.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1990 The Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <_ansi.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <reent.h>
|
||||||
|
|
||||||
|
#ifndef _REENT_ONLY
|
||||||
|
|
||||||
|
long long
|
||||||
|
_DEFUN (wcstoll, (s, ptr, base),
|
||||||
|
_CONST wchar_t *s _AND
|
||||||
|
wchar_t **ptr _AND
|
||||||
|
int base)
|
||||||
|
{
|
||||||
|
return _wcstoll_r (_REENT, s, ptr, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
140
newlib/libc/stdlib/wcstoll_r.c
Normal file
140
newlib/libc/stdlib/wcstoll_r.c
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
This code is based on strtoul.c which has the following copyright.
|
||||||
|
It is used to convert a wide string into a signed long long.
|
||||||
|
|
||||||
|
long long _wcstoll_r (struct _reent *rptr, const wchar_t *s,
|
||||||
|
wchar_t **ptr, int base);
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1990 The Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <_ansi.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <reent.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a wide string to a long long integer.
|
||||||
|
*
|
||||||
|
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||||
|
* alphabets and digits are each contiguous.
|
||||||
|
*/
|
||||||
|
long long
|
||||||
|
_DEFUN (_wcstoll_r, (rptr, nptr, endptr, base),
|
||||||
|
struct _reent *rptr _AND
|
||||||
|
_CONST wchar_t *nptr _AND
|
||||||
|
wchar_t **endptr _AND
|
||||||
|
int base)
|
||||||
|
{
|
||||||
|
register const wchar_t *s = nptr;
|
||||||
|
register unsigned long long acc;
|
||||||
|
register int c;
|
||||||
|
register unsigned long long cutoff;
|
||||||
|
register int neg = 0, any, cutlim;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Skip white space and pick up leading +/- sign if any.
|
||||||
|
* If base is 0, allow 0x for hex and 0 for octal, else
|
||||||
|
* assume decimal; if base is already 16, allow 0x.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
c = *s++;
|
||||||
|
} while (iswspace(c));
|
||||||
|
if (c == L'-') {
|
||||||
|
neg = 1;
|
||||||
|
c = *s++;
|
||||||
|
} else if (c == L'+')
|
||||||
|
c = *s++;
|
||||||
|
if ((base == 0 || base == 16) &&
|
||||||
|
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||||
|
c = s[1];
|
||||||
|
s += 2;
|
||||||
|
base = 16;
|
||||||
|
}
|
||||||
|
if (base == 0)
|
||||||
|
base = c == L'0' ? 8 : 10;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compute the cutoff value between legal numbers and illegal
|
||||||
|
* numbers. That is the largest legal value, divided by the
|
||||||
|
* base. An input number that is greater than this value, if
|
||||||
|
* followed by a legal input character, is too big. One that
|
||||||
|
* is equal to this value may be valid or not; the limit
|
||||||
|
* between valid and invalid numbers is then based on the last
|
||||||
|
* digit. For instance, if the range for longs is
|
||||||
|
* [-2147483648..2147483647] and the input base is 10,
|
||||||
|
* cutoff will be set to 214748364 and cutlim to either
|
||||||
|
* 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
|
||||||
|
* a value > 214748364, or equal but the next digit is > 7 (or 8),
|
||||||
|
* the number is too big, and we will return a range error.
|
||||||
|
*
|
||||||
|
* Set any if any `digits' consumed; make it negative to indicate
|
||||||
|
* overflow.
|
||||||
|
*/
|
||||||
|
cutoff = neg ? -(unsigned long long)LONG_LONG_MIN : LONG_LONG_MAX;
|
||||||
|
cutlim = cutoff % (unsigned long long)base;
|
||||||
|
cutoff /= (unsigned long long)base;
|
||||||
|
for (acc = 0, any = 0;; c = *s++) {
|
||||||
|
if (iswdigit(c))
|
||||||
|
c -= L'0';
|
||||||
|
else if (iswalpha(c))
|
||||||
|
c -= iswupper(c) ? L'A' - 10 : L'a' - 10;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
if (c >= base)
|
||||||
|
break;
|
||||||
|
if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
|
||||||
|
any = -1;
|
||||||
|
else {
|
||||||
|
any = 1;
|
||||||
|
acc *= base;
|
||||||
|
acc += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (any < 0) {
|
||||||
|
acc = neg ? LONG_LONG_MIN : LONG_LONG_MAX;
|
||||||
|
rptr->_errno = ERANGE;
|
||||||
|
} else if (neg)
|
||||||
|
acc = -acc;
|
||||||
|
if (endptr != 0)
|
||||||
|
*endptr = (wchar_t *) (any ? s - 1 : nptr);
|
||||||
|
return (acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __GNUC__ */
|
206
newlib/libc/stdlib/wcstoul.c
Normal file
206
newlib/libc/stdlib/wcstoul.c
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
/*
|
||||||
|
FUNCTION
|
||||||
|
<<wcstoul>>---wide string to unsigned long
|
||||||
|
|
||||||
|
INDEX
|
||||||
|
wcstoul
|
||||||
|
INDEX
|
||||||
|
_wcstoul_r
|
||||||
|
|
||||||
|
ANSI_SYNOPSIS
|
||||||
|
#include <wchar.h>
|
||||||
|
unsigned long wcstoul(const wchar_t *<[s]>, wchar_t **<[ptr]>,
|
||||||
|
int <[base]>);
|
||||||
|
|
||||||
|
unsigned long _wcstoul_r(void *<[reent]>, const wchar_t *<[s]>,
|
||||||
|
wchar_t **<[ptr]>, int <[base]>);
|
||||||
|
|
||||||
|
TRAD_SYNOPSIS
|
||||||
|
#include <stdlib.h>
|
||||||
|
unsigned long wcstoul(<[s]>, <[ptr]>, <[base]>)
|
||||||
|
wchar_t *<[s]>;
|
||||||
|
wchar_t **<[ptr]>;
|
||||||
|
int <[base]>;
|
||||||
|
|
||||||
|
unsigned long _wcstoul_r(<[reent]>, <[s]>, <[ptr]>, <[base]>)
|
||||||
|
wchar_t *<[reent]>;
|
||||||
|
wchar_t *<[s]>;
|
||||||
|
wchar_t **<[ptr]>;
|
||||||
|
int <[base]>;
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
The function <<wcstoul>> converts the wide string <<*<[s]>>> to
|
||||||
|
an <<unsigned long>>. First, it breaks down the string into three parts:
|
||||||
|
leading whitespace, which is ignored; a subject string consisting
|
||||||
|
of the digits meaningful in the radix specified by <[base]>
|
||||||
|
(for example, <<0>> through <<7>> if the value of <[base]> is 8);
|
||||||
|
and a trailing portion consisting of one or more unparseable characters,
|
||||||
|
which always includes the terminating null character. Then, it attempts
|
||||||
|
to convert the subject string into an unsigned long integer, and returns the
|
||||||
|
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.
|
||||||
|
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]>.
|
||||||
|
The letters <<a>>--<<z>> (or <<A>>--<<Z>>) are used as digits valued from
|
||||||
|
10 to 35. If <[base]> is 16, a leading <<0x>> is permitted.
|
||||||
|
|
||||||
|
The subject sequence is the longest initial sequence of the input
|
||||||
|
string that has the expected form, starting with the first
|
||||||
|
non-whitespace character. If the string is empty or consists entirely
|
||||||
|
of whitespace, or if the first non-whitespace character is not a
|
||||||
|
permissible digit, the subject string is empty.
|
||||||
|
|
||||||
|
If the subject string is acceptable, and the value of <[base]> is zero,
|
||||||
|
<<wcstoul>> attempts to determine the radix from the input string. A
|
||||||
|
string with a leading <<0x>> is treated as a hexadecimal value; a string with
|
||||||
|
a leading <<0>> and no <<x>> is treated as octal; all other strings are
|
||||||
|
treated as decimal. If <[base]> is between 2 and 36, it is used as the
|
||||||
|
conversion radix, as described above. Finally, a pointer to the first
|
||||||
|
character past the converted subject string is stored in <[ptr]>, if
|
||||||
|
<[ptr]> is not <<NULL>>.
|
||||||
|
|
||||||
|
If the subject string is empty (that is, if <<*>><[s]> does not start
|
||||||
|
with a substring in acceptable form), no conversion
|
||||||
|
is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is
|
||||||
|
not <<NULL>>).
|
||||||
|
|
||||||
|
The alternate function <<_wcstoul_r>> is a reentrant version. The
|
||||||
|
extra argument <[reent]> is a pointer to a reentrancy structure.
|
||||||
|
|
||||||
|
|
||||||
|
RETURNS
|
||||||
|
<<wcstoul>> returns the converted value, if any. If no conversion was
|
||||||
|
made, <<0>> is returned.
|
||||||
|
|
||||||
|
<<wcstoul>> returns <<ULONG_MAX>> if the magnitude of the converted
|
||||||
|
value is too large, and sets <<errno>> to <<ERANGE>>.
|
||||||
|
|
||||||
|
PORTABILITY
|
||||||
|
<<wcstoul>> is ANSI.
|
||||||
|
|
||||||
|
<<wcstoul>> requires no supporting OS subroutines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1990 Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <_ansi.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <reent.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a wide string to an unsigned long integer.
|
||||||
|
*
|
||||||
|
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||||
|
* alphabets and digits are each contiguous.
|
||||||
|
*/
|
||||||
|
unsigned long
|
||||||
|
_DEFUN (_wcstoul_r, (rptr, nptr, endptr, base),
|
||||||
|
struct _reent *rptr _AND
|
||||||
|
_CONST wchar_t *nptr _AND
|
||||||
|
wchar_t **endptr _AND
|
||||||
|
int base)
|
||||||
|
{
|
||||||
|
register const wchar_t *s = nptr;
|
||||||
|
register unsigned long acc;
|
||||||
|
register int c;
|
||||||
|
register unsigned long cutoff;
|
||||||
|
register int neg = 0, any, cutlim;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See strtol for comments as to the logic used.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
c = *s++;
|
||||||
|
} while (iswspace(c));
|
||||||
|
if (c == L'-') {
|
||||||
|
neg = 1;
|
||||||
|
c = *s++;
|
||||||
|
} else if (c == L'+')
|
||||||
|
c = *s++;
|
||||||
|
if ((base == 0 || base == 16) &&
|
||||||
|
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||||
|
c = s[1];
|
||||||
|
s += 2;
|
||||||
|
base = 16;
|
||||||
|
}
|
||||||
|
if (base == 0)
|
||||||
|
base = c == L'0' ? 8 : 10;
|
||||||
|
cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
|
||||||
|
cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
|
||||||
|
for (acc = 0, any = 0;; c = *s++) {
|
||||||
|
if (iswdigit(c))
|
||||||
|
c -= L'0';
|
||||||
|
else if (iswalpha(c))
|
||||||
|
c -= iswupper(c) ? L'A' - 10 : L'a' - 10;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
if (c >= base)
|
||||||
|
break;
|
||||||
|
if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
|
||||||
|
any = -1;
|
||||||
|
else {
|
||||||
|
any = 1;
|
||||||
|
acc *= base;
|
||||||
|
acc += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (any < 0) {
|
||||||
|
acc = ULONG_MAX;
|
||||||
|
rptr->_errno = ERANGE;
|
||||||
|
} else if (neg)
|
||||||
|
acc = -acc;
|
||||||
|
if (endptr != 0)
|
||||||
|
*endptr = (wchar_t *) (any ? s - 1 : nptr);
|
||||||
|
return (acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef _REENT_ONLY
|
||||||
|
|
||||||
|
unsigned long
|
||||||
|
_DEFUN (wcstoul, (s, ptr, base),
|
||||||
|
_CONST wchar_t *s _AND
|
||||||
|
wchar_t **ptr _AND
|
||||||
|
int base)
|
||||||
|
{
|
||||||
|
return _wcstoul_r (_REENT, s, ptr, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
139
newlib/libc/stdlib/wcstoull.c
Normal file
139
newlib/libc/stdlib/wcstoull.c
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
FUNCTION
|
||||||
|
<<wcstoull>>---wide string to unsigned long long
|
||||||
|
|
||||||
|
INDEX
|
||||||
|
wcstoull
|
||||||
|
INDEX
|
||||||
|
_wcstoull_r
|
||||||
|
|
||||||
|
ANSI_SYNOPSIS
|
||||||
|
#include <wchar.h>
|
||||||
|
unsigned long long wcstoull(const wchar_t *<[s]>, wchar_t **<[ptr]>,
|
||||||
|
int <[base]>);
|
||||||
|
|
||||||
|
unsigned long long _wcstoull_r(void *<[reent]>, const wchar_t *<[s]>,
|
||||||
|
wchar_t **<[ptr]>, int <[base]>);
|
||||||
|
|
||||||
|
TRAD_SYNOPSIS
|
||||||
|
#include <stdlib.h>
|
||||||
|
unsigned long long wcstoull(<[s]>, <[ptr]>, <[base]>)
|
||||||
|
wchar_t *<[s]>;
|
||||||
|
wchar_t **<[ptr]>;
|
||||||
|
int <[base]>;
|
||||||
|
|
||||||
|
unsigned long long _wcstoull_r(<[reent]>, <[s]>, <[ptr]>, <[base]>)
|
||||||
|
wchar_t *<[reent]>;
|
||||||
|
wchar_t *<[s]>;
|
||||||
|
wchar_t **<[ptr]>;
|
||||||
|
int <[base]>;
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
The function <<wcstoull>> converts the wide string <<*<[s]>>> to
|
||||||
|
an <<unsigned long long>>. First, it breaks down the string into three parts:
|
||||||
|
leading whitespace, which is ignored; a subject string consisting
|
||||||
|
of the digits meaningful in the radix specified by <[base]>
|
||||||
|
(for example, <<0>> through <<7>> if the value of <[base]> is 8);
|
||||||
|
and a trailing portion consisting of one or more unparseable characters,
|
||||||
|
which always includes the terminating null character. Then, it attempts
|
||||||
|
to convert the subject string into an unsigned long long integer, and returns the
|
||||||
|
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.
|
||||||
|
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]>.
|
||||||
|
The letters <<a>>--<<z>> (or <<A>>--<<Z>>) are used as digits valued from
|
||||||
|
10 to 35. If <[base]> is 16, a leading <<0x>> is permitted.
|
||||||
|
|
||||||
|
The subject sequence is the longest initial sequence of the input
|
||||||
|
string that has the expected form, starting with the first
|
||||||
|
non-whitespace character. If the string is empty or consists entirely
|
||||||
|
of whitespace, or if the first non-whitespace character is not a
|
||||||
|
permissible digit, the subject string is empty.
|
||||||
|
|
||||||
|
If the subject string is acceptable, and the value of <[base]> is zero,
|
||||||
|
<<wcstoull>> attempts to determine the radix from the input string. A
|
||||||
|
string with a leading <<0x>> is treated as a hexadecimal value; a string with
|
||||||
|
a leading <<0>> and no <<x>> is treated as octal; all other strings are
|
||||||
|
treated as decimal. If <[base]> is between 2 and 36, it is used as the
|
||||||
|
conversion radix, as described above. Finally, a pointer to the first
|
||||||
|
character past the converted subject string is stored in <[ptr]>, if
|
||||||
|
<[ptr]> is not <<NULL>>.
|
||||||
|
|
||||||
|
If the subject string is empty (that is, if <<*>><[s]> does not start
|
||||||
|
with a substring in acceptable form), no conversion
|
||||||
|
is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is
|
||||||
|
not <<NULL>>).
|
||||||
|
|
||||||
|
The alternate function <<_wcstoull_r>> is a reentrant version. The
|
||||||
|
extra argument <[reent]> is a pointer to a reentrancy structure.
|
||||||
|
|
||||||
|
|
||||||
|
RETURNS
|
||||||
|
<<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
|
||||||
|
value is too large, and sets <<errno>> to <<ERANGE>>.
|
||||||
|
|
||||||
|
PORTABILITY
|
||||||
|
<<wcstoull>> is ANSI.
|
||||||
|
|
||||||
|
<<wcstoull>> requires no supporting OS subroutines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1990 Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <_ansi.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <reent.h>
|
||||||
|
|
||||||
|
#ifndef _REENT_ONLY
|
||||||
|
|
||||||
|
unsigned long long
|
||||||
|
_DEFUN (wcstoull, (s, ptr, base),
|
||||||
|
_CONST wchar_t *s _AND
|
||||||
|
wchar_t **ptr _AND
|
||||||
|
int base)
|
||||||
|
{
|
||||||
|
return _wcstoull_r (_REENT, s, ptr, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
120
newlib/libc/stdlib/wcstoull_r.c
Normal file
120
newlib/libc/stdlib/wcstoull_r.c
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
This code is based on wcstoul.c which has the following copyright.
|
||||||
|
It is used to convert a wide string into an unsigned long long.
|
||||||
|
|
||||||
|
unsigned long long _wcstoull_r (struct _reent *rptr, const wchar_t *s,
|
||||||
|
wchar_t **ptr, int base);
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1990 Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <_ansi.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <reent.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a wide string to an unsigned long long integer.
|
||||||
|
*
|
||||||
|
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||||
|
* alphabets and digits are each contiguous.
|
||||||
|
*/
|
||||||
|
unsigned long long
|
||||||
|
_DEFUN (_wcstoull_r, (rptr, nptr, endptr, base),
|
||||||
|
struct _reent *rptr _AND
|
||||||
|
_CONST wchar_t *nptr _AND
|
||||||
|
wchar_t **endptr _AND
|
||||||
|
int base)
|
||||||
|
{
|
||||||
|
register const wchar_t *s = nptr;
|
||||||
|
register unsigned long long acc;
|
||||||
|
register int c;
|
||||||
|
register unsigned long long cutoff;
|
||||||
|
register int neg = 0, any, cutlim;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See strtol for comments as to the logic used.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
c = *s++;
|
||||||
|
} while (iswspace(c));
|
||||||
|
if (c == L'-') {
|
||||||
|
neg = 1;
|
||||||
|
c = *s++;
|
||||||
|
} else if (c == L'+')
|
||||||
|
c = *s++;
|
||||||
|
if ((base == 0 || base == 16) &&
|
||||||
|
c == L'0' && (*s == L'x' || *s == L'X')) {
|
||||||
|
c = s[1];
|
||||||
|
s += 2;
|
||||||
|
base = 16;
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
for (acc = 0, any = 0;; c = *s++) {
|
||||||
|
if (iswdigit(c))
|
||||||
|
c -= L'0';
|
||||||
|
else if (iswalpha(c))
|
||||||
|
c -= iswupper(c) ? L'A' - 10 : L'a' - 10;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
if (c >= base)
|
||||||
|
break;
|
||||||
|
if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
|
||||||
|
any = -1;
|
||||||
|
else {
|
||||||
|
any = 1;
|
||||||
|
acc *= base;
|
||||||
|
acc += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (any < 0) {
|
||||||
|
acc = ULONG_LONG_MAX;
|
||||||
|
rptr->_errno = ERANGE;
|
||||||
|
} else if (neg)
|
||||||
|
acc = -acc;
|
||||||
|
if (endptr != 0)
|
||||||
|
*endptr = (wchar_t *) (any ? s - 1 : nptr);
|
||||||
|
return (acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __GNUC__ */
|
Loading…
x
Reference in New Issue
Block a user