123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /*
- * This file is part of the UCB release of Plan 9. It is subject to the license
- * terms in the LICENSE file found in the top-level directory of this
- * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
- * part of the UCB release of Plan 9, including this file, may be copied,
- * modified, propagated, or distributed except according to the terms contained
- * in the LICENSE file.
- */
- #include <u.h>
- #include <libc.h>
- #define VLONG_MAX ~(1LL<<63)
- #define VLONG_MIN (1LL<<63)
- int64_t
- <<<<<<< HEAD
- strtoll(char *nptr, char **endptr, int base)
- =======
- strtoll(const char *nptr, char **endptr, int base)
- >>>>>>> 064e99309... Changed strto[l|ul|ull] functions to have correct signature
- {
- char *p;
- int64_t n, nn, m;
- int c, ovfl, v, neg, ndig;
- p = nptr;
- neg = 0;
- n = 0;
- ndig = 0;
- ovfl = 0;
- /*
- * White space
- */
- for(;; p++) {
- switch(*p) {
- case ' ':
- case '\t':
- case '\n':
- case '\f':
- case '\r':
- case '\v':
- continue;
- }
- break;
- }
- /*
- * Sign
- */
- if(*p=='-' || *p=='+')
- if(*p++ == '-')
- neg = 1;
- /*
- * Base
- */
- if(base==0){
- base = 10;
- if(*p == '0') {
- base = 8;
- if(p[1]=='x' || p[1]=='X') {
- p += 2;
- base = 16;
- }
- }
- } else
- if(base==16 && *p=='0') {
- if(p[1]=='x' || p[1]=='X')
- p += 2;
- } else
- if(base<0 || 36<base)
- goto Return;
- /*
- * Non-empty sequence of digits
- */
- m = VLONG_MAX/base;
- for(;; p++,ndig++) {
- c = *p;
- v = base;
- if('0'<=c && c<='9')
- v = c - '0';
- else
- if('a'<=c && c<='z')
- v = c - 'a' + 10;
- else
- if('A'<=c && c<='Z')
- v = c - 'A' + 10;
- if(v >= base)
- break;
- if(n > m)
- ovfl = 1;
- nn = n*base + v;
- if(nn < n)
- ovfl = 1;
- n = nn;
- }
- Return:
- if(ndig == 0)
- p = nptr;
- if(endptr)
- *endptr = (char *)p;
- if(ovfl){
- if(neg)
- return VLONG_MIN;
- return VLONG_MAX;
- }
- if(neg)
- return -n;
- return n;
- }
|