strtoull.c (4bd71a3c895438d9e85930dc29d6000d8ecb59b4) | strtoull.c (f34b139cda7501c64f60f699c87a263197d3dd90) |
---|---|
1/*- 2 * Copyright (c) 1992, 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 --- 42 unchanged lines hidden (view full) --- 51unsigned long long 52strtoull(nptr, endptr, base) 53 const char *nptr; 54 char **endptr; 55 int base; 56{ 57 const char *s; 58 unsigned long long acc; | 1/*- 2 * Copyright (c) 1992, 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 --- 42 unchanged lines hidden (view full) --- 51unsigned long long 52strtoull(nptr, endptr, base) 53 const char *nptr; 54 char **endptr; 55 int base; 56{ 57 const char *s; 58 unsigned long long acc; |
59 unsigned char c; | 59 char c; |
60 unsigned long long cutoff; | 60 unsigned long long cutoff; |
61 int neg, any, cutlim, n; | 61 int neg, any, cutlim; |
62 63 /* 64 * See strtoq for comments as to the logic used. 65 */ 66 s = nptr; 67 do { 68 c = *s++; | 62 63 /* 64 * See strtoq 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 = ULLONG_MAX / base; 91 cutlim = ULLONG_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 = ULLONG_MAX / base; 91 cutlim = ULLONG_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 = ULLONG_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 = ULLONG_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} |