strtol.c (f8a31dd2accd11646d2945965c79a2d8355cf573) | strtol.c (1a4e73ba51d4cfb150612ce0be5029abf96c119e) |
---|---|
1/*- 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * | 1/*- 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * |
5 * This code is derived from software contributed to Berkeley by 6 * Chris Torek. 7 * |
|
5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. --- 11 unchanged lines hidden (view full) --- 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. | 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. --- 11 unchanged lines hidden (view full) --- 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. |
35 * 36 * From: static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93"; 37 * 38 * $FreeBSD$ |
|
32 */ 33 | 39 */ 40 |
34#if defined(LIBC_SCCS) && !defined(lint) 35static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93"; 36#endif /* LIBC_SCCS and not lint */ 37 38#include <sys/types.h> | 41#include <sys/param.h> 42#include <sys/systm.h> 43#include <sys/ctype.h> |
39#include <machine/limits.h> 40 | 44#include <machine/limits.h> 45 |
41 | |
42/* 43 * Convert a string to a long integer. 44 * 45 * Ignores `locale' stuff. Assumes that the upper and lower case 46 * alphabets and digits are each contiguous. | 46/* 47 * Convert a string to a long integer. 48 * 49 * Ignores `locale' stuff. Assumes that the upper and lower case 50 * alphabets and digits are each contiguous. |
47 * 48 * Slightly lobotomized for inclusion in libkern. | |
49 */ 50long 51strtol(nptr, endptr, base) 52 const char *nptr; | 51 */ 52long 53strtol(nptr, endptr, base) 54 const char *nptr; |
53 char **endptr; 54 register int base; | 55 const char **endptr; 56 int base; |
55{ | 57{ |
56 register const char *s = nptr; 57 register unsigned long acc; 58 register int c; 59 register unsigned long cutoff; 60 register int neg = 0, any, cutlim; | 58 const char *s = nptr; 59 unsigned long acc; 60 unsigned char c; 61 unsigned long cutoff; 62 int neg = 0, any, cutlim; |
61 62 /* 63 * Skip white space and pick up leading +/- sign if any. 64 * If base is 0, allow 0x for hex and 0 for octal, else 65 * assume decimal; if base is already 16, allow 0x. 66 */ 67 do { 68 c = *s++; | 63 64 /* 65 * Skip white space and pick up leading +/- sign if any. 66 * If base is 0, allow 0x for hex and 0 for octal, else 67 * assume decimal; if base is already 16, allow 0x. 68 */ 69 do { 70 c = *s++; |
69 } while (c == ' ' || c == '\t'); | 71 } while (isspace(c)); |
70 if (c == '-') { 71 neg = 1; 72 c = *s++; 73 } else if (c == '+') 74 c = *s++; 75 if ((base == 0 || base == 16) && 76 c == '0' && (*s == 'x' || *s == 'X')) { 77 c = s[1]; --- 19 unchanged lines hidden (view full) --- 97 * 98 * Set any if any `digits' consumed; make it negative to indicate 99 * overflow. 100 */ 101 cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; 102 cutlim = cutoff % (unsigned long)base; 103 cutoff /= (unsigned long)base; 104 for (acc = 0, any = 0;; c = *s++) { | 72 if (c == '-') { 73 neg = 1; 74 c = *s++; 75 } else if (c == '+') 76 c = *s++; 77 if ((base == 0 || base == 16) && 78 c == '0' && (*s == 'x' || *s == 'X')) { 79 c = s[1]; --- 19 unchanged lines hidden (view full) --- 99 * 100 * Set any if any `digits' consumed; make it negative to indicate 101 * overflow. 102 */ 103 cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; 104 cutlim = cutoff % (unsigned long)base; 105 cutoff /= (unsigned long)base; 106 for (acc = 0, any = 0;; c = *s++) { |
105 if (c >= '0' && c <= '9') | 107 if (!isascii(c)) 108 break; 109 if (isdigit(c)) |
106 c -= '0'; | 110 c -= '0'; |
107 else if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) 108 c -= (c >= 'A' && c <= 'Z') ? 'A' - 10 : 'a' - 10; | 111 else if (isalpha(c)) 112 c -= isupper(c) ? 'A' - 10 : 'a' - 10; |
109 else 110 break; 111 if (c >= base) 112 break; | 113 else 114 break; 115 if (c >= base) 116 break; |
113 if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) | 117 if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) |
114 any = -1; 115 else { 116 any = 1; 117 acc *= base; 118 acc += c; 119 } 120 } 121 if (any < 0) { 122 acc = neg ? LONG_MIN : LONG_MAX; 123 } else if (neg) 124 acc = -acc; 125 if (endptr != 0) | 118 any = -1; 119 else { 120 any = 1; 121 acc *= base; 122 acc += c; 123 } 124 } 125 if (any < 0) { 126 acc = neg ? LONG_MIN : LONG_MAX; 127 } else if (neg) 128 acc = -acc; 129 if (endptr != 0) |
126 *endptr = (char *)(any ? s - 1 : nptr); | 130 *endptr = (const char *)(any ? s - 1 : nptr); |
127 return (acc); 128} | 131 return (acc); 132} |