Annotation of 3BSD/libc/gen/atof.c, revision 1.1

1.1     ! root        1: union {
        !             2:        short foo0[4];
        !             3:        double big;
        !             4: } bar0 /* = {0x5c80,0,0,0} */ ; /* 2**56 as double floating point */
        !             5: union {
        !             6:        short foo1[4];
        !             7:        double huge;
        !             8: } bar1 /* = {0x8000,0,0,0} */ ; /* reserved operand */
        !             9: 
        !            10: double atof(p) register char *p; {
        !            11: register double exp,val;
        !            12: register char c; register int dpdig;
        !            13: int scale; char sign,esign;
        !            14: 
        !            15: abort(); /* THE REAL ROUTINE IS atofo.s !!!!! */
        !            16: while ((c= *p++)==' ');        /* skip leading spaces */
        !            17: sign=0;
        !            18: if (c=='-') ++sign;    /* mark negative */
        !            19: else if (c=='+') ;     /* ignore plus */
        !            20: else --p;              /* get back on track */
        !            21: 
        !            22: val=0; dpdig=0;
        !            23: /* true value is aproximately  ((-1)**sign) * val * (10 ** dpdig) */
        !            24: while ((c= *p++)<='9' && c>='0')
        !            25:        if(val<bar0.big) {val *= 10; val += c-'0';}
        !            26:        else ++dpdig;
        !            27: if (c=='.')
        !            28:        while ((c= *p++)<='9' && c>='0')
        !            29:                if(val<bar0.big) {--dpdig; val *= 10; val += c-'0';}
        !            30: if (sign) val = -val; /* sign has been taken care of, if  val  in range */
        !            31: scale=0;
        !            32: if (c=='E' || c=='e') {/* scale factor */
        !            33:        esign=0;
        !            34:        if ((c= *p++)=='-') ++esign;
        !            35:        else if (c=='+');
        !            36:        else --p;
        !            37:        while ((c= *p++)<='9' && c>='0') {scale *= 10; scale += c-'0';}
        !            38:        if (esign) scale = -scale;
        !            39: }
        !            40: dpdig += scale;
        !            41: if (dpdig==0) return(val);
        !            42: esign=0; if (dpdig<0) {++esign; dpdig = -dpdig;}
        !            43: if (dpdig>38) if (esign) return(0); else return(sign? -bar1.huge : bar1.huge);
        !            44: exp=1; while (dpdig) {
        !            45:        if (dpdig==21) {exp *= 1.0e+21; break;}
        !            46:        exp *= 10; --dpdig;
        !            47: }
        !            48: if (esign) return(val/exp); return(val*exp);
        !            49: }

unix.superglobalmegacorp.com

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