|
|
1.1 root 1: #include "fio.h"
2: #include "fmt.h"
3:
4: wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;
5: { char *s;
6: int dp,sign,i, delta;
7: char *ecvt();
8: double dd;
9: if(e == 0)
10: e = 2;
11: if(scale) {
12: if(scale >= d + 2 || scale <= -d)
13: goto nogood;
14: if(scale > 0)
15: d++;
16: }
17: if (len == sizeof(float))
18: dd = p->pf;
19: else
20: dd = p->pd;
21: s=ecvt( dd ,d,&dp,&sign);
22: delta = 1 /* for the . */ + 2 /* for the E+ */ + (sign || cplus);
23: if(w < d + e + delta) {
24: nogood:
25: for(i=0;i<w;i++) (*putn)('*');
26: return(0);
27: }
28: if(p->pf != 0) dp -= scale;
29: else dp = 0;
30: switch(e) { /* grumph */
31: case 1:
32: if(dp <= -10 || dp >= 10)
33: goto nogood;
34: break;
35: case 2:
36: if(dp <= -100 || dp >= 100)
37: goto nogood;
38: break;
39: case 3:
40: if(dp <= -1000 || dp >= 1000)
41: goto nogood;
42: break;
43: default:
44: /* probably ok */
45: break;
46: }
47: for(i=0;i<w-(delta+d+e);i++) (*putn)(' ');
48: if(sign) (*putn)('-');
49: else if(cplus) (*putn)('+');
50: if(scale<0)
51: {
52: (*putn)('.');
53: for(i=0;i<-scale;i++)
54: (*putn)('0');
55: for(i=0;i<d+scale;i++)
56: (*putn)(*s++);
57: }
58: else if(scale>0 && scale<d+2)
59: { for(i=0;i<scale;i++)
60: (*putn)(*s++);
61: (*putn)('.');
62: for(i=0;i<d-scale;i++)
63: (*putn)(*s++);
64: }
65: else
66: { (*putn)('.');
67: for(i=0;i<d;i++) (*putn)(*s++);
68: }
69: if(dp < 100 && dp > -100) (*putn)('e');
70: if(dp<0)
71: { (*putn)('-');
72: dp = -dp;
73: }
74: else (*putn)('+');
75: for(; e >= 4; e--)
76: (*putn)('0');
77: if(e>=3 || dp >= 100)
78: { (*putn)(dp/100 + '0');
79: dp = dp % 100;
80: }
81: if(e!=1) (*putn)(dp/10+'0');
82: (*putn)(dp%10+'0');
83: return(0);
84: }
85:
86: wrt_F(p,w,d,len) ufloat *p; ftnlen len;
87: { int i,delta,dp,sign,n;
88: double x;
89: char *s,*fcvt();
90: x= (len==sizeof(float)?p->pf:p->pd);
91: if(scale)
92: { if(scale>0)
93: for(i=0;i<scale;i++) x*=10;
94: else for(i=0;i<-scale;i++) x/=10;
95: }
96: s=fcvt(x,d,&dp,&sign);
97: if(-dp>=d) sign=0;
98: if(sign || cplus) delta=2;
99: else delta=1;
100: n= w - (d+delta+(dp>0?dp:0));
101: if(n<0)
102: {
103: for(i=0;i<w;i++) PUT('*');
104: return(0);
105: }
106: for(i=0;i<n;i++) PUT(' ');
107: if(sign) PUT('-');
108: else if(cplus) PUT('+');
109: for(i=0;i<dp;i++) PUT(*s++);
110: PUT('.');
111: for(i=0;i< -dp && i<d;i++) PUT('0');
112: for(;i<d;i++)
113: { if(*s) PUT(*s++);
114: else PUT('0');
115: }
116: return(0);
117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.