strtoul.c (87196) | strtoul.c (87494) |
---|---|
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 87196 2001-12-02 09:15:54Z ache $ | 33 * $FreeBSD: head/lib/libc/stdlib/strtoul.c 87494 2001-12-07 16:33:47Z 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> --- 9 unchanged lines hidden (view full) --- 51unsigned long 52strtoul(nptr, endptr, base) 53 const char *nptr; 54 char **endptr; 55 int base; 56{ 57 const char *s; 58 unsigned long acc; | 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> --- 9 unchanged lines hidden (view full) --- 51unsigned long 52strtoul(nptr, endptr, base) 53 const char *nptr; 54 char **endptr; 55 int base; 56{ 57 const char *s; 58 unsigned long acc; |
59 unsigned char c; | 59 char c; |
60 unsigned long cutoff; | 60 unsigned long cutoff; |
61 int neg, any, cutlim, n; | 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++; | 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)); | 69 } while (isspace((unsigned char)c)); |
70 if (c == '-') { 71 neg = 1; 72 c = *s++; 73 } else { 74 neg = 0; 75 if (c == '+') 76 c = *s++; 77 } --- 7 unchanged lines hidden (view full) --- 85 base = c == '0' ? 8 : 10; 86 acc = any = 0; 87 if (base < 2 || base > 36) 88 goto noconv; 89 90 cutoff = ULONG_MAX / base; 91 cutlim = ULONG_MAX % base; 92 for ( ; ; c = *s++) { | 70 if (c == '-') { 71 neg = 1; 72 c = *s++; 73 } else { 74 neg = 0; 75 if (c == '+') 76 c = *s++; 77 } --- 7 unchanged lines hidden (view full) --- 85 base = c == '0' ? 8 : 10; 86 acc = any = 0; 87 if (base < 2 || base > 36) 88 goto noconv; 89 90 cutoff = ULONG_MAX / base; 91 cutlim = ULONG_MAX % base; 92 for ( ; ; c = *s++) { |
93 if (isxdigit(c)) 94 n = digittoint(c); 95 else if (isalpha(c)) 96 n = (char)c - (isupper(c) ? 'A' - 10 : 'a' - 10); | 93 if (c >= '0' && c <= '9') 94 c -= '0'; 95 else if (c >= 'A' && c <= 'Z') 96 c -= 'A' - 10; 97 else if (c >= 'a' && c <= 'z') 98 c -= 'a' - 10; |
97 else 98 break; | 99 else 100 break; |
99 if (n < 0 || n >= base) | 101 if (c >= base) |
100 break; | 102 break; |
101 if (any < 0 || acc > cutoff || (acc == cutoff && n > cutlim)) | 103 if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) |
102 any = -1; 103 else { 104 any = 1; 105 acc *= base; | 104 any = -1; 105 else { 106 any = 1; 107 acc *= base; |
106 acc += n; | 108 acc += c; |
107 } 108 } 109 if (any < 0) { 110 acc = ULONG_MAX; 111 errno = ERANGE; 112 } else if (!any) { 113noconv: 114 errno = EINVAL; 115 } else if (neg) 116 acc = -acc; 117 if (endptr != NULL) 118 *endptr = (char *)(any ? s - 1 : nptr); 119 return (acc); 120} | 109 } 110 } 111 if (any < 0) { 112 acc = ULONG_MAX; 113 errno = ERANGE; 114 } else if (!any) { 115noconv: 116 errno = EINVAL; 117 } else if (neg) 118 acc = -acc; 119 if (endptr != NULL) 120 *endptr = (char *)(any ? s - 1 : nptr); 121 return (acc); 122} |