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 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; |
55 int base; |
56{ |
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; |
87 if (base < 2) |
88 goto noconv; 89 90 cutoff = ULONG_MAX / base; 91 cutlim = ULONG_MAX % base; 92 for ( ; ; c = *s++) { |
93 if (isxdigit(c)) 94 c = digittoint(c); 95 else if (isascii(c) && isalpha(c)) |
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 --- |