strtoul.c (82995) | strtoul.c (87016) |
---|---|
1/* 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 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 --- 16 unchanged lines hidden (view full) --- 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. 32 * | 1/* 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 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 --- 16 unchanged lines hidden (view full) --- 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. 32 * |
33 * $FreeBSD: head/lib/libc/stdlib/strtoul.c 82995 2001-09-04 17:41:20Z ache $ | 33 * $FreeBSD: head/lib/libc/stdlib/strtoul.c 87016 2001-11-28 00:48:11Z ache $ |
34 */ 35 36#if defined(LIBC_SCCS) && !defined(lint) 37static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; 38#endif /* LIBC_SCCS and not lint */ 39 40#include <limits.h> 41#include <ctype.h> --- 5 unchanged lines hidden (view full) --- 47 * 48 * Assumes that the upper and lower case 49 * alphabets and digits are each contiguous. 50 */ 51unsigned long 52strtoul(nptr, endptr, base) 53 const char *nptr; 54 char **endptr; | 34 */ 35 36#if defined(LIBC_SCCS) && !defined(lint) 37static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; 38#endif /* LIBC_SCCS and not lint */ 39 40#include <limits.h> 41#include <ctype.h> --- 5 unchanged lines hidden (view full) --- 47 * 48 * Assumes that the upper and lower case 49 * alphabets and digits are each contiguous. 50 */ 51unsigned long 52strtoul(nptr, endptr, base) 53 const char *nptr; 54 char **endptr; |
55 register int base; | 55 int base; |
56{ | 56{ |
57 register const char *s; 58 register unsigned long acc; 59 register unsigned char c; 60 register unsigned long cutoff; 61 register int neg, any, cutlim; | 57 const char *s; 58 unsigned long acc; 59 unsigned char c; 60 unsigned long cutoff; 61 int neg, any, cutlim; |
62 63 /* 64 * See strtol for comments as to the logic used. 65 */ 66 s = nptr; 67 do { 68 c = *s++; 69 } while (isspace(c)); --- 9 unchanged lines hidden (view full) --- 79 c == '0' && (*s == 'x' || *s == 'X')) { 80 c = s[1]; 81 s += 2; 82 base = 16; 83 } 84 if (base == 0) 85 base = c == '0' ? 8 : 10; 86 acc = any = 0; | 62 63 /* 64 * See strtol for comments as to the logic used. 65 */ 66 s = nptr; 67 do { 68 c = *s++; 69 } while (isspace(c)); --- 9 unchanged lines hidden (view full) --- 79 c == '0' && (*s == 'x' || *s == 'X')) { 80 c = s[1]; 81 s += 2; 82 base = 16; 83 } 84 if (base == 0) 85 base = c == '0' ? 8 : 10; 86 acc = any = 0; |
87 if (base < 2 || base > 36) | 87 if (base < 2) |
88 goto noconv; 89 90 cutoff = ULONG_MAX / base; 91 cutlim = ULONG_MAX % base; 92 for ( ; ; c = *s++) { | 88 goto noconv; 89 90 cutoff = ULONG_MAX / base; 91 cutlim = ULONG_MAX % base; 92 for ( ; ; c = *s++) { |
93 if (!isascii(c)) 94 break; 95 if (isdigit(c)) 96 c -= '0'; 97 else if (isalpha(c)) | 93 if (isxdigit(c)) 94 c = digittoint(c); 95 else if (isascii(c) && isalpha(c)) |
98 c -= isupper(c) ? 'A' - 10 : 'a' - 10; 99 else 100 break; 101 if (c >= base) 102 break; 103 if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) 104 any = -1; 105 else { --- 17 unchanged lines hidden --- | 96 c -= isupper(c) ? 'A' - 10 : 'a' - 10; 97 else 98 break; 99 if (c >= base) 100 break; 101 if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) 102 any = -1; 103 else { --- 17 unchanged lines hidden --- |