Annotation of researchv10dc/libI77/old/wrtfmt.c, revision 1.1

1.1     ! root        1: /*     @(#)wrtfmt.c    1.3     */
        !             2: /*     3.0 SID #       1.2     */
        !             3: #include "fio.h"
        !             4: #include "fmt.h"
        !             5: extern int cursor;
        !             6: extern char *icvt(), *ecvt();
        !             7: int hiwater;
        !             8: icilist *svic;
        !             9: char *icptr;
        !            10: mv_cur()       /* shouldn't use fseek because it insists on calling fflush */
        !            11:                /* instead we know too much about stdio */
        !            12: {
        !            13:        if(external == 0) {
        !            14:                if(cursor < 0) {
        !            15:                        if(hiwater < recpos)
        !            16:                                hiwater = recpos;
        !            17:                        recpos += cursor;
        !            18:                        icptr += cursor;
        !            19:                        cursor = 0;
        !            20:                        if(recpos < 0)
        !            21:                                err(elist->cierr, 110, "left off");
        !            22:                }
        !            23:                else if(cursor > 0) {
        !            24:                        if(recpos + cursor >= svic->icirlen)
        !            25:                                err(elist->cierr, 110, "recend");
        !            26:                        if(hiwater <= recpos)
        !            27:                                for(; cursor > 0; cursor--)
        !            28:                                        (*putn)(' ');
        !            29:                        else if(hiwater <= recpos + cursor) {
        !            30:                                cursor -= hiwater - recpos;
        !            31:                                icptr += hiwater - recpos;
        !            32:                                recpos = hiwater;
        !            33:                                for(; cursor > 0; cursor--)
        !            34:                                        (*putn)(' ');
        !            35:                        }
        !            36:                        else {
        !            37:                                icptr += cursor;
        !            38:                                recpos += cursor;
        !            39:                        }
        !            40:                        cursor = 0;
        !            41:                }
        !            42:                return(0);
        !            43:        }
        !            44:        if(cursor > 0) {
        !            45:                if(hiwater <= recpos)
        !            46:                        for(;cursor>0;cursor--) (*putn)(' ');
        !            47:                else if(hiwater <= recpos + cursor) {
        !            48:                        if(cf->_ptr + hiwater - recpos < _bufend(cf))
        !            49:                                cf->_ptr += hiwater - recpos;
        !            50:                        else
        !            51:                                (void) fseek(cf, (long) (hiwater - recpos), 1);
        !            52:                        cursor -= hiwater - recpos;
        !            53:                        recpos = hiwater;
        !            54:                        for(; cursor > 0; cursor--)
        !            55:                                (*putn)(' ');
        !            56:                }
        !            57:                else {
        !            58:                        if(cf->_ptr + cursor < _bufend(cf))
        !            59:                                cf->_ptr += cursor;
        !            60:                        else
        !            61:                                (void) fseek(cf, (long)cursor, 1);
        !            62:                        recpos += cursor;
        !            63:                }
        !            64:        }
        !            65:        if(cursor<0)
        !            66:        {
        !            67:                if(cursor+recpos<0) err(elist->cierr,110,"left off");
        !            68:                if(cf->_ptr + cursor >= cf->_base)
        !            69:                        cf->_ptr += cursor;
        !            70:                else if(curunit->useek) (void) fseek(cf,(long)cursor,1);
        !            71:                else err(elist->cierr,106,"fmt");
        !            72:                if(hiwater < recpos)
        !            73:                        hiwater = recpos;
        !            74:                recpos += cursor;
        !            75:                cursor=0;
        !            76:        }
        !            77:        return(0);
        !            78: }
        !            79: w_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
        !            80: {
        !            81:        if(cursor && mv_cur()) return(mv_cur());
        !            82:        switch(p->op)
        !            83:        {
        !            84:        default:
        !            85:                fprintf(stderr,"w_ed, unexpected code: %d\n%s\n",
        !            86:                        p->op,fmtbuf);
        !            87:                abort();
        !            88:        case I: return(wrt_I((uint *)ptr,p->p1,len, 10));
        !            89:        case IM:
        !            90:                return(wrt_IM((uint *)ptr,p->p1,p->p2,len));
        !            91:        case O: return(wrt_I((uint *)ptr, p->p1, len, 8));
        !            92:        case L: return(wrt_L((uint *)ptr,p->p1, len));
        !            93:        case A: return(wrt_A(ptr,len));
        !            94:        case AW:
        !            95:                return(wrt_AW(ptr,p->p1,len));
        !            96:        case D:
        !            97:        case E:
        !            98:        case EE:
        !            99:                return(wrt_E((ufloat *)ptr,p->p1,p->p2,p->p3,len));
        !           100:        case G:
        !           101:        case GE:
        !           102:                return(wrt_G((ufloat *)ptr,p->p1,p->p2,p->p3,len));
        !           103:        case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2,len));
        !           104:        }
        !           105: }
        !           106: w_ned(p) struct syl *p;
        !           107: {
        !           108:        switch(p->op)
        !           109:        {
        !           110:        default: fprintf(stderr,"w_ned, unexpected code: %d\n%s\n",
        !           111:                        p->op,fmtbuf);
        !           112:                abort();
        !           113:        case SLASH:
        !           114:                return((*donewrec)());
        !           115:        case T: cursor = p->p1-recpos - 1;
        !           116:                return(1);
        !           117:        case TL: cursor -= p->p1;
        !           118:                if(cursor < -recpos)    /* TL1000, 1X */
        !           119:                        cursor = -recpos;
        !           120:                return(1);
        !           121:        case TR:
        !           122:        case X:
        !           123:                cursor += p->p1;
        !           124:                return(1);
        !           125:        case APOS:
        !           126:                return(wrt_AP(p->p1));
        !           127:        case H:
        !           128:                return(wrt_H(p->p1,p->p2));
        !           129:        }
        !           130: }
        !           131: wrt_I(n,w,len, base) uint *n; ftnlen len; register int base;
        !           132: {      int ndigit,sign,spare,i;
        !           133:        long x;
        !           134:        char *ans;
        !           135:        if(len==sizeof(short)) x=n->is;
        !           136:        else if(len == sizeof(char)) x = n->ic;
        !           137:        else x=n->il;
        !           138:        ans=icvt(x,&ndigit,&sign, base);
        !           139:        spare=w-ndigit;
        !           140:        if(sign || cplus) spare--;
        !           141:        if(spare<0)
        !           142:                for(i=0;i<w;i++) (*putn)('*');
        !           143:        else
        !           144:        {       for(i=0;i<spare;i++) (*putn)(' ');
        !           145:                if(sign) (*putn)('-');
        !           146:                else if(cplus) (*putn)('+');
        !           147:                for(i=0;i<ndigit;i++) (*putn)(*ans++);
        !           148:        }
        !           149:        return(0);
        !           150: }
        !           151: wrt_IM(n,w,m,len) uint *n; ftnlen len;
        !           152: {      int ndigit,sign,spare,i,xsign;
        !           153:        long x;
        !           154:        char *ans;
        !           155:        if(sizeof(short)==len) x=n->is;
        !           156:        else if(len == sizeof(char)) x = n->ic;
        !           157:        else x=n->il;
        !           158:        ans=icvt(x,&ndigit,&sign, 10);
        !           159:        if(sign || cplus) xsign=1;
        !           160:        else xsign=0;
        !           161:        if(ndigit+xsign>w || m+xsign>w)
        !           162:        {       for(i=0;i<w;i++) (*putn)('*');
        !           163:                return(0);
        !           164:        }
        !           165:        if(x==0 && m==0)
        !           166:        {       for(i=0;i<w;i++) (*putn)(' ');
        !           167:                return(0);
        !           168:        }
        !           169:        if(ndigit>=m)
        !           170:                spare=w-ndigit-xsign;
        !           171:        else
        !           172:                spare=w-m-xsign;
        !           173:        for(i=0;i<spare;i++) (*putn)(' ');
        !           174:        if(sign) (*putn)('-');
        !           175:        else if(cplus) (*putn)('+');
        !           176:        for(i=0;i<m-ndigit;i++) (*putn)('0');
        !           177:        for(i=0;i<ndigit;i++) (*putn)(*ans++);
        !           178:        return(0);
        !           179: }
        !           180: wrt_AP(n)
        !           181: {      char *s,quote;
        !           182:        if(cursor && mv_cur()) return(mv_cur());
        !           183:        s=(char *)n;
        !           184:        quote = *s++;
        !           185:        for(;*s;s++)
        !           186:        {       if(*s!=quote) (*putn)(*s);
        !           187:                else if(*++s==quote) (*putn)(*s);
        !           188:                else return(1);
        !           189:        }
        !           190:        return(1);
        !           191: }
        !           192: wrt_H(a,b)
        !           193: {      char *s=(char *)b;
        !           194:        if(cursor && mv_cur()) return(mv_cur());
        !           195:        while(a--) (*putn)(*s++);
        !           196:        return(1);
        !           197: }
        !           198: wrt_L(n,len, sz) uint *n; ftnlen sz;
        !           199: {      int i;
        !           200:        long x;
        !           201:        if(sizeof(short)==sz) x=n->is;
        !           202:        else if(sz == sizeof(char)) x = n->ic;
        !           203:        else x=n->il;
        !           204:        for(i=0;i<len-1;i++)
        !           205:                (*putn)(' ');
        !           206:        if(x) (*putn)('t');
        !           207:        else (*putn)('f');
        !           208:        return(0);
        !           209: }
        !           210: wrt_A(p,len) char *p; ftnlen len;
        !           211: {
        !           212:        while(len-- > 0) (*putn)(*p++);
        !           213:        return(0);
        !           214: }
        !           215: wrt_AW(p,w,len) char * p; ftnlen len;
        !           216: {
        !           217:        while(w>len)
        !           218:        {       w--;
        !           219:                (*putn)(' ');
        !           220:        }
        !           221:        while(w-- > 0)
        !           222:                (*putn)(*p++);
        !           223:        return(0);
        !           224: }
        !           225: wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;
        !           226: {      char *s;
        !           227:        int dp,sign,i, delta;
        !           228:        char *ecvt();
        !           229:        double dd;
        !           230:        if(e == 0)
        !           231:                e = 2;
        !           232:        if(scale) {
        !           233:                if(scale >= d + 2 || scale <= -d)
        !           234:                        goto nogood;
        !           235:                if(scale > 0)
        !           236:                        d++;
        !           237:        }
        !           238:        if (len == sizeof(float))
        !           239:                dd = p->pf;
        !           240:        else
        !           241:                dd = p->pd;
        !           242:        s=ecvt( dd ,d,&dp,&sign);
        !           243:        delta = 1 /* for the . */ + 2 /* for the E+ */ + (sign || cplus);
        !           244:        if(w < d + e + delta) {
        !           245: nogood:
        !           246:                for(i=0;i<w;i++) (*putn)('*');
        !           247:                return(0);
        !           248:        }
        !           249:        if(p->pf != 0) dp -= scale;
        !           250:        else    dp = 0;
        !           251:        switch(e) {     /* grumph */
        !           252:        case 1:
        !           253:                if(dp <= -10 || dp >= 10)
        !           254:                        goto nogood;
        !           255:                break;
        !           256:        case 2:
        !           257:                if(dp <= -100 || dp >= 100)
        !           258:                        goto nogood;
        !           259:                break;
        !           260:        case 3:
        !           261:                if(dp <= -1000 || dp >= 1000)
        !           262:                        goto nogood;
        !           263:                break;
        !           264:        default:
        !           265:                /* probably ok */
        !           266:                break;
        !           267:        }
        !           268:        for(i=0;i<w-(delta+d+e);i++) (*putn)(' ');
        !           269:        if(sign) (*putn)('-');
        !           270:        else if(cplus) (*putn)('+');
        !           271:        if(scale<0)
        !           272:        {
        !           273:                (*putn)('.');
        !           274:                for(i=0;i<-scale;i++)
        !           275:                        (*putn)('0');
        !           276:                for(i=0;i<d+scale;i++)
        !           277:                        (*putn)(*s++);
        !           278:        }
        !           279:        else if(scale>0 && scale<d+2)
        !           280:        {       for(i=0;i<scale;i++)
        !           281:                        (*putn)(*s++);
        !           282:                (*putn)('.');
        !           283:                for(i=0;i<d-scale;i++)
        !           284:                        (*putn)(*s++);
        !           285:        }
        !           286:        else
        !           287:        {       (*putn)('.');
        !           288:                for(i=0;i<d;i++) (*putn)(*s++);
        !           289:        }
        !           290:        if(dp < 100 && dp > -100) (*putn)('e');
        !           291:        if(dp<0)
        !           292:        {       (*putn)('-');
        !           293:                dp = -dp;
        !           294:        }
        !           295:        else    (*putn)('+');
        !           296:        for(; e >= 4; e--)
        !           297:                (*putn)('0');
        !           298:        if(e>=3 || dp >= 100)
        !           299:        {       (*putn)(dp/100 + '0');
        !           300:                dp = dp % 100;
        !           301:        }
        !           302:        if(e!=1) (*putn)(dp/10+'0');
        !           303:        (*putn)(dp%10+'0');
        !           304:        return(0);
        !           305: }
        !           306: wrt_G(p,w,d,e,len) ufloat *p; ftnlen len;
        !           307: {      double up = 1,x;
        !           308:        int i,oldscale=scale,n,j;
        !           309:        x= len==sizeof(float)?p->pf:p->pd;
        !           310:        if(x < 0 ) x = -x;
        !           311:        if(x<.1) return(wrt_E(p,w,d,e,len));
        !           312:        for(i=0;i<=d;i++,up*=10)
        !           313:        {       if(x>=up) continue;
        !           314:                scale=0;
        !           315:                if(e==0) n=4;
        !           316:                else    n=e+2;
        !           317:                i=wrt_F(p,w-n,d-i,len);
        !           318:                for(j=0;j<n;j++) (*putn)(' ');
        !           319:                scale=oldscale;
        !           320:                return(i);
        !           321:        }
        !           322:        return(wrt_E((ufloat *)p,w,d,e,len));
        !           323: }
        !           324: wrt_F(p,w,d,len) ufloat *p; ftnlen len;
        !           325: {      int i,delta,dp,sign,n;
        !           326:        double x;
        !           327:        char *s,*fcvt();
        !           328:        x= (len==sizeof(float)?p->pf:p->pd);
        !           329:        if(scale)
        !           330:        {       if(scale>0)
        !           331:                        for(i=0;i<scale;i++) x*=10;
        !           332:                else    for(i=0;i<-scale;i++) x/=10;
        !           333:        }
        !           334:        s=fcvt(x,d,&dp,&sign);
        !           335:        if(-dp>=d) sign=0;
        !           336:        if(sign || cplus) delta=2;
        !           337:        else delta=1;
        !           338:        n= w - (d+delta+(dp>0?dp:0));
        !           339:        if(n<0)
        !           340:        {
        !           341:                for(i=0;i<w;i++) PUT('*');
        !           342:                return(0);
        !           343:        }
        !           344:        for(i=0;i<n;i++) PUT(' ');
        !           345:        if(sign) PUT('-');
        !           346:        else if(cplus) PUT('+');
        !           347:        for(i=0;i<dp;i++) PUT(*s++);
        !           348:        PUT('.');
        !           349:        for(i=0;i< -dp && i<d;i++) PUT('0');
        !           350:        for(;i<d;i++)
        !           351:        {       if(*s) PUT(*s++);
        !           352:                else PUT('0');
        !           353:        }
        !           354:        return(0);
        !           355: }

unix.superglobalmegacorp.com

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