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