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