Annotation of researchv9/jerq/sgs/optim/strtol.c, revision 1.1.1.1

1.1       root        1: /*     @(#)strtol.c    2.1     */
                      2: /*LINTLIBRARY*/
                      3: #include <ctype.h>
                      4: #define DIGIT(x)       (isdigit(x) ? (x) - '0' : \
                      5:                        islower(x) ? (x) + 10 - 'a' : (x) + 10 - 'A')
                      6: #define MBASE  ('z' - 'a' + 1 + 10)
                      7: 
                      8: long
                      9: strtol(str, ptr, base)
                     10: register char *str;
                     11: char **ptr;
                     12: register int base;
                     13: {
                     14:        register long val;
                     15:        register int c;
                     16:        int xx, neg = 0;
                     17: 
                     18:        if (ptr != (char **)0)
                     19:                *ptr = str; /* in case no number is formed */
                     20:        if (base < 0 || base > MBASE)
                     21:                return (0); /* base is invalid -- should be a fatal error */
                     22:        if (!isalnum(c = *str)) {
                     23:                while (isspace(c))
                     24:                        c = *++str;
                     25:                switch (c) {
                     26:                case '-':
                     27:                        neg++;
                     28:                case '+': /* fall-through */
                     29:                        c = *++str;
                     30:                }
                     31:        }
                     32:        if (base == 0)
                     33:                if (c != '0')
                     34:                        base = 10;
                     35:                else if (str[1] == 'x' || str[1] == 'X')
                     36:                        base = 16;
                     37:                else
                     38:                        base = 8;
                     39:        /*
                     40:         * for any base > 10, the digits incrementally following
                     41:         *      9 are assumed to be "abc...z" or "ABC...Z"
                     42:         */
                     43:        if (!isalnum(c) || (xx = DIGIT(c)) >= base)
                     44:                return (0); /* no number formed */
                     45:        if (base == 16 && c == '0' && isxdigit(str[2]) &&
                     46:            (str[1] == 'x' || str[1] == 'X'))
                     47:                c = *(str += 2); /* skip over leading "0x" or "0X" */
                     48:        for (val = -DIGIT(c); isalnum(c = *++str) && (xx = DIGIT(c)) < base; )
                     49:                /* accumulate neg avoids surprises near MAXLONG */
                     50:                val = base * val - xx;
                     51:        if (ptr != (char **)0)
                     52:                *ptr = str;
                     53:        return (neg ? val : -val);
                     54: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.