1: #include "fio.h" 2: #include "fmt.h" 3: extern int cursor; 4: mv_cur() 5: { /*buggy, could move off front of record*/ 6: for(;cursor>0;cursor--) (*putn)(' '); 7: if(cursor<0) 8: { 9: if(cursor+recpos<0) err(elist->cierr,110,"left off"); 10: if(curunit->useek) fseek(cf,(long)cursor,1); 11: else err(elist->cierr,106,"fmt"); 12: cursor=0; 13: } 14: return(0); 15: } 16: w_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len; 17: { 18: if(mv_cur()) return(mv_cur()); 19: switch(p->op) 20: { 21: default: 22: fprintf(stderr,"w_ed, unexpected code: %d\n%s\n", 23: p->op,fmtbuf); 24: abort(); 25: case I: return(wrt_I(ptr,p->p1,len, 10)); 26: case IM: 27: return(wrt_IM(ptr,p->p1,p->p2,len)); 28: case O: return(wrt_I(ptr, p->p1, len, 8)); 29: case L: return(wrt_L(ptr,p->p1)); 30: case A: return(wrt_A(ptr,len)); 31: case AW: 32: return(wrt_AW(ptr,p->p1,len)); 33: case D: 34: case E: 35: case EE: 36: return(wrt_E(ptr,p->p1,p->p2,p->p3,len)); 37: case G: 38: case GE: 39: return(wrt_G(ptr,p->p1,p->p2,p->p3,len)); 40: case F: return(wrt_F(ptr,p->p1,p->p2,len)); 41: } 42: } 43: w_ned(p,ptr) char *ptr; struct syl *p; 44: { 45: switch(p->op) 46: { 47: default: fprintf(stderr,"w_ned, unexpected code: %d\n%s\n", 48: p->op,fmtbuf); 49: abort(); 50: case SLASH: 51: return((*donewrec)()); 52: case T: cursor = p->p1-recpos; 53: return(1); 54: case TL: cursor -= p->p1; 55: return(1); 56: case TR: 57: case X: 58: cursor += p->p1; 59: return(1); 60: case APOS: 61: return(wrt_AP(p->p1)); 62: case H: 63: return(wrt_H(p->p1,p->p2)); 64: } 65: } 66: wrt_I(n,w,len, base) uint *n; ftnlen len; register int base; 67: { int ndigit,sign,spare,i; 68: long x; 69: char *ans; 70: if(len==sizeof(short)) x=n->is; 71: else if(len == sizeof(char)) x = n->ic; 72: else x=n->il; 73: ans=icvt(x,&ndigit,&sign, base); 74: spare=w-ndigit; 75: if(sign || cplus) spare--; 76: if(spare<0) 77: for(i=0;i<len;i++) (*putn)('*'); 78: else 79: { for(i=0;i<spare;i++) (*putn)(' '); 80: if(sign) (*putn)('-'); 81: else if(cplus) (*putn)('+'); 82: for(i=0;i<ndigit;i++) (*putn)(*ans++); 83: } 84: return(0); 85: } 86: wrt_IM(n,w,m,len) uint *n; ftnlen len; 87: { int ndigit,sign,spare,i,xsign; 88: long x; 89: char *ans; 90: if(sizeof(short)==len) x=n->is; 91: else if(len == sizeof(char)) x = n->ic; 92: else x=n->il; 93: ans=icvt(x,&ndigit,&sign); 94: if(sign || cplus) xsign=1; 95: else xsign=0; 96: if(ndigit+xsign>w || m+xsign>w) 97: { for(i=0;i<w;i++) (*putn)('*'); 98: return(0); 99: } 100: if(x==0 && m==0) 101: { for(i=0;i<w;i++) (*putn)(' '); 102: return(0); 103: } 104: if(ndigit>=m) 105: spare=w-ndigit-xsign; 106: else 107: spare=w-m-xsign; 108: for(i=0;i<spare;i++) (*putn)(' '); 109: if(sign) (*putn)('-'); 110: else if(cplus) (*putn)('+'); 111: for(i=0;i<m-ndigit;i++) (*putn)('0'); 112: for(i=0;i<ndigit;i++) (*putn)(*ans++); 113: return(0); 114: } 115: wrt_AP(n) 116: { char *s,quote; 117: if(mv_cur()) return(mv_cur()); 118: s=(char *)n; 119: quote = *s++; 120: for(;*s;s++) 121: { if(*s!=quote) (*putn)(*s); 122: else if(*++s==quote) (*putn)(*s); 123: else return(1); 124: } 125: return(1); 126: } 127: wrt_H(a,b) 128: { char *s=(char *)b; 129: if(mv_cur()) return(mv_cur()); 130: while(a--) (*putn)(*s++); 131: return(1); 132: } 133: wrt_L(n,len) ftnint *n; 134: { int i; 135: for(i=0;i<len-1;i++) 136: (*putn)(' '); 137: if(*n) (*putn)('t'); 138: else (*putn)('f'); 139: return(0); 140: } 141: wrt_A(p,len) char *p; ftnlen len; 142: { 143: while(len-- > 0) (*putn)(*p++); 144: return(0); 145: } 146: wrt_AW(p,w,len) char * p; ftnlen len; 147: { 148: while(w>len) 149: { w--; 150: (*putn)(' '); 151: } 152: while(w-- > 0) 153: (*putn)(*p++); 154: return(0); 155: } 156: wrt_E(p,w,d,e,len) ufloat *p; ftnlen len; 157: { char *s; 158: int dp,sign,i,delta; 159: char *ecvt(); 160: if(scale>0) d++; 161: s=ecvt( (len==sizeof(float)?p->pf:p->pd) ,d,&dp,&sign); 162: if(sign || cplus) delta=6; 163: else delta=5; 164: if(w<delta+d) 165: { for(i=0;i<w;i++) (*putn)('*'); 166: return(0); 167: } 168: for(i=0;i<w-(delta+d);i++) (*putn)(' '); 169: if(sign) (*putn)('-'); 170: else if(cplus) (*putn)('+'); 171: if(scale<0 && scale > -d) 172: { 173: (*putn)('.'); 174: for(i=0;i<-scale;i++) 175: (*putn)('0'); 176: for(i=0;i<d+scale;i++) 177: (*putn)(*s++); 178: } 179: else if(scale>0 && scale<d+2) 180: { for(i=0;i<scale;i++) 181: (*putn)(*s++); 182: (*putn)('.'); 183: for(i=0;i<d-scale;i++) 184: (*putn)(*s++); 185: } 186: else 187: { (*putn)('.'); 188: for(i=0;i<d;i++) (*putn)(*s++); 189: } 190: if(p->pf != 0) dp -= scale; 191: else dp = 0; 192: if(dp < 100 && dp > -100) (*putn)('e'); 193: if(dp<0) 194: { (*putn)('-'); 195: dp = -dp; 196: } 197: else (*putn)('+'); 198: if(e>=3 || dp >= 100) 199: { (*putn)(dp/100 + '0'); 200: dp = dp % 100; 201: } 202: if(e!=1) (*putn)(dp/10+'0'); 203: (*putn)(dp%10+'0'); 204: return(0); 205: } 206: wrt_G(p,w,d,e,len) ufloat *p; ftnlen len; 207: { double up = 1,x; 208: int i,oldscale=scale,n,j; 209: x= len==sizeof(float)?p->pf:p->pd; 210: if(x < 0 ) x = -x; 211: if(x<.1) return(wrt_E(p,w,d,e,len)); 212: for(i=0;i<=d;i++,up*=10) 213: { if(x>up) continue; 214: scale=0; 215: if(e==0) n=4; 216: else n=e+2; 217: i=wrt_F(p,w-n,d-i,len); 218: for(j=0;j<n;j++) (*putn)(' '); 219: scale=oldscale; 220: return(i); 221: } 222: return(wrt_E(p,w,d,e,len)); 223: } 224: wrt_F(p,w,d,len) ufloat *p; ftnlen len; 225: { int i,delta,dp,sign,n; 226: double x; 227: char *s,*fcvt(); 228: x= (len==sizeof(float)?p->pf:p->pd); 229: if(scale) 230: { if(scale>0) 231: for(i=0;i<scale;i++) x*=10; 232: else for(i=0;i<-scale;i++) x/=10; 233: } 234: s=fcvt(x,d,&dp,&sign); 235: if(-dp>=d) sign=0; 236: if(sign || cplus) delta=2; 237: else delta=1; 238: n= w - (d+delta+(dp>0?dp:0)); 239: if(n<0) 240: { 241: for(i=0;i<w;i++) PUT('*'); 242: return(0); 243: } 244: for(i=0;i<n;i++) PUT(' '); 245: if(sign) PUT('-'); 246: else if(cplus) PUT('+'); 247: for(i=0;i<dp;i++) PUT(*s++); 248: PUT('.'); 249: for(i=0;i< -dp && i<d;i++) PUT('0'); 250: for(;i<d;i++) 251: { if(*s) PUT(*s++); 252: else PUT('0'); 253: } 254: return(0); 255: }