BSD 4 development
[unix-history] / .ref-BSD-3 / usr / src / libI77 / wrtfmt.c
CommitLineData
914b7558
BJ
1#include "fio.h"
2#include "fmt.h"
3extern int cursor;
4mv_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}
16w_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}
43w_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 - 1;
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}
66wrt_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<w;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}
86wrt_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, 10);
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}
115wrt_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}
127wrt_H(a,b)
128{ char *s=(char *)b;
129 if(mv_cur()) return(mv_cur());
130 while(a--) (*putn)(*s++);
131 return(1);
132}
133wrt_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}
141wrt_A(p,len) char *p; ftnlen len;
142{
143 while(len-- > 0) (*putn)(*p++);
144 return(0);
145}
146wrt_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}
156wrt_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}
206wrt_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}
224wrt_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}