Annotation of cci/usr/src/usr.bin/sf77/atof.c, revision 1.1

1.1     ! root        1: /*     atof.s  4.2     83/06/30        */
        !             2: 
        !             3: /*
        !             4:        C library - ascii to floating
        !             5: */
        !             6: 
        !             7: #include <stdio.h>
        !             8: #include <ctype.h>
        !             9: #define LOGHUGE        39
        !            10: 
        !            11: double
        !            12: atof(p)
        !            13: register char *p;
        !            14: {
        !            15:        register c;
        !            16:        double fl, flexp, exp5;
        !            17:        static double big = 72057594037927936.;  /*2^56 (Dorit)*/
        !            18:        double ldexp();
        !            19:        int nd;
        !            20:        register eexp, exp, neg, negexp, bexp;
        !            21: 
        !            22:        neg = 1;
        !            23:        while((c = *p++) == ' ')
        !            24:                ;
        !            25:        if (c == '-')
        !            26:                neg = -1;
        !            27:        else if (c=='+')
        !            28:                ;
        !            29:        else
        !            30:                --p;
        !            31: 
        !            32:        exp = 0;
        !            33:        fl = 0;
        !            34:        nd = 0;
        !            35:        while ((c = *p++), isdigit(c)) {
        !            36:                if (fl<big)
        !            37:                        fl = 10*fl + (c-'0');
        !            38:                else
        !            39:                        exp++;
        !            40:                nd++;
        !            41:        }
        !            42: 
        !            43:        if (c == '.') {
        !            44:                while ((c = *p++), isdigit(c)) {
        !            45:                        if (fl<big) {
        !            46:                                fl = 10*fl + (c-'0');
        !            47:                                exp--;
        !            48:                        }
        !            49:                nd++;
        !            50:                }
        !            51:        }
        !            52: 
        !            53:        negexp = 1;
        !            54:        eexp = 0;
        !            55:        if ((c == 'E') || (c == 'e')) {
        !            56:                if ((c= *p++) == '+')
        !            57:                        ;
        !            58:                else if (c=='-')
        !            59:                        negexp = -1;
        !            60:                else
        !            61:                        --p;
        !            62: 
        !            63:                while ((c = *p++), isdigit(c)) {
        !            64:                        eexp = 10*eexp+(c-'0');
        !            65:                }
        !            66:                if (negexp<0)
        !            67:                        eexp = -eexp;
        !            68:                exp = exp + eexp;
        !            69:        }
        !            70: 
        !            71:        negexp = 1;
        !            72:        if (exp<0) {
        !            73:                negexp = -1;
        !            74:                exp = -exp;
        !            75:        }
        !            76: 
        !            77: 
        !            78:        if((nd+exp*negexp) < -LOGHUGE){
        !            79:                fl = 0;
        !            80:                exp = 0;
        !            81: fprintf(stderr, "%x \n", negexp);
        !            82:        }
        !            83:        flexp = 1;
        !            84:        exp5 = 5;
        !            85:        bexp = exp;
        !            86:        for (;;) {
        !            87:                if (exp&01)
        !            88:                        flexp *= exp5;
        !            89:                exp >>= 1;
        !            90:                if (exp==0)
        !            91:                        break;
        !            92:                exp5 *= exp5;
        !            93:        }
        !            94:        if (negexp<0)
        !            95:                fl /= flexp;
        !            96:        else
        !            97:                fl *= flexp;
        !            98:        fl = ldexp(fl, negexp*bexp);
        !            99:        if (neg<0)
        !           100:                fl = -fl;
        !           101:        return(fl);
        !           102: }

unix.superglobalmegacorp.com

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