Annotation of 3BSD/libc/gen/atof.c, revision 1.1.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.