Annotation of researchv10dc/libI77/wref.c, revision 1.1

1.1     ! root        1: #include "f2c.h"
        !             2: #include "fio.h"
        !             3: #include "fmt.h"
        !             4: #include "fp.h"
        !             5: #ifndef VAX
        !             6: #include "ctype.h"
        !             7: #endif
        !             8: 
        !             9: #ifndef KR_headers
        !            10: #undef abs
        !            11: #undef min
        !            12: #undef max
        !            13: #include "stdlib.h"
        !            14: #include "string.h"
        !            15: #endif
        !            16: 
        !            17: #ifdef KR_headers
        !            18: wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;
        !            19: #else
        !            20: wrt_E(ufloat *p, int w, int d, int e, ftnlen len)
        !            21: #endif
        !            22: {
        !            23:        char buf[FMAX+EXPMAXDIGS+4], *s, *se;
        !            24:        int d1, delta, e1, i, sign, signspace;
        !            25:        double dd;
        !            26: #ifndef VAX
        !            27:        int e0 = e;
        !            28: #endif
        !            29: 
        !            30:        if(e <= 0)
        !            31:                e = 2;
        !            32:        if(f__scale) {
        !            33:                if(f__scale >= d + 2 || f__scale <= -d)
        !            34:                        goto nogood;
        !            35:                }
        !            36:        if(f__scale <= 0)
        !            37:                --d;
        !            38:        if (len == sizeof(real))
        !            39:                dd = p->pf;
        !            40:        else
        !            41:                dd = p->pd;
        !            42:        if (dd < 0.) {
        !            43:                signspace = sign = 1;
        !            44:                dd = -dd;
        !            45:                }
        !            46:        else {
        !            47:                sign = 0;
        !            48:                signspace = (int)f__cplus;
        !            49: #ifndef VAX
        !            50:                if (!dd)
        !            51:                        dd = 0.;        /* avoid -0 */
        !            52: #endif
        !            53:                }
        !            54:        delta = w - (2 /* for the . and the d adjustment above */
        !            55:                        + 2 /* for the E+ */ + signspace + d + e);
        !            56:        if (delta < 0) {
        !            57: nogood:
        !            58:                while(--w >= 0)
        !            59:                        PUT('*');
        !            60:                return(0);
        !            61:                }
        !            62:        if (f__scale < 0)
        !            63:                d += f__scale;
        !            64:        if (d > FMAX) {
        !            65:                d1 = d - FMAX;
        !            66:                d = FMAX;
        !            67:                }
        !            68:        else
        !            69:                d1 = 0;
        !            70:        sprintf(buf,"%#.*E", d, dd);
        !            71: #ifndef VAX
        !            72:        /* check for NaN, Infinity */
        !            73:        if (!isdigit(buf[0])) {
        !            74:                switch(buf[0]) {
        !            75:                        case 'n':
        !            76:                        case 'N':
        !            77:                                signspace = 0;  /* no sign for NaNs */
        !            78:                        }
        !            79:                delta = w - strlen(buf) - signspace;
        !            80:                if (delta < 0)
        !            81:                        goto nogood;
        !            82:                while(--delta >= 0)
        !            83:                        PUT(' ');
        !            84:                if (signspace)
        !            85:                        PUT(sign ? '-' : '+');
        !            86:                for(s = buf; *s; s++)
        !            87:                        PUT(*s);
        !            88:                return 0;
        !            89:                }
        !            90: #endif
        !            91:        se = buf + d + 3;
        !            92:        if (f__scale != 1 && dd)
        !            93:                sprintf(se, "%+.2d", atoi(se) + 1 - f__scale);
        !            94:        s = ++se;
        !            95:        if (e < 2) {
        !            96:                if (*s != '0')
        !            97:                        goto nogood;
        !            98:                }
        !            99: #ifndef VAX
        !           100:        /* accommodate 3 significant digits in exponent */
        !           101:        if (s[2]) {
        !           102: #ifdef Pedantic
        !           103:                if (!e0 && !s[3])
        !           104:                        for(s -= 2, e1 = 2; s[0] = s[1]; s++);
        !           105: 
        !           106:        /* Pedantic gives the behavior that Fortran 77 specifies,       */
        !           107:        /* i.e., requires that E be specified for exponent fields       */
        !           108:        /* of more than 3 digits.  With Pedantic undefined, we get      */
        !           109:        /* the behavior that Cray displays -- you get a bigger          */
        !           110:        /* exponent field if it fits.   */
        !           111: #else
        !           112:                if (!e0) {
        !           113:                        for(s -= 2, e1 = 2; s[0] = s[1]; s++)
        !           114: #ifdef CRAY
        !           115:                                delta--;
        !           116:                        if ((delta += 4) < 0)
        !           117:                                goto nogood
        !           118: #endif
        !           119:                                ;
        !           120:                        }
        !           121: #endif
        !           122:                else if (e0 >= 0)
        !           123:                        goto shift;
        !           124:                else
        !           125:                        e1 = e;
        !           126:                }
        !           127:        else
        !           128:  shift:
        !           129: #endif
        !           130:                for(s += 2, e1 = 2; *s; ++e1, ++s)
        !           131:                        if (e1 >= e)
        !           132:                                goto nogood;
        !           133:        while(--delta >= 0)
        !           134:                PUT(' ');
        !           135:        if (signspace)
        !           136:                PUT(sign ? '-' : '+');
        !           137:        s = buf;
        !           138:        i = f__scale;
        !           139:        if (f__scale <= 0) {
        !           140:                PUT('.');
        !           141:                for(; i < 0; ++i)
        !           142:                        PUT('0');
        !           143:                PUT(*s);
        !           144:                s += 2;
        !           145:                }
        !           146:        else if (f__scale > 1) {
        !           147:                PUT(*s);
        !           148:                s += 2;
        !           149:                while(--i > 0)
        !           150:                        PUT(*s++);
        !           151:                PUT('.');
        !           152:                }
        !           153:        if (d1) {
        !           154:                se -= 2;
        !           155:                while(s < se) PUT(*s++);
        !           156:                se += 2;
        !           157:                do PUT('0'); while(--d1 > 0);
        !           158:                }
        !           159:        while(s < se)
        !           160:                PUT(*s++);
        !           161:        if (e < 2)
        !           162:                PUT(s[1]);
        !           163:        else {
        !           164:                while(++e1 <= e)
        !           165:                        PUT('0');
        !           166:                while(*s)
        !           167:                        PUT(*s++);
        !           168:                }
        !           169:        return 0;
        !           170:        }
        !           171: 
        !           172: #ifdef KR_headers
        !           173: wrt_F(p,w,d,len) ufloat *p; ftnlen len;
        !           174: #else
        !           175: wrt_F(ufloat *p, int w, int d, ftnlen len)
        !           176: #endif
        !           177: {
        !           178:        int d1, sign, n;
        !           179:        double x;
        !           180:        char *b, buf[MAXINTDIGS+MAXFRACDIGS+4], *s;
        !           181: 
        !           182:        x= (len==sizeof(real)?p->pf:p->pd);
        !           183:        if (d < MAXFRACDIGS)
        !           184:                d1 = 0;
        !           185:        else {
        !           186:                d1 = d - MAXFRACDIGS;
        !           187:                d = MAXFRACDIGS;
        !           188:                }
        !           189:        if (x < 0.)
        !           190:                { x = -x; sign = 1; }
        !           191:        else {
        !           192:                sign = 0;
        !           193: #ifndef VAX
        !           194:                if (!x)
        !           195:                        x = 0.;
        !           196: #endif
        !           197:                }
        !           198: 
        !           199:        if (n = f__scale)
        !           200:                if (n > 0)
        !           201:                        do x *= 10.; while(--n > 0);
        !           202:                else
        !           203:                        do x *= 0.1; while(++n < 0);
        !           204: 
        !           205: #ifdef USE_STRLEN
        !           206:        sprintf(b = buf, "%#.*f", d, x);
        !           207:        n = strlen(b) + d1;
        !           208: #else
        !           209:        n = sprintf(b = buf, "%#.*f", d, x) + d1;
        !           210: #endif
        !           211: 
        !           212:        if (buf[0] == '0' && d)
        !           213:                { ++b; --n; }
        !           214:        if (sign) {
        !           215:                /* check for all zeros */
        !           216:                for(s = b;;) {
        !           217:                        while(*s == '0') s++;
        !           218:                        switch(*s) {
        !           219:                                case '.':
        !           220:                                        s++; continue;
        !           221:                                case 0:
        !           222:                                        sign = 0;
        !           223:                                }
        !           224:                        break;
        !           225:                        }
        !           226:                }
        !           227:        if (sign || f__cplus)
        !           228:                ++n;
        !           229:        if (n > w) {
        !           230:                while(--w >= 0)
        !           231:                        PUT('*');
        !           232:                return 0;
        !           233:                }
        !           234:        for(w -= n; --w >= 0; )
        !           235:                PUT(' ');
        !           236:        if (sign)
        !           237:                PUT('-');
        !           238:        else if (f__cplus)
        !           239:                PUT('+');
        !           240:        while(n = *b++)
        !           241:                PUT(n);
        !           242:        while(--d1 >= 0)
        !           243:                PUT('0');
        !           244:        return 0;
        !           245:        }

unix.superglobalmegacorp.com

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