|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.