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