|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)lwrite.c 5.2 7/30/85
7: */
8:
9: /*
10: * list directed write
11: */
12:
13: #include "fio.h"
14: #include "lio.h"
15:
16: int l_write(), t_putc();
17: LOCAL char lwrt[] = "list write";
18:
19: s_wsle(a) cilist *a;
20: {
21: int n;
22: reading = NO;
23: formatted = LISTDIRECTED;
24: fmtbuf = "ext list io";
25: if(n=c_le(a,WRITE)) return(n);
26: putn = t_putc;
27: lioproc = l_write;
28: line_len = LINE;
29: curunit->uend = NO;
30: leof = NO;
31: if(!curunit->uwrt && ! nowwriting(curunit)) err(errflag, errno, lwrt)
32: return(OK);
33: }
34:
35: LOCAL
36: t_putc(c) char c;
37: {
38: if(c=='\n') recpos=0;
39: else recpos++;
40: putc(c,cf);
41: return(OK);
42: }
43:
44: e_wsle()
45: { int n;
46: PUT('\n')
47: return(OK);
48: }
49:
50: l_write(number,ptr,len,type) ftnint *number,type; flex *ptr; ftnlen len;
51: {
52: int i,n;
53: ftnint x;
54: float y,z;
55: double yd,zd;
56: float *xx;
57: double *yy;
58: for(i=0;i< *number; i++)
59: {
60: if( formatted == NAMELIST && i != 0 ) PUT(',');
61: switch((int)type)
62: {
63: case TYSHORT:
64: x=ptr->flshort;
65: goto xint;
66: case TYLONG:
67: x=ptr->flint;
68: xint: ERRCHK(lwrt_I(x));
69: break;
70: case TYREAL:
71: ERRCHK(lwrt_F(ptr->flreal));
72: break;
73: case TYDREAL:
74: ERRCHK(lwrt_D(ptr->fldouble));
75: break;
76: case TYCOMPLEX:
77: xx= &(ptr->flreal);
78: y = *xx++;
79: z = *xx;
80: ERRCHK(lwrt_C(y,z));
81: break;
82: case TYDCOMPLEX:
83: yy = &(ptr->fldouble);
84: yd= *yy++;
85: zd = *yy;
86: ERRCHK(lwrt_DC(yd,zd));
87: break;
88: case TYLOGICAL:
89: if(len == sizeof(short))
90: x = ptr->flshort;
91: else
92: x = ptr->flint;
93: ERRCHK(lwrt_L(x));
94: break;
95: case TYCHAR:
96: ERRCHK(lwrt_A((char *)ptr,len));
97: break;
98: default:
99: fatal(F_ERSYS,"unknown type in lwrite");
100: }
101: ptr = (flex *)((char *)ptr + len);
102: }
103: return(OK);
104:
105: got_err:
106: err( n>0?errflag:endflag, n,
107: formatted==LISTDIRECTED?"list io":"name list io");
108: }
109:
110: LOCAL
111: lwrt_I(in) ftnint in;
112: { int n;
113: char buf[16],*p;
114: sprintf(buf," %ld",(long)in);
115: chk_len(LINTW);
116: for(p=buf;*p;) PUT(*p++)
117: return(OK);
118: }
119:
120: LOCAL
121: lwrt_L(ln) ftnint ln;
122: { int n;
123: chk_len(LLOGW);
124: return(wrt_L(&ln,LLOGW));
125: }
126:
127: LOCAL
128: lwrt_A(p,len) char *p; ftnlen len;
129: { int i,n;
130: chk_len(LSTRW);
131: if(formatted == LISTDIRECTED)
132: {
133: PUT(' ')
134: PUT(' ')
135: for(i=0;i<len;i++) PUT(*p++)
136: }
137: else
138: {
139: PUT('\'')
140: for(i=0;i<len;i++) PUT(*p++)
141: PUT('\'')
142: }
143: return(OK);
144: }
145:
146: LOCAL
147: lwrt_F(fn) float fn;
148: { int d,n; float x; ufloat f;
149: if(fn==0.0) return(lwrt_0());
150: f.pf = fn;
151: d = width(fn);
152: chk_len(d);
153: if(d==LFW)
154: {
155: scale = 0;
156: for(d=LFD,x=abs(fn);x>=1.0;x/=10.0,d--);
157: return(wrt_F(&f,LFW,d,(ftnlen)sizeof(float)));
158: }
159: else
160: {
161: scale = 1;
162: return(wrt_E(&f,LEW,LED-scale,LEE,(ftnlen)sizeof(float),'e'));
163: }
164: }
165:
166: LOCAL
167: lwrt_D(dn) double dn;
168: { int d,n; double x; ufloat f;
169: if(dn==0.0) return(lwrt_0());
170: f.pd = dn;
171: d = dwidth(dn);
172: chk_len(d);
173: if(d==LDFW)
174: {
175: scale = 0;
176: for(d=LDFD,x=abs(dn);x>=1.0;x/=10.0,d--);
177: return(wrt_F(&f,LDFW,d,(ftnlen)sizeof(double)));
178: }
179: else
180: {
181: scale = 1;
182: return(wrt_E(&f,LDEW,LDED-scale,LDEE,(ftnlen)sizeof(double),'d'));
183: }
184: }
185:
186: LOCAL
187: lwrt_C(a,b) float a,b;
188: { int n;
189: chk_len(LCW);
190: PUT(' ')
191: PUT(' ')
192: PUT('(')
193: if(n=lwrt_F(a)) return(n);
194: PUT(',')
195: if(n=lwrt_F(b)) return(n);
196: PUT(')')
197: return(OK);
198: }
199:
200: LOCAL
201: lwrt_DC(a,b) double a,b;
202: { int n;
203: chk_len(LDCW);
204: PUT(' ')
205: PUT(' ')
206: PUT('(')
207: if(n=lwrt_D(a)) return(n);
208: PUT(',')
209: if(n=lwrt_D(b)) return(n);
210: PUT(')')
211: return(OK);
212: }
213:
214: LOCAL
215: lwrt_0()
216: { int n; char *z = " 0.";
217: chk_len(4);
218: while(*z) PUT(*z++)
219: return(OK);
220: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.