xref: /csrg-svn/usr.bin/f77/libI77/lwrite.c (revision 2497)
1*2497Sdlw /*
2*2497Sdlw char id_lwrite[] = "@(#)lwrite.c	1.1";
3*2497Sdlw  *
4*2497Sdlw  * list directed write
5*2497Sdlw  */
6*2497Sdlw 
7*2497Sdlw #include "fio.h"
8*2497Sdlw #include "lio.h"
9*2497Sdlw 
10*2497Sdlw int l_write(), t_putc();
11*2497Sdlw 
12*2497Sdlw s_wsle(a) cilist *a;
13*2497Sdlw {
14*2497Sdlw 	int n;
15*2497Sdlw 	reading = NO;
16*2497Sdlw 	if(n=c_le(a,WRITE)) return(n);
17*2497Sdlw 	putn = t_putc;
18*2497Sdlw 	lioproc = l_write;
19*2497Sdlw 	line_len = LINE;
20*2497Sdlw 	curunit->uend = NO;
21*2497Sdlw 	leof = NO;
22*2497Sdlw 	if(!curunit->uwrt) nowwriting(curunit);
23*2497Sdlw 	return(OK);
24*2497Sdlw }
25*2497Sdlw 
26*2497Sdlw t_putc(c) char c;
27*2497Sdlw {
28*2497Sdlw 	if(c=='\n') recpos=0;
29*2497Sdlw 	else recpos++;
30*2497Sdlw 	putc(c,cf);
31*2497Sdlw 	return(OK);
32*2497Sdlw }
33*2497Sdlw 
34*2497Sdlw e_wsle()
35*2497Sdlw {	int n;
36*2497Sdlw 	PUT('\n')
37*2497Sdlw 	return(OK);
38*2497Sdlw }
39*2497Sdlw 
40*2497Sdlw l_write(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len;
41*2497Sdlw {
42*2497Sdlw 	int i,n;
43*2497Sdlw 	ftnint x;
44*2497Sdlw 	float y,z;
45*2497Sdlw 	double yd,zd;
46*2497Sdlw 	float *xx;
47*2497Sdlw 	double *yy;
48*2497Sdlw 	for(i=0;i< *number; i++)
49*2497Sdlw 	{
50*2497Sdlw 		switch((int)type)
51*2497Sdlw 		{
52*2497Sdlw 		case TYSHORT:
53*2497Sdlw 			x=ptr->flshort;
54*2497Sdlw 			goto xint;
55*2497Sdlw 		case TYLONG:
56*2497Sdlw 			x=ptr->flint;
57*2497Sdlw 	xint:		ERR(lwrt_I(x));
58*2497Sdlw 			break;
59*2497Sdlw 		case TYREAL:
60*2497Sdlw 			ERR(lwrt_F(ptr->flreal));
61*2497Sdlw 			break;
62*2497Sdlw 		case TYDREAL:
63*2497Sdlw 			ERR(lwrt_D(ptr->fldouble));
64*2497Sdlw 			break;
65*2497Sdlw 		case TYCOMPLEX:
66*2497Sdlw 			xx= &(ptr->flreal);
67*2497Sdlw 			y = *xx++;
68*2497Sdlw 			z = *xx;
69*2497Sdlw 			ERR(lwrt_C(y,z));
70*2497Sdlw 			break;
71*2497Sdlw 		case TYDCOMPLEX:
72*2497Sdlw 			yy = &(ptr->fldouble);
73*2497Sdlw 			yd= *yy++;
74*2497Sdlw 			zd = *yy;
75*2497Sdlw 			ERR(lwrt_DC(yd,zd));
76*2497Sdlw 			break;
77*2497Sdlw 		case TYLOGICAL:
78*2497Sdlw 			ERR(lwrt_L(ptr->flint));
79*2497Sdlw 			break;
80*2497Sdlw 		case TYCHAR:
81*2497Sdlw 			ERR(lwrt_A((char *)ptr,len));
82*2497Sdlw 			break;
83*2497Sdlw 		default:
84*2497Sdlw 			fatal(119,"unknown type in lwrite");
85*2497Sdlw 		}
86*2497Sdlw 		ptr = (flex *)((char *)ptr + len);
87*2497Sdlw 	}
88*2497Sdlw 	return(OK);
89*2497Sdlw }
90*2497Sdlw 
91*2497Sdlw lwrt_I(in) ftnint in;
92*2497Sdlw {	int n;
93*2497Sdlw 	char buf[16],*p;
94*2497Sdlw 	sprintf(buf,"  %ld",(long)in);
95*2497Sdlw 	if(n=chk_len(LINTW)) return(n);
96*2497Sdlw 	for(p=buf;*p;) PUT(*p++)
97*2497Sdlw 	return(OK);
98*2497Sdlw }
99*2497Sdlw 
100*2497Sdlw lwrt_L(ln) ftnint ln;
101*2497Sdlw {	int n;
102*2497Sdlw 	if(n=chk_len(LLOGW)) return(n);
103*2497Sdlw 	return(wrt_L(&ln,LLOGW));
104*2497Sdlw }
105*2497Sdlw 
106*2497Sdlw lwrt_A(p,len) char *p; ftnlen len;
107*2497Sdlw {	int i,n;
108*2497Sdlw 	if(n=chk_len(LSTRW)) return(n);
109*2497Sdlw 	PUT(' ')
110*2497Sdlw 	PUT(' ')
111*2497Sdlw 	for(i=0;i<len;i++) PUT(*p++)
112*2497Sdlw 	return(OK);
113*2497Sdlw }
114*2497Sdlw 
115*2497Sdlw lwrt_F(fn) float fn;
116*2497Sdlw {	int d,n; float x; ufloat f;
117*2497Sdlw 	if(fn==0.0) return(lwrt_0());
118*2497Sdlw 	f.pf = fn;
119*2497Sdlw 	d = width(fn);
120*2497Sdlw 	if(n=chk_len(d)) return(n);
121*2497Sdlw 	if(d==LFW)
122*2497Sdlw 	{
123*2497Sdlw 		scale = 0;
124*2497Sdlw 		for(d=LFD,x=abs(fn);x>=1.0;x/=10.0,d--);
125*2497Sdlw 		return(wrt_F(&f,LFW,d,(ftnlen)sizeof(float)));
126*2497Sdlw 	}
127*2497Sdlw 	else
128*2497Sdlw 	{
129*2497Sdlw 		scale = 1;
130*2497Sdlw 		return(wrt_E(&f,LEW,LED-scale,LEE,(ftnlen)sizeof(float)));
131*2497Sdlw 	}
132*2497Sdlw }
133*2497Sdlw 
134*2497Sdlw lwrt_D(dn) double dn;
135*2497Sdlw {	int d,n; double x; ufloat f;
136*2497Sdlw 	if(dn==0.0) return(lwrt_0());
137*2497Sdlw 	f.pd = dn;
138*2497Sdlw 	d = dwidth(dn);
139*2497Sdlw 	if(n=chk_len(d)) return(n);
140*2497Sdlw 	if(d==LDFW)
141*2497Sdlw 	{
142*2497Sdlw 		scale = 0;
143*2497Sdlw 		for(d=LDFD,x=abs(dn);x>=1.0;x/=10.0,d--);
144*2497Sdlw 		return(wrt_F(&f,LDFW,d,(ftnlen)sizeof(double)));
145*2497Sdlw 	}
146*2497Sdlw 	else
147*2497Sdlw 	{
148*2497Sdlw 		scale = 1;
149*2497Sdlw 		return(wrt_E(&f,LDEW,LDED-scale,LDEE,(ftnlen)sizeof(double)));
150*2497Sdlw 	}
151*2497Sdlw }
152*2497Sdlw 
153*2497Sdlw lwrt_C(a,b) float a,b;
154*2497Sdlw {	int n;
155*2497Sdlw 	if(n=chk_len(LCW)) return(n);
156*2497Sdlw 	PUT(' ')
157*2497Sdlw 	PUT(' ')
158*2497Sdlw 	PUT('(')
159*2497Sdlw 	if(n=lwrt_F(a)) return(n);
160*2497Sdlw 	PUT(',')
161*2497Sdlw 	if(n=lwrt_F(b)) return(n);
162*2497Sdlw 	PUT(')')
163*2497Sdlw 	return(OK);
164*2497Sdlw }
165*2497Sdlw 
166*2497Sdlw lwrt_DC(a,b) double a,b;
167*2497Sdlw {	int n;
168*2497Sdlw 	if(n=chk_len(LDCW)) return(n);
169*2497Sdlw 	PUT(' ')
170*2497Sdlw 	PUT(' ')
171*2497Sdlw 	PUT('(')
172*2497Sdlw 	if(n=lwrt_D(a)) return(n);
173*2497Sdlw 	PUT(',')
174*2497Sdlw 	if(n=lwrt_D(b)) return(n);
175*2497Sdlw 	PUT(')')
176*2497Sdlw 	return(OK);
177*2497Sdlw }
178*2497Sdlw 
179*2497Sdlw lwrt_0()
180*2497Sdlw {	int n; char *z = "  0.";
181*2497Sdlw 	if(n=chk_len(4)) return(n);
182*2497Sdlw 	while(*z) PUT(*z++)
183*2497Sdlw 	return(OK);
184*2497Sdlw }
185*2497Sdlw 
186*2497Sdlw chk_len(w)
187*2497Sdlw {	int n;
188*2497Sdlw 	if(recpos+w > line_len) PUT('\n')
189*2497Sdlw 	return(OK);
190*2497Sdlw }
191