Mercurial > hg > octave-jordi > gnulib-hg
annotate lib/strtol.c @ 527:c6cca2ddbf8d
new version from FSF
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Fri, 15 Dec 1995 15:35:15 +0000 |
parents | c3052f3c02fe |
children | a1052e824123 |
rev | line source |
---|---|
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
1 /* Copyright (C) 1991, 1992, 1994, 1995 Free Software Foundation, Inc. |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
2 |
527 | 3 |
4 NOTE: The canonical source of this file is maintained with the GNU C Library. | |
5 Bugs can be reported to bug-glibc@prep.ai.mit.edu. | |
15 | 6 |
527 | 7 This program is free software; you can redistribute it and/or modify it |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
15 | 11 |
527 | 12 This program is distributed in the hope that it will be useful, |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
15 | 16 |
527 | 17 You should have received a copy of the GNU General Public License |
18 along with this program; if not, write to the Free Software | |
19 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
376 | 20 |
21 #ifdef HAVE_CONFIG_H | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
22 # include <config.h> |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
23 #endif |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
24 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
25 #ifdef _LIBC |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
26 # define USE_NUMBER_GROUPING |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
27 # define STDC_HEADERS |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
28 # define HAVE_LIMITS_H |
376 | 29 #endif |
15 | 30 |
31 #include <ctype.h> | |
32 #include <errno.h> | |
376 | 33 #ifndef errno |
34 extern int errno; | |
35 #endif | |
15 | 36 |
527 | 37 #ifdef HAVE_LIMITS_H |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
38 # include <limits.h> |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
39 #endif |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
40 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
41 #ifdef STDC_HEADERS |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
42 # include <stddef.h> |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
43 # include <stdlib.h> |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
44 #else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
45 # ifndef NULL |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
46 # define NULL 0 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
47 # endif |
15 | 48 #endif |
376 | 49 |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
50 #ifdef USE_NUMBER_GROUPING |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
51 # include "../locale/localeinfo.h" |
376 | 52 #endif |
53 | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
54 /* Nonzero if we are defining `strtoul' or `strtouq', operating on |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
55 unsigned integers. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
56 #ifndef UNSIGNED |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
57 # define UNSIGNED 0 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
58 # define INT LONG int |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
59 #else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
60 # define strtol strtoul |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
61 # define INT unsigned LONG int |
376 | 62 #endif |
63 | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
64 /* If QUAD is defined, we are defining `strtoq' or `strtouq', |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
65 operating on `long long int's. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
66 #ifdef QUAD |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
67 # if UNSIGNED |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
68 # define strtoul strtouq |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
69 # else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
70 # define strtol strtoq |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
71 # endif |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
72 # define LONG long long |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
73 # undef LONG_MIN |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
74 # define LONG_MIN LONG_LONG_MIN |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
75 # undef LONG_MAX |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
76 # define LONG_MAX LONG_LONG_MAX |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
77 # undef ULONG_MAX |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
78 # define ULONG_MAX ULONG_LONG_MAX |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
79 # if __GNUC__ == 2 && __GNUC_MINOR__ < 7 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
80 /* Work around gcc bug with using this constant. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
81 static const unsigned long long int maxquad = ULONG_LONG_MAX; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
82 # undef ULONG_MAX |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
83 # define ULONG_MAX maxquad |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
84 # endif |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
85 #else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
86 # define LONG long |
15 | 87 #endif |
88 | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
89 #ifdef __STDC__ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
90 # define INTERNAL(x) INTERNAL1(x) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
91 # define INTERNAL1(x) __##x##_internal |
15 | 92 #else |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
93 # define INTERNAL(x) __/**/x/**/_internal |
15 | 94 #endif |
95 | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
96 #ifdef USE_NUMBER_GROUPING |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
97 /* This file defines a function to check for correct grouping. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
98 # include "grouping.h" |
15 | 99 #endif |
100 | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
101 |
15 | 102 /* Convert NPTR to an `unsigned long int' or `long int' in base BASE. |
103 If BASE is 0 the base is determined by the presence of a leading | |
104 zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal. | |
105 If BASE is < 2 or > 36, it is reset to 10. | |
106 If ENDPTR is not NULL, a pointer to the character after the last | |
107 one converted is stored in *ENDPTR. */ | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
108 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
109 INT |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
110 INTERNAL (strtol) (nptr, endptr, base, group) |
15 | 111 const char *nptr; |
112 char **endptr; | |
113 int base; | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
114 int group; |
15 | 115 { |
116 int negative; | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
117 register unsigned LONG int cutoff; |
15 | 118 register unsigned int cutlim; |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
119 register unsigned LONG int i; |
15 | 120 register const char *s; |
121 register unsigned char c; | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
122 const char *save, *end; |
15 | 123 int overflow; |
124 | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
125 #ifdef USE_NUMBER_GROUPING |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
126 /* The thousands character of the current locale. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
127 wchar_t thousands; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
128 /* The numeric grouping specification of the current locale, |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
129 in the format described in <locale.h>. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
130 const char *grouping; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
131 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
132 if (group) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
133 { |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
134 grouping = _NL_CURRENT (LC_NUMERIC, GROUPING); |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
135 if (*grouping <= 0 || *grouping == CHAR_MAX) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
136 grouping = NULL; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
137 else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
138 { |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
139 /* Figure out the thousands separator character. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
140 if (mbtowc (&thousands, _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP), |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
141 strlen (_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP))) <= 0) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
142 thousands = (wchar_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP); |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
143 if (thousands == L'\0') |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
144 grouping = NULL; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
145 } |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
146 } |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
147 else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
148 grouping = NULL; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
149 #endif |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
150 |
15 | 151 if (base < 0 || base == 1 || base > 36) |
152 base = 10; | |
153 | |
154 s = nptr; | |
155 | |
156 /* Skip white space. */ | |
157 while (isspace (*s)) | |
158 ++s; | |
159 if (*s == '\0') | |
160 goto noconv; | |
161 | |
162 /* Check for a sign. */ | |
163 if (*s == '-') | |
164 { | |
165 negative = 1; | |
166 ++s; | |
167 } | |
168 else if (*s == '+') | |
169 { | |
170 negative = 0; | |
171 ++s; | |
172 } | |
173 else | |
174 negative = 0; | |
175 | |
176 if (base == 16 && s[0] == '0' && toupper (s[1]) == 'X') | |
177 s += 2; | |
178 | |
179 /* If BASE is zero, figure it out ourselves. */ | |
180 if (base == 0) | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
181 if (*s == '0') |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
182 { |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
183 if (toupper (s[1]) == 'X') |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
184 { |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
185 s += 2; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
186 base = 16; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
187 } |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
188 else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
189 base = 8; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
190 } |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
191 else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
192 base = 10; |
15 | 193 |
194 /* Save the pointer so we can check later if anything happened. */ | |
195 save = s; | |
196 | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
197 #ifdef USE_NUMBER_GROUPING |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
198 if (group) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
199 { |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
200 /* Find the end of the digit string and check its grouping. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
201 end = s; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
202 for (c = *end; c != '\0'; c = *++end) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
203 if (c != thousands && !isdigit (c) && |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
204 (!isalpha (c) || toupper (c) - 'A' + 10 >= base)) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
205 break; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
206 if (*s == thousands) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
207 end = s; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
208 else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
209 end = correctly_grouped_prefix (s, end, thousands, grouping); |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
210 } |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
211 else |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
212 #endif |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
213 end = NULL; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
214 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
215 cutoff = ULONG_MAX / (unsigned LONG int) base; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
216 cutlim = ULONG_MAX % (unsigned LONG int) base; |
15 | 217 |
218 overflow = 0; | |
219 i = 0; | |
220 for (c = *s; c != '\0'; c = *++s) | |
221 { | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
222 if (s == end) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
223 break; |
15 | 224 if (isdigit (c)) |
225 c -= '0'; | |
226 else if (isalpha (c)) | |
227 c = toupper (c) - 'A' + 10; | |
228 else | |
229 break; | |
230 if (c >= base) | |
231 break; | |
232 /* Check for overflow. */ | |
233 if (i > cutoff || (i == cutoff && c > cutlim)) | |
234 overflow = 1; | |
235 else | |
236 { | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
237 i *= (unsigned LONG int) base; |
15 | 238 i += c; |
239 } | |
240 } | |
241 | |
242 /* Check if anything actually happened. */ | |
243 if (s == save) | |
244 goto noconv; | |
245 | |
246 /* Store in ENDPTR the address of one character | |
247 past the last character we converted. */ | |
248 if (endptr != NULL) | |
249 *endptr = (char *) s; | |
250 | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
251 #if !UNSIGNED |
15 | 252 /* Check for a value that is within the range of |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
253 `unsigned LONG int', but outside the range of `LONG int'. */ |
15 | 254 if (i > (negative ? |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
255 -(unsigned LONG int) LONG_MIN : (unsigned LONG int) LONG_MAX)) |
15 | 256 overflow = 1; |
257 #endif | |
258 | |
259 if (overflow) | |
260 { | |
261 errno = ERANGE; | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
262 #if UNSIGNED |
15 | 263 return ULONG_MAX; |
264 #else | |
265 return negative ? LONG_MIN : LONG_MAX; | |
266 #endif | |
267 } | |
268 | |
269 /* Return the result of the appropriate sign. */ | |
376 | 270 return (negative ? -i : i); |
15 | 271 |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
272 noconv: |
15 | 273 /* There was no number to convert. */ |
274 if (endptr != NULL) | |
275 *endptr = (char *) nptr; | |
276 return 0L; | |
277 } | |
469
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
278 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
279 /* External user entry point. */ |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
280 |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
281 INT |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
282 strtol (nptr, endptr, base) |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
283 const char *nptr; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
284 char **endptr; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
285 int base; |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
286 { |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
287 return INTERNAL (strtol) (nptr, endptr, base, 0); |
c3052f3c02fe
New version -- now derived from the line in libc.
Jim Meyering <jim@meyering.net>
parents:
376
diff
changeset
|
288 } |
527 | 289 |
290 #ifdef weak_symbol | |
291 weak_symbol (strtol) | |
292 #endif |