Annotation of researchv10dc/libI77/wrtfmt.c, revision 1.1.1.1

1.1       root        1: #include "f2c.h"
                      2: #include "fio.h"
                      3: #include "fmt.h"
                      4: extern int f__cursor;
                      5: #ifdef KR_headers
                      6: extern char *f__icvt();
                      7: #else
                      8: extern char *f__icvt(long, int*, int*, int);
                      9: #endif
                     10: int f__hiwater;
                     11: icilist *f__svic;
                     12: char *f__icptr;
                     13: mv_cur(Void)   /* shouldn't use fseek because it insists on calling fflush */
                     14:                /* instead we know too much about stdio */
                     15: {
                     16:        if(f__external == 0) {
                     17:                if(f__cursor < 0) {
                     18:                        if(f__hiwater < f__recpos)
                     19:                                f__hiwater = f__recpos;
                     20:                        f__recpos += f__cursor;
                     21:                        f__icptr += f__cursor;
                     22:                        f__cursor = 0;
                     23:                        if(f__recpos < 0)
                     24:                                err(f__elist->cierr, 110, "left off");
                     25:                }
                     26:                else if(f__cursor > 0) {
                     27:                        if(f__recpos + f__cursor >= f__svic->icirlen)
                     28:                                err(f__elist->cierr, 110, "recend");
                     29:                        if(f__hiwater <= f__recpos)
                     30:                                for(; f__cursor > 0; f__cursor--)
                     31:                                        (*f__putn)(' ');
                     32:                        else if(f__hiwater <= f__recpos + f__cursor) {
                     33:                                f__cursor -= f__hiwater - f__recpos;
                     34:                                f__icptr += f__hiwater - f__recpos;
                     35:                                f__recpos = f__hiwater;
                     36:                                for(; f__cursor > 0; f__cursor--)
                     37:                                        (*f__putn)(' ');
                     38:                        }
                     39:                        else {
                     40:                                f__icptr += f__cursor;
                     41:                                f__recpos += f__cursor;
                     42:                        }
                     43:                        f__cursor = 0;
                     44:                }
                     45:                return(0);
                     46:        }
                     47:        if(f__cursor > 0) {
                     48:                if(f__hiwater <= f__recpos)
                     49:                        for(;f__cursor>0;f__cursor--) (*f__putn)(' ');
                     50:                else if(f__hiwater <= f__recpos + f__cursor) {
                     51: #ifndef NON_UNIX_STDIO
                     52:                        if(f__cf->_ptr + f__hiwater - f__recpos < buf_end(f__cf))
                     53:                                f__cf->_ptr += f__hiwater - f__recpos;
                     54:                        else
                     55: #endif
                     56:                                (void) fseek(f__cf, (long) (f__hiwater - f__recpos), SEEK_CUR);
                     57:                        f__cursor -= f__hiwater - f__recpos;
                     58:                        f__recpos = f__hiwater;
                     59:                        for(; f__cursor > 0; f__cursor--)
                     60:                                (*f__putn)(' ');
                     61:                }
                     62:                else {
                     63: #ifndef NON_UNIX_STDIO
                     64:                        if(f__cf->_ptr + f__cursor < buf_end(f__cf))
                     65:                                f__cf->_ptr += f__cursor;
                     66:                        else
                     67: #endif
                     68:                                (void) fseek(f__cf, (long)f__cursor, SEEK_CUR);
                     69:                        f__recpos += f__cursor;
                     70:                }
                     71:        }
                     72:        if(f__cursor<0)
                     73:        {
                     74:                if(f__cursor+f__recpos<0) err(f__elist->cierr,110,"left off");
                     75: #ifndef NON_UNIX_STDIO
                     76:                if(f__cf->_ptr + f__cursor >= f__cf->_base)
                     77:                        f__cf->_ptr += f__cursor;
                     78:                else
                     79: #endif
                     80:                if(f__curunit && f__curunit->useek)
                     81:                        (void) fseek(f__cf,(long)f__cursor,SEEK_CUR);
                     82:                else
                     83:                        err(f__elist->cierr,106,"fmt");
                     84:                if(f__hiwater < f__recpos)
                     85:                        f__hiwater = f__recpos;
                     86:                f__recpos += f__cursor;
                     87:                f__cursor=0;
                     88:        }
                     89:        return(0);
                     90: }
                     91: 
                     92:  static int
                     93: #ifdef KR_headers
                     94: wrt_Z(n,w,minlen,len) Uint *n; int w, minlen; ftnlen len;
                     95: #else
                     96: wrt_Z(Uint *n, int w, int minlen, ftnlen len)
                     97: #endif
                     98: {
                     99:        register char *s, *se;
                    100:        register i, w1;
                    101:        static int one = 1;
                    102:        static char hex[] = "0123456789ABCDEF";
                    103:        s = (char *)n;
                    104:        --len;
                    105:        if (*(char *)&one) {
                    106:                /* little endian */
                    107:                se = s;
                    108:                s += len;
                    109:                i = -1;
                    110:                }
                    111:        else {
                    112:                se = s + len;
                    113:                i = 1;
                    114:                }
                    115:        for(;; s += i)
                    116:                if (s == se || *s)
                    117:                        break;
                    118:        w1 = (i*(se-s) << 1) + 1;
                    119:        if (*s & 0xf0)
                    120:                w1++;
                    121:        if (w1 > w)
                    122:                for(i = 0; i < w; i++)
                    123:                        (*f__putn)('*');
                    124:        else {
                    125:                if ((minlen -= w1) > 0)
                    126:                        w1 += minlen;
                    127:                while(--w >= w1)
                    128:                        (*f__putn)(' ');
                    129:                while(--minlen >= 0)
                    130:                        (*f__putn)('0');
                    131:                if (!(*s & 0xf0)) {
                    132:                        (*f__putn)(hex[*s & 0xf]);
                    133:                        if (s == se)
                    134:                                return 0;
                    135:                        s += i;
                    136:                        }
                    137:                for(;; s += i) {
                    138:                        (*f__putn)(hex[*s >> 4 & 0xf]);
                    139:                        (*f__putn)(hex[*s & 0xf]);
                    140:                        if (s == se)
                    141:                                break;
                    142:                        }
                    143:                }
                    144:        return 0;
                    145:        }
                    146: 
                    147:  static int
                    148: #ifdef KR_headers
                    149: wrt_I(n,w,len, base) Uint *n; ftnlen len; register int base;
                    150: #else
                    151: wrt_I(Uint *n, int w, ftnlen len, register int base)
                    152: #endif
                    153: {      int ndigit,sign,spare,i;
                    154:        long x;
                    155:        char *ans;
                    156:        if(len==sizeof(integer)) x=n->il;
                    157:        else if(len == sizeof(char)) x = n->ic;
                    158: #ifdef Allow_TYQUAD
                    159:        else if (len == sizeof(longint)) x = n->ili;
                    160: #endif
                    161:        else x=n->is;
                    162:        ans=f__icvt(x,&ndigit,&sign, base);
                    163:        spare=w-ndigit;
                    164:        if(sign || f__cplus) spare--;
                    165:        if(spare<0)
                    166:                for(i=0;i<w;i++) (*f__putn)('*');
                    167:        else
                    168:        {       for(i=0;i<spare;i++) (*f__putn)(' ');
                    169:                if(sign) (*f__putn)('-');
                    170:                else if(f__cplus) (*f__putn)('+');
                    171:                for(i=0;i<ndigit;i++) (*f__putn)(*ans++);
                    172:        }
                    173:        return(0);
                    174: }
                    175:  static int
                    176: #ifdef KR_headers
                    177: wrt_IM(n,w,m,len,base) Uint *n; ftnlen len; int base;
                    178: #else
                    179: wrt_IM(Uint *n, int w, int m, ftnlen len, int base)
                    180: #endif
                    181: {      int ndigit,sign,spare,i,xsign;
                    182:        long x;
                    183:        char *ans;
                    184:        if(sizeof(integer)==len) x=n->il;
                    185:        else if(len == sizeof(char)) x = n->ic;
                    186:        else x=n->is;
                    187:        ans=f__icvt(x,&ndigit,&sign, base);
                    188:        if(sign || f__cplus) xsign=1;
                    189:        else xsign=0;
                    190:        if(ndigit+xsign>w || m+xsign>w)
                    191:        {       for(i=0;i<w;i++) (*f__putn)('*');
                    192:                return(0);
                    193:        }
                    194:        if(x==0 && m==0)
                    195:        {       for(i=0;i<w;i++) (*f__putn)(' ');
                    196:                return(0);
                    197:        }
                    198:        if(ndigit>=m)
                    199:                spare=w-ndigit-xsign;
                    200:        else
                    201:                spare=w-m-xsign;
                    202:        for(i=0;i<spare;i++) (*f__putn)(' ');
                    203:        if(sign) (*f__putn)('-');
                    204:        else if(f__cplus) (*f__putn)('+');
                    205:        for(i=0;i<m-ndigit;i++) (*f__putn)('0');
                    206:        for(i=0;i<ndigit;i++) (*f__putn)(*ans++);
                    207:        return(0);
                    208: }
                    209:  static int
                    210: #ifdef KR_headers
                    211: wrt_AP(s) char *s;
                    212: #else
                    213: wrt_AP(char *s)
                    214: #endif
                    215: {      char quote;
                    216:        if(f__cursor && mv_cur()) return(mv_cur());
                    217:        quote = *s++;
                    218:        for(;*s;s++)
                    219:        {       if(*s!=quote) (*f__putn)(*s);
                    220:                else if(*++s==quote) (*f__putn)(*s);
                    221:                else return(1);
                    222:        }
                    223:        return(1);
                    224: }
                    225:  static int
                    226: #ifdef KR_headers
                    227: wrt_H(a,s) char *s;
                    228: #else
                    229: wrt_H(int a, char *s)
                    230: #endif
                    231: {
                    232:        if(f__cursor && mv_cur()) return(mv_cur());
                    233:        while(a--) (*f__putn)(*s++);
                    234:        return(1);
                    235: }
                    236: #ifdef KR_headers
                    237: wrt_L(n,len, sz) Uint *n; ftnlen sz;
                    238: #else
                    239: wrt_L(Uint *n, int len, ftnlen sz)
                    240: #endif
                    241: {      int i;
                    242:        long x;
                    243:        if(sizeof(long)==sz) x=n->il;
                    244:        else if(sz == sizeof(char)) x = n->ic;
                    245:        else x=n->is;
                    246:        for(i=0;i<len-1;i++)
                    247:                (*f__putn)(' ');
                    248:        if(x) (*f__putn)('T');
                    249:        else (*f__putn)('F');
                    250:        return(0);
                    251: }
                    252:  static int
                    253: #ifdef KR_headers
                    254: wrt_A(p,len) char *p; ftnlen len;
                    255: #else
                    256: wrt_A(char *p, ftnlen len)
                    257: #endif
                    258: {
                    259:        while(len-- > 0) (*f__putn)(*p++);
                    260:        return(0);
                    261: }
                    262:  static int
                    263: #ifdef KR_headers
                    264: wrt_AW(p,w,len) char * p; ftnlen len;
                    265: #else
                    266: wrt_AW(char * p, int w, ftnlen len)
                    267: #endif
                    268: {
                    269:        while(w>len)
                    270:        {       w--;
                    271:                (*f__putn)(' ');
                    272:        }
                    273:        while(w-- > 0)
                    274:                (*f__putn)(*p++);
                    275:        return(0);
                    276: }
                    277: 
                    278:  static int
                    279: #ifdef KR_headers
                    280: wrt_G(p,w,d,e,len) ufloat *p; ftnlen len;
                    281: #else
                    282: wrt_G(ufloat *p, int w, int d, int e, ftnlen len)
                    283: #endif
                    284: {      double up = 1,x;
                    285:        int i,oldscale=f__scale,n,j;
                    286:        x= len==sizeof(real)?p->pf:p->pd;
                    287:        if(x < 0 ) x = -x;
                    288:        if(x<.1) return(wrt_E(p,w,d,e,len));
                    289:        for(i=0;i<=d;i++,up*=10)
                    290:        {       if(x>=up) continue;
                    291:                f__scale=0;
                    292:                if(e==0) n=4;
                    293:                else    n=e+2;
                    294:                i=wrt_F(p,w-n,d-i,len);
                    295:                for(j=0;j<n;j++) (*f__putn)(' ');
                    296:                f__scale=oldscale;
                    297:                return(i);
                    298:        }
                    299:        return(wrt_E(p,w,d,e,len));
                    300: }
                    301: #ifdef KR_headers
                    302: w_ed(p,ptr,len) struct f__syl *p; char *ptr; ftnlen len;
                    303: #else
                    304: w_ed(struct f__syl *p, char *ptr, ftnlen len)
                    305: #endif
                    306: {
                    307:        if(f__cursor && mv_cur()) return(mv_cur());
                    308:        switch(p->op)
                    309:        {
                    310:        default:
                    311:                fprintf(stderr,"w_ed, unexpected code: %d\n", p->op);
                    312:                sig_die(f__fmtbuf, 1);
                    313:        case I: return(wrt_I((Uint *)ptr,p->p1,len, 10));
                    314:        case IM:
                    315:                return(wrt_IM((Uint *)ptr,p->p1,p->p2,len,10));
                    316: 
                    317:                /* O and OM don't work right for character, double, complex, */
                    318:                /* or doublecomplex, and they differ from Fortran 90 in */
                    319:                /* showing a minus sign for negative values. */
                    320: 
                    321:        case O: return(wrt_I((Uint *)ptr, p->p1, len, 8));
                    322:        case OM:
                    323:                return(wrt_IM((Uint *)ptr,p->p1,p->p2,len,8));
                    324:        case L: return(wrt_L((Uint *)ptr,p->p1, len));
                    325:        case A: return(wrt_A(ptr,len));
                    326:        case AW:
                    327:                return(wrt_AW(ptr,p->p1,len));
                    328:        case D:
                    329:        case E:
                    330:        case EE:
                    331:                return(wrt_E((ufloat *)ptr,p->p1,p->p2,p->p3,len));
                    332:        case G:
                    333:        case GE:
                    334:                return(wrt_G((ufloat *)ptr,p->p1,p->p2,p->p3,len));
                    335:        case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2,len));
                    336: 
                    337:                /* Z and ZM assume 8-bit bytes. */
                    338: 
                    339:        case Z: return(wrt_Z((Uint *)ptr,p->p1,0,len));
                    340:        case ZM:
                    341:                return(wrt_Z((Uint *)ptr,p->p1,p->p2,len));
                    342:        }
                    343: }
                    344: #ifdef KR_headers
                    345: w_ned(p) struct f__syl *p;
                    346: #else
                    347: w_ned(struct f__syl *p)
                    348: #endif
                    349: {
                    350:        switch(p->op)
                    351:        {
                    352:        default: fprintf(stderr,"w_ned, unexpected code: %d\n", p->op);
                    353:                sig_die(f__fmtbuf, 1);
                    354:        case SLASH:
                    355:                return((*f__donewrec)());
                    356:        case T: f__cursor = p->p1-f__recpos - 1;
                    357:                return(1);
                    358:        case TL: f__cursor -= p->p1;
                    359:                if(f__cursor < -f__recpos)      /* TL1000, 1X */
                    360:                        f__cursor = -f__recpos;
                    361:                return(1);
                    362:        case TR:
                    363:        case X:
                    364:                f__cursor += p->p1;
                    365:                return(1);
                    366:        case APOS:
                    367:                return(wrt_AP(*(char **)&p->p2));
                    368:        case H:
                    369:                return(wrt_H(p->p1,*(char **)&p->p2));
                    370:        }
                    371: }

unix.superglobalmegacorp.com

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