Annotation of coherent/a/usr/src/sample/atod.c, revision 1.1

1.1     ! root        1: #include <ctype.h>
        !             2: 
        !             3: #define        ERROR   0x10            /* largest input base */
        !             4: 
        !             5: /*
        !             6:  * atod() converts the string 'num' to a double and returns its value.
        !             7:  * If there is a non-digit in the string, or if there is an overflow,
        !             8:  * then atod() exits with an appropriate error message.
        !             9:  * atod() accepts leading zero for octal and leading 0x for hexidecimal;
        !            10:  * in the latter case, 'a'-'f' and 'A'-'F' are accepted as digits.
        !            11:  */
        !            12: double
        !            13: atod(num)
        !            14: char   *num;
        !            15: {
        !            16:        register char   *str;
        !            17:        register int    i;
        !            18:        double          res     = 0,
        !            19:                        base    = 10;
        !            20: 
        !            21:        str = num;
        !            22:        i = *str++;
        !            23:        if (i == '0')
        !            24:                if ((i = *str++) == 'x') {
        !            25:                        i = *str++;
        !            26:                        base = 0x10;
        !            27:                } else
        !            28:                        base = 010;
        !            29:        for (; i != '\0'; i = *str++) {
        !            30:                i = todigit(i);
        !            31:                if (i >= base)
        !            32:                        die("bad number '%s'", num);
        !            33:                res = res * base + i;
        !            34:                if (res+1 == res)
        !            35:                        die("number too big '%s'", num);
        !            36:        }
        !            37:        return (res);
        !            38: }
        !            39: 
        !            40: 
        !            41: /*
        !            42:  * todigit() converts character 'ch' to an integer equivalent,
        !            43:  * assuming that 'ch' is a digit or 'a'-'f' or 'A'-'F'.
        !            44:  * If this is not true, then it returns ERROR.
        !            45:  */
        !            46: todigit(ch)
        !            47: register int   ch;
        !            48: {
        !            49:        if (!isascii(ch))
        !            50:                return (ERROR);
        !            51:        if (isdigit(ch))
        !            52:                return (ch - '0' + 0);
        !            53:        if (isupper(ch))
        !            54:                ch = tolower(ch);
        !            55:        if ('a' <= ch && ch <= 'f')
        !            56:                return (ch - 'a' + 0xA);
        !            57:        return (ERROR);
        !            58: }
        !            59: 
        !            60: 

unix.superglobalmegacorp.com

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