Annotation of 42BSD/ingres/source/gutil/atof.c, revision 1.1

1.1     ! root        1: # include      <sccs.h>
        !             2: 
        !             3: SCCSID(@(#)atof.c      7.2     5/31/83)
        !             4: 
        !             5: /*
        !             6: **  ATOF -- ASCII TO FLOATING CONVERSION
        !             7: **
        !             8: **     Converts the string 'str' to floating point and stores the
        !             9: **     result into the cell pointed to by 'val'.
        !            10: **
        !            11: **     The syntax which it accepts is pretty much what you would
        !            12: **     expect.  Basically, it is:
        !            13: **             {<sp>} [+|-] {<sp>} {<digit>} [.{digit}] {<sp>} [<exp>]
        !            14: **     where <exp> is "e" or "E" followed by an integer, <sp> is a
        !            15: **     space character, <digit> is zero through nine, [] is zero or
        !            16: **     one, and {} is zero or more.
        !            17: **
        !            18: **     Parameters:
        !            19: **             str -- string to convert.
        !            20: **             val -- pointer to place to put the result (which
        !            21: **                     must be type double).
        !            22: **
        !            23: **     Returns:
        !            24: **             zero -- ok.
        !            25: **             -1 -- syntax error.
        !            26: **             +1 -- overflow (someday).
        !            27: **
        !            28: **     Side Effects:
        !            29: **             clobbers *val.
        !            30: */
        !            31: 
        !            32: atof(str, val)
        !            33: char   *str;
        !            34: double *val;
        !            35: {
        !            36:        register char   *p;
        !            37:        double          v;
        !            38:        extern double   pow();
        !            39:        double          fact;
        !            40:        int             minus;
        !            41:        register char   c;
        !            42:        int             expon;
        !            43:        register int    gotmant;
        !            44: 
        !            45:        v = 0.0;
        !            46:        p = str;
        !            47:        minus = 0;
        !            48: 
        !            49:        /* skip leading blanks */
        !            50:        while (c = *p)
        !            51:        {
        !            52:                if (c != ' ')
        !            53:                        break;
        !            54:                p++;
        !            55:        }
        !            56: 
        !            57:        /* handle possible sign */
        !            58:        switch (c)
        !            59:        {
        !            60: 
        !            61:          case '-':
        !            62:                minus++;
        !            63: 
        !            64:          case '+':
        !            65:                p++;
        !            66: 
        !            67:        }
        !            68: 
        !            69:        /* skip blanks after sign */
        !            70:        while (c = *p)
        !            71:        {
        !            72:                if (c != ' ')
        !            73:                        break;
        !            74:                p++;
        !            75:        }
        !            76: 
        !            77:        /* start collecting the number to the decimal point */
        !            78:        gotmant = 0;
        !            79:        for (;;)
        !            80:        {
        !            81:                c = *p;
        !            82:                if (c < '0' || c > '9')
        !            83:                        break;
        !            84:                v = v * 10.0 + (c - '0');
        !            85:                gotmant++;
        !            86:                p++;
        !            87:        }
        !            88: 
        !            89:        /* check for fractional part */
        !            90:        if (c == '.')
        !            91:        {
        !            92:                fact = 1.0;
        !            93:                for (;;)
        !            94:                {
        !            95:                        c = *++p;
        !            96:                        if (c < '0' || c > '9')
        !            97:                                break;
        !            98:                        fact *= 0.1;
        !            99:                        v += (c - '0') * fact;
        !           100:                        gotmant++;
        !           101:                }
        !           102:        }
        !           103: 
        !           104:        /* skip blanks before possible exponent */
        !           105:        while (c = *p)
        !           106:        {
        !           107:                if (c != ' ')
        !           108:                        break;
        !           109:                p++;
        !           110:        }
        !           111: 
        !           112:        /* test for exponent */
        !           113:        if (c == 'e' || c == 'E')
        !           114:        {
        !           115:                p++;
        !           116:                expon = atoi(p);
        !           117:                if (!gotmant)
        !           118:                        v = 1.0;
        !           119:                fact = expon;
        !           120:                v *= pow(10.0, fact);
        !           121:        }
        !           122:        else
        !           123:        {
        !           124:                /* if no exponent, then nothing */
        !           125:                if (c != 0)
        !           126:                        return (-1);
        !           127:        }
        !           128: 
        !           129:        /* store the result and exit */
        !           130:        if (minus)
        !           131:                v = -v;
        !           132:        *val = v;
        !           133:        return (0);
        !           134: }

unix.superglobalmegacorp.com

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