1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Convert string representation of a number into an integer value.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1991-1992, 1994-1999, 2003, 2005-2007, 2009-2012 Free Software
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   NOTE: The canonical source of this file is maintained with the GNU C
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Library.  Bugs can be reported to bug-glibc@gnu.org.
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify it
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   under the terms of the GNU General Public License as published by the
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Free Software Foundation; either version 3 of the License, or any
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   later version.
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef _LIBC
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define USE_NUMBER_GROUPING
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <config.h>
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <ctype.h>
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <errno.h>
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef __set_errno
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define __set_errno(Val) errno = (Val)
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <limits.h>
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stddef.h>
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h>
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h>
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_NUMBER_GROUPING
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "../locale/localeinfo.h"
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Nonzero if we are defining 'strtoul' or 'strtoull', operating on
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   unsigned integers.  */
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef UNSIGNED
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define UNSIGNED 0
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define INT LONG int
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define INT unsigned LONG int
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Determine the name.  */
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_IN_EXTENDED_LOCALE_MODEL
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if UNSIGNED
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  ifdef USE_WIDE_CHAR
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ifdef QUAD
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol __wcstoull_l
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   else
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol __wcstoul_l
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   endif
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  else
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ifdef QUAD
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol __strtoull_l
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   else
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol __strtoul_l
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   endif
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  endif
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  ifdef USE_WIDE_CHAR
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ifdef QUAD
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol __wcstoll_l
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   else
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol __wcstol_l
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   endif
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  else
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ifdef QUAD
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol __strtoll_l
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   else
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol __strtol_l
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   endif
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  endif
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if UNSIGNED
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  ifdef USE_WIDE_CHAR
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ifdef QUAD
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol wcstoull
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   else
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol wcstoul
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   endif
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  else
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ifdef QUAD
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol strtoull
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   else
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol strtoul
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   endif
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  endif
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  ifdef USE_WIDE_CHAR
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ifdef QUAD
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol wcstoll
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   else
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol wcstol
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   endif
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  else
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   ifdef QUAD
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#    define strtol strtoll
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   endif
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  endif
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* If QUAD is defined, we are defining 'strtoll' or 'strtoull',
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   operating on 'long long int's.  */
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef QUAD
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define LONG long long
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define STRTOL_LONG_MIN LLONG_MIN
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define STRTOL_LONG_MAX LLONG_MAX
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define STRTOL_ULONG_MAX ULLONG_MAX
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The extra casts in the following macros work around compiler bugs,
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   e.g., in Cray C 5.0.3.0.  */
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* True if negative values of the signed integer type T use two's
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   complement, ones' complement, or signed magnitude representation,
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   respectively.  Much GNU code assumes two's complement, but some
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   people like to be portable to all possible C hosts.  */
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* True if the arithmetic type T is signed.  */
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The maximum and minimum values for the integer type T.  These
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   macros have undefined behavior if T is signed and has padding bits.
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If this is a problem for you, please let us know how to fix it for
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   your host.  */
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define TYPE_MINIMUM(t) \
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ((t) (! TYPE_SIGNED (t) \
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang         ? (t) 0 \
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang         : TYPE_SIGNED_MAGNITUDE (t) \
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang         ? ~ (t) 0 \
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang         : ~ TYPE_MAXIMUM (t)))
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define TYPE_MAXIMUM(t) \
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   ((t) (! TYPE_SIGNED (t) \
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang         ? (t) -1 \
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang         : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef ULLONG_MAX
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define ULLONG_MAX TYPE_MAXIMUM (unsigned long long)
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef LLONG_MAX
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define LLONG_MAX TYPE_MAXIMUM (long long int)
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifndef LLONG_MIN
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define LLONG_MIN TYPE_MINIMUM (long long int)
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   /* Work around gcc bug with using this constant.  */
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   static const unsigned long long int maxquad = ULLONG_MAX;
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  undef STRTOL_ULONG_MAX
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define STRTOL_ULONG_MAX maxquad
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define LONG long
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define STRTOL_LONG_MIN LONG_MIN
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define STRTOL_LONG_MAX LONG_MAX
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define STRTOL_ULONG_MAX ULONG_MAX
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* We use this code also for the extended locale handling where the
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   function gets as an additional argument the locale which has to be
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   used.  To access the values we have to redefine the _NL_CURRENT
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   macro.  */
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_IN_EXTENDED_LOCALE_MODEL
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# undef _NL_CURRENT
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define _NL_CURRENT(category, item) \
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  (current->values[_NL_ITEM_INDEX (item)].string)
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define LOCALE_PARAM , loc
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define LOCALE_PARAM_PROTO , __locale_t loc
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define LOCALE_PARAM
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define LOCALE_PARAM_PROTO
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_WIDE_CHAR
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <wchar.h>
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <wctype.h>
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define L_(Ch) L##Ch
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define UCHAR_TYPE wint_t
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define STRING_TYPE wchar_t
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef USE_IN_EXTENDED_LOCALE_MODEL
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define ISSPACE(Ch) __iswspace_l ((Ch), loc)
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define TOUPPER(Ch) __towupper_l ((Ch), loc)
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define ISSPACE(Ch) iswspace (Ch)
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define ISALPHA(Ch) iswalpha (Ch)
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define TOUPPER(Ch) towupper (Ch)
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define L_(Ch) Ch
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define UCHAR_TYPE unsigned char
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define STRING_TYPE char
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef USE_IN_EXTENDED_LOCALE_MODEL
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define ISSPACE(Ch) __isspace_l ((Ch), loc)
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define ISALPHA(Ch) __isalpha_l ((Ch), loc)
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define TOUPPER(Ch) __toupper_l ((Ch), loc)
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define ISSPACE(Ch) isspace (Ch)
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define ISALPHA(Ch) isalpha (Ch)
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define TOUPPER(Ch) toupper (Ch)
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define INTERNAL(X) INTERNAL1(X)
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define INTERNAL1(X) __##X##_internal
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define WEAKNAME(X) WEAKNAME1(X)
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_NUMBER_GROUPING
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This file defines a function to check for correct grouping.  */
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "grouping.h"
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Convert NPTR to an 'unsigned long int' or 'long int' in base BASE.
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If BASE is 0 the base is determined by the presence of a leading
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If BASE is < 2 or > 36, it is reset to 10.
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If ENDPTR is not NULL, a pointer to the character after the last
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   one converted is stored in *ENDPTR.  */
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectINT
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectINTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   int base, int group LOCALE_PARAM_PROTO)
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int negative;
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  register unsigned LONG int cutoff;
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  register unsigned int cutlim;
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  register unsigned LONG int i;
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  register const STRING_TYPE *s;
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  register UCHAR_TYPE c;
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  const STRING_TYPE *save, *end;
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int overflow;
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_NUMBER_GROUPING
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef USE_IN_EXTENDED_LOCALE_MODEL
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct locale_data *current = loc->__locales[LC_NUMERIC];
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* The thousands character of the current locale.  */
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  wchar_t thousands = L'\0';
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* The numeric grouping specification of the current locale,
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     in the format described in <locale.h>.  */
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  const char *grouping;
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (group)
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (*grouping <= 0 || *grouping == CHAR_MAX)
26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        grouping = NULL;
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          /* Figure out the thousands separator character.  */
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if defined _LIBC || defined _HAVE_BTOWC
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (thousands == WEOF)
27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            thousands = L'\0';
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (thousands == L'\0')
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang            grouping = NULL;
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    grouping = NULL;
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (base < 0 || base == 1 || base > 36)
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      __set_errno (EINVAL);
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return 0;
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  save = s = nptr;
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Skip white space.  */
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while (ISSPACE (*s))
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    ++s;
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (*s == L_('\0'))
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    goto noconv;
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Check for a sign.  */
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (*s == L_('-'))
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      negative = 1;
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ++s;
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else if (*s == L_('+'))
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      negative = 0;
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      ++s;
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    negative = 0;
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Recognize number prefix and if BASE is zero, figure it out ourselves.  */
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (*s == L_('0'))
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          s += 2;
31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          base = 16;
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else if (base == 0)
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        base = 8;
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else if (base == 0)
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    base = 10;
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Save the pointer so we can check later if anything happened.  */
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  save = s;
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_NUMBER_GROUPING
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (group)
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Find the end of the digit string and check its grouping.  */
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      end = s;
331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      for (c = *end; c != L_('\0'); c = *++end)
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        if ((wchar_t) c != thousands
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang            && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (*s == thousands)
33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        end = s;
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        end = correctly_grouped_prefix (s, end, thousands, grouping);
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    end = NULL;
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base;
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base;
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  overflow = 0;
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  i = 0;
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (c = *s; c != L_('\0'); c = *++s)
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (s == end)
35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        break;
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (c >= L_('0') && c <= L_('9'))
35505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        c -= L_('0');
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else if (ISALPHA (c))
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        c = TOUPPER (c) - L_('A') + 10;
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        break;
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if ((int) c >= base)
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        break;
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Check for overflow.  */
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (i > cutoff || (i == cutoff && c > cutlim))
36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        overflow = 1;
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          i *= (unsigned LONG int) base;
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          i += c;
36905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Check if anything actually happened.  */
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (s == save)
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    goto noconv;
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Store in ENDPTR the address of one character
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     past the last character we converted.  */
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (endptr != NULL)
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    *endptr = (STRING_TYPE *) s;
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if !UNSIGNED
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Check for a value that is within the range of
38305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     'unsigned LONG int', but outside the range of 'LONG int'.  */
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (overflow == 0
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      && i > (negative
38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang              ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang              : (unsigned LONG int) STRTOL_LONG_MAX))
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    overflow = 1;
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (overflow)
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      __set_errno (ERANGE);
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if UNSIGNED
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return STRTOL_ULONG_MAX;
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Return the result of the appropriate sign.  */
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return negative ? -i : i;
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectnoconv:
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* We must handle a special case here: the base is 0 or 16 and the
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     first two characters are '0' and 'x', but the rest are no
407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     hexadecimal digits.  This is no error case.  We return 0 and
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     ENDPTR points to the 'x'.  */
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (endptr != NULL)
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          && save[-2] == L_('0'))
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        *endptr = (STRING_TYPE *) &save[-1];
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      else
41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        /*  There was no number to convert.  */
41605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        *endptr = (STRING_TYPE *) nptr;
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return 0L;
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* External user entry point.  */
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectINT
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef weak_function
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectweak_function
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstrtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        int base LOCALE_PARAM_PROTO)
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
434