|
|
1.1 root 1: #include "defs"
2:
3: /* ROUTINES CALLED DURING DATA STATEMENT PROCESSING */
4:
5: static char datafmt[] = "%s\t%05ld\t%05ld\t%d" ;
6:
7: /* another initializer, called from parser */
8: dataval(repp, valp)
9: register expptr repp, valp;
10: {
11: int i, nrep;
12: ftnint elen, vlen;
13: register Addrp p;
14: Addrp nextdata();
15:
16: if(repp == NULL)
17: nrep = 1;
18: else if (ISICON(repp) && repp->constblock.const.ci >= 0)
19: nrep = repp->constblock.const.ci;
20: else
21: {
22: err("invalid repetition count in DATA statement");
23: frexpr(repp);
24: goto ret;
25: }
26: frexpr(repp);
27:
28: if( ! ISCONST(valp) )
29: {
30: err("non-constant initializer");
31: goto ret;
32: }
33:
34: if(toomanyinit) goto ret;
35: for(i = 0 ; i < nrep ; ++i)
36: {
37: p = nextdata(&elen, &vlen);
38: if(p == NULL)
39: {
40: err("too many initializers");
41: toomanyinit = YES;
42: goto ret;
43: }
44: setdata(p, valp, elen, vlen);
45: frexpr(p);
46: }
47:
48: ret:
49: frexpr(valp);
50: }
51:
52:
53: Addrp nextdata(elenp, vlenp)
54: ftnint *elenp, *vlenp;
55: {
56: register struct Impldoblock *ip;
57: struct Primblock *pp;
58: register Namep np;
59: register struct Rplblock *rp;
60: tagptr p;
61: expptr neltp;
62: register expptr q;
63: int skip;
64: ftnint off;
65:
66: while(curdtp)
67: {
68: p = curdtp->datap;
69: if(p->tag == TIMPLDO)
70: {
71: ip = &(p->impldoblock);
72: if(ip->implb==NULL || ip->impub==NULL || ip->varnp==NULL)
73: fatali("bad impldoblock 0%o", (int) ip);
74: if(ip->isactive)
75: ip->varvp->const.ci += ip->impdiff;
76: else
77: {
78: q = fixtype(cpexpr(ip->implb));
79: if( ! ISICON(q) )
80: goto doerr;
81: ip->varvp = (Constp) q;
82:
83: if(ip->impstep)
84: {
85: q = fixtype(cpexpr(ip->impstep));
86: if( ! ISICON(q) )
87: goto doerr;
88: ip->impdiff = q->constblock.const.ci;
89: frexpr(q);
90: }
91: else
92: ip->impdiff = 1;
93:
94: q = fixtype(cpexpr(ip->impub));
95: if(! ISICON(q))
96: goto doerr;
97: ip->implim = q->constblock.const.ci;
98: frexpr(q);
99:
100: ip->isactive = YES;
101: rp = ALLOC(Rplblock);
102: rp->rplnextp = rpllist;
103: rpllist = rp;
104: rp->rplnp = ip->varnp;
105: rp->rplvp = (expptr) (ip->varvp);
106: rp->rpltag = TCONST;
107: }
108:
109: if( (ip->impdiff>0 && (ip->varvp->const.ci <= ip->implim))
110: || (ip->impdiff<0 && (ip->varvp->const.ci >= ip->implim)) )
111: { /* start new loop */
112: curdtp = ip->datalist;
113: goto next;
114: }
115:
116: /* clean up loop */
117:
118: if(rpllist)
119: {
120: rp = rpllist;
121: rpllist = rpllist->rplnextp;
122: free( (charptr) rp);
123: }
124: else
125: fatal("rpllist empty");
126:
127: frexpr(ip->varvp);
128: ip->isactive = NO;
129: curdtp = curdtp->nextp;
130: goto next;
131: }
132:
133: pp = (struct Primblock *) p;
134: np = pp->namep;
135: skip = YES;
136:
137: if(p->primblock.argsp==NULL && np->vdim!=NULL)
138: { /* array initialization */
139: q = (expptr) mkaddr(np);
140: off = typesize[np->vtype] * curdtelt;
141: if(np->vtype == TYCHAR)
142: off *= np->vleng->constblock.const.ci;
143: q->addrblock.memoffset =
144: mkexpr(OPPLUS, q->addrblock.memoffset, mkintcon(off) );
145: if( (neltp = np->vdim->nelt) && ISCONST(neltp))
146: {
147: if(++curdtelt < neltp->constblock.const.ci)
148: skip = NO;
149: }
150: else
151: err("attempt to initialize adjustable array");
152: }
153: else
154: q = mklhs( cpexpr(pp) );
155: if(skip)
156: {
157: curdtp = curdtp->nextp;
158: curdtelt = 0;
159: }
160: if(q->headblock.vtype == TYCHAR)
161: if(ISICON(q->headblock.vleng))
162: *elenp = q->headblock.vleng->constblock.const.ci;
163: else {
164: err("initialization of string of nonconstant length");
165: continue;
166: }
167: else *elenp = typesize[q->headblock.vtype];
168:
169: if(np->vstg == STGCOMMON)
170: *vlenp = extsymtab[np->vardesc.varno].maxleng;
171: else if(np->vstg == STGEQUIV)
172: *vlenp = eqvclass[np->vardesc.varno].eqvleng;
173: else {
174: *vlenp = (np->vtype==TYCHAR ?
175: np->vleng->constblock.const.ci :
176: typesize[np->vtype]);
177: if(np->vstg==STGBSS && *vlenp>0)
178: np->vstg = STGINIT;
179: if(np->vdim)
180: *vlenp *= np->vdim->nelt->constblock.const.ci;
181: }
182: return( (Addrp) q );
183:
184: doerr:
185: err("nonconstant implied DO parameter");
186: frexpr(q);
187: curdtp = curdtp->nextp;
188:
189: next: curdtelt = 0;
190: }
191:
192: return(NULL);
193: }
194:
195:
196:
197:
198:
199:
200: setdata(varp, valp, elen, vlen)
201: register Addrp varp;
202: ftnint elen, vlen;
203: register Constp valp;
204: {
205: union Constant con;
206: register int type;
207: int i, k, valtype;
208: ftnint offset;
209: char *dataname(), *varname;
210:
211: varname = dataname(varp->vstg, varp->memno);
212: offset = varp->memoffset->constblock.const.ci;
213: type = varp->vtype;
214: valtype = valp->vtype;
215: if(type!=TYCHAR && valtype==TYCHAR)
216: {
217: if(! ftn66flag)
218: warn("non-character datum initialized with character string");
219: varp->vleng = ICON(typesize[type]);
220: varp->vtype = type = TYCHAR;
221: }
222: else if( (type==TYCHAR && valtype!=TYCHAR) ||
223: (cktype(OPASSIGN,type,valtype) == TYERROR) )
224: {
225: err("incompatible types in initialization");
226: return;
227: }
228: if(type == TYADDR)
229: con.ci = valp->const.ci;
230: else if(type != TYCHAR)
231: {
232: if(valtype == TYUNKNOWN)
233: con.ci = valp->const.ci;
234: else consconv(type, &con, valtype, &valp->const);
235: }
236:
237: k = 1;
238: switch(type)
239: {
240: case TYLOGICAL:
241: type = tylogical;
242: case TYSHORT:
243: case TYLONG:
244: dataline(varname, offset, vlen, type);
245: prconi(initfile, type, con.ci);
246: break;
247:
248: case TYADDR:
249: dataline(varname, offset, vlen, type);
250: prcona(initfile, con.ci);
251: break;
252:
253: case TYCOMPLEX:
254: k = 2;
255: type = TYREAL;
256: case TYREAL:
257: goto flpt;
258:
259: case TYDCOMPLEX:
260: k = 2;
261: type = TYDREAL;
262: case TYDREAL:
263: flpt:
264:
265: for(i = 0 ; i < k ; ++i)
266: {
267: dataline(varname, offset, vlen, type);
268: prconr(initfile, type, con.cd[i]);
269: offset += typesize[type];
270: }
271: break;
272:
273: case TYCHAR:
274: k = valp->vleng->constblock.const.ci;
275: if(elen < k)
276: k = elen;
277:
278: for(i = 0 ; i < k ; ++i)
279: {
280: dataline(varname, offset++, vlen, TYCHAR);
281: fprintf(initfile, "\t%d\n",
282: valp->const.ccp[i]);
283: }
284: k = elen - valp->vleng->constblock.const.ci;
285: if(k > 0)
286: {
287: dataline(varname, offset, vlen, TYBLANK);
288: fprintf(initfile, "\t%d\n", k);
289: offset += k;
290: }
291: break;
292:
293: default:
294: badtype("setdata", type);
295: }
296:
297: }
298:
299:
300:
301: /*
302: output form of name is padded with blanks and preceded
303: with a storage class digit
304: */
305: char *dataname(stg,memno)
306: int stg, memno;
307: {
308: static char varname[XL+2];
309: register char *s, *t;
310: char *memname();
311:
312: varname[0] = (stg==STGCOMMON ? '2' : (stg==STGEQUIV ? '1' : '0') );
313: s = memname(stg, memno);
314: for(t = varname+1 ; *s ; )
315: *t++ = *s++;
316: while(t < varname+XL+1)
317: *t++ = ' ';
318: varname[XL+1] = '\0';
319: return(varname);
320: }
321:
322:
323:
324:
325:
326: frdata(p0)
327: chainp p0;
328: {
329: register struct Chain *p;
330: register tagptr q;
331:
332: for(p = p0 ; p ; p = p->nextp)
333: {
334: q = p->datap;
335: if(q->tag == TIMPLDO)
336: {
337: if(q->impldoblock.isbusy)
338: return; /* circular chain completed */
339: q->impldoblock.isbusy = YES;
340: frdata(q->impldoblock.datalist);
341: free( (charptr) q);
342: }
343: else
344: frexpr(q);
345: }
346:
347: frchain( &p0);
348: }
349:
350:
351:
352: dataline(varname, offset, vlen, type)
353: char *varname;
354: ftnint offset, vlen;
355: int type;
356: {
357: fprintf(initfile, datafmt, varname, offset, vlen, type);
358: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.