source: mainline/uspace/app/pcc/f77/fcom/data.c@ c6a7b3a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since c6a7b3a was a7de7182, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 14 years ago

Added pcc source tree (contents of pcc-1.0.0.tgz)

  • Property mode set to 100644
File size: 8.1 KB
Line 
1/* $Id: data.c,v 1.15 2008/05/11 15:28:03 ragge Exp $ */
2/*
3 * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * Redistributions of source code and documentation must retain the above
10 * copyright notice, this list of conditions and the following disclaimer.
11 * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditionsand the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * All advertising materials mentioning features or use of this software
15 * must display the following acknowledgement:
16 * This product includes software developed or owned by Caldera
17 * International, Inc.
18 * Neither the name of Caldera International, Inc. nor the names of other
19 * contributors may be used to endorse or promote products derived from
20 * this software without specific prior written permission.
21 *
22 * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
23 * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE
27 * FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OFLIABILITY, WHETHER IN CONTRACT,
31 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36#include "defines.h"
37#include "defs.h"
38
39#if 1 /* RAGGE */
40extern FILE *initfile;
41#endif
42
43/* ROUTINES CALLED DURING DATA STATEMENT PROCESSING */
44LOCAL void setdata(struct bigblock *, struct bigblock *, ftnint, ftnint);
45
46static char datafmt[] = "%s\t%05ld\t%05ld\t%d" ;
47
48/* another initializer, called from parser */
49void
50dataval(repp, valp)
51register struct bigblock *repp, *valp;
52{
53int i, nrep;
54ftnint elen, vlen;
55register struct bigblock *p;
56
57if(repp == NULL)
58 nrep = 1;
59else if (ISICON(repp) && repp->b_const.fconst.ci >= 0)
60 nrep = repp->b_const.fconst.ci;
61else
62 {
63 err("invalid repetition count in DATA statement");
64 frexpr(repp);
65 goto ret;
66 }
67frexpr(repp);
68
69if( ! ISCONST(valp) )
70 {
71 err("non-constant initializer");
72 goto ret;
73 }
74
75if(toomanyinit) goto ret;
76for(i = 0 ; i < nrep ; ++i)
77 {
78 p = nextdata(&elen, &vlen);
79 if(p == NULL)
80 {
81 err("too many initializers");
82 toomanyinit = YES;
83 goto ret;
84 }
85 setdata(p, valp, elen, vlen);
86 frexpr(p);
87 }
88
89ret:
90 frexpr(valp);
91}
92
93
94struct bigblock *nextdata(elenp, vlenp)
95ftnint *elenp, *vlenp;
96{
97register struct bigblock *ip;
98struct bigblock *pp;
99register struct bigblock *np;
100register chainp rp;
101bigptr p;
102bigptr neltp;
103register bigptr q;
104int skip;
105ftnint off;
106
107while(curdtp)
108 {
109 p = curdtp->chain.datap;
110 if(p->tag == TIMPLDO)
111 {
112 ip = p;
113 if(ip->b_impldo.implb==NULL || ip->b_impldo.impub==NULL || ip->b_impldo.varnp==NULL)
114 fatal1("bad impldoblock 0%o", ip);
115 if(ip->isactive)
116 ip->b_impldo.varvp->b_const.fconst.ci += ip->b_impldo.impdiff;
117 else
118 {
119 q = fixtype(cpexpr(ip->b_impldo.implb));
120 if( ! ISICON(q) )
121 goto doerr;
122 ip->b_impldo.varvp = q;
123
124 if(ip->b_impldo.impstep)
125 {
126 q = fixtype(cpexpr(ip->b_impldo.impstep));
127 if( ! ISICON(q) )
128 goto doerr;
129 ip->b_impldo.impdiff = q->b_const.fconst.ci;
130 frexpr(q);
131 }
132 else
133 ip->b_impldo.impdiff = 1;
134
135 q = fixtype(cpexpr(ip->b_impldo.impub));
136 if(! ISICON(q))
137 goto doerr;
138 ip->b_impldo.implim = q->b_const.fconst.ci;
139 frexpr(q);
140
141 ip->isactive = YES;
142 rp = ALLOC(rplblock);
143 rp->rplblock.nextp = rpllist;
144 rpllist = rp;
145 rp->rplblock.rplnp = ip->b_impldo.varnp;
146 rp->rplblock.rplvp = ip->b_impldo.varvp;
147 rp->rplblock.rpltag = TCONST;
148 }
149
150 if( (ip->b_impldo.impdiff>0 &&
151 (ip->b_impldo.varvp->b_const.fconst.ci <= ip->b_impldo.implim))
152 || (ip->b_impldo.impdiff<0 &&
153 (ip->b_impldo.varvp->b_const.fconst.ci >= ip->b_impldo.implim)))
154 { /* start new loop */
155 curdtp = ip->b_impldo.datalist;
156 goto next;
157 }
158
159 /* clean up loop */
160
161 popstack(&rpllist);
162
163 frexpr(ip->b_impldo.varvp);
164 ip->isactive = NO;
165 curdtp = curdtp->chain.nextp;
166 goto next;
167 }
168
169 pp = p;
170 np = pp->b_prim.namep;
171 skip = YES;
172
173 if(p->b_prim.argsp==NULL && np->b_name.vdim!=NULL)
174 { /* array initialization */
175 q = mkaddr(np);
176 off = typesize[np->vtype] * curdtelt;
177 if(np->vtype == TYCHAR)
178 off *= np->vleng->b_const.fconst.ci;
179 q->b_addr.memoffset = mkexpr(OPPLUS, q->b_addr.memoffset, mkintcon(off) );
180 if( (neltp = np->b_name.vdim->nelt) && ISCONST(neltp))
181 {
182 if(++curdtelt < neltp->b_const.fconst.ci)
183 skip = NO;
184 }
185 else
186 err("attempt to initialize adjustable array");
187 }
188 else
189 q = mklhs( cpexpr(pp) );
190 if(skip)
191 {
192 curdtp = curdtp->chain.nextp;
193 curdtelt = 0;
194 }
195 if(q->vtype == TYCHAR)
196 if(ISICON(q->vleng))
197 *elenp = q->vleng->b_const.fconst.ci;
198 else {
199 err("initialization of string of nonconstant length");
200 continue;
201 }
202 else *elenp = typesize[q->vtype];
203
204 if(np->vstg == STGCOMMON)
205 *vlenp = extsymtab[np->b_name.vardesc.varno].maxleng;
206 else if(np->vstg == STGEQUIV)
207 *vlenp = eqvclass[np->b_name.vardesc.varno].eqvleng;
208 else {
209 *vlenp = (np->vtype==TYCHAR ?
210 np->vleng->b_const.fconst.ci : typesize[np->vtype]);
211 if(np->b_name.vdim)
212 *vlenp *= np->b_name.vdim->nelt->b_const.fconst.ci;
213 }
214 return(q);
215
216doerr:
217 err("nonconstant implied DO parameter");
218 frexpr(q);
219 curdtp = curdtp->chain.nextp;
220
221next: curdtelt = 0;
222 }
223
224return(NULL);
225}
226
227
228
229
230
231
232LOCAL void setdata(varp, valp, elen, vlen)
233struct bigblock *varp;
234ftnint elen, vlen;
235struct bigblock *valp;
236{
237union constant con;
238int i, k;
239int stg, type, valtype;
240ftnint offset;
241register char *s, *t;
242static char varname[XL+2];
243
244/* output form of name is padded with blanks and preceded
245 with a storage class digit
246*/
247
248stg = varp->vstg;
249varname[0] = (stg==STGCOMMON ? '2' : (stg==STGEQUIV ? '1' : '0') );
250s = memname(stg, varp->b_addr.memno);
251for(t = varname+1 ; *s ; )
252 *t++ = *s++;
253while(t < varname+XL+1)
254 *t++ = ' ';
255varname[XL+1] = '\0';
256
257offset = varp->b_addr.memoffset->b_const.fconst.ci;
258type = varp->vtype;
259valtype = valp->vtype;
260if(type!=TYCHAR && valtype==TYCHAR)
261 {
262 if(! ftn66flag)
263 warn("non-character datum initialized with character string");
264 varp->vleng = MKICON(typesize[type]);
265 varp->vtype = type = TYCHAR;
266 }
267else if( (type==TYCHAR && valtype!=TYCHAR) ||
268 (cktype(OPASSIGN,type,valtype) == TYERROR) )
269 {
270 err("incompatible types in initialization");
271 return;
272 }
273if(type != TYCHAR) {
274 if(valtype == TYUNKNOWN)
275 con.ci = valp->b_const.fconst.ci;
276 else consconv(type, &con, valtype, &valp->b_const.fconst);
277}
278
279k = 1;
280switch(type)
281 {
282 case TYLOGICAL:
283 type = tylogical;
284 case TYSHORT:
285 case TYLONG:
286 fprintf(initfile, datafmt, varname, offset, vlen, type);
287 prconi(initfile, type, con.ci);
288 break;
289
290 case TYCOMPLEX:
291 k = 2;
292 type = TYREAL;
293 case TYREAL:
294 goto flpt;
295
296 case TYDCOMPLEX:
297 k = 2;
298 type = TYDREAL;
299 case TYDREAL:
300 flpt:
301
302 for(i = 0 ; i < k ; ++i)
303 {
304 fprintf(initfile, datafmt, varname, offset, vlen, type);
305 prconr(initfile, type, con.cd[i]);
306 offset += typesize[type];
307 }
308 break;
309
310 case TYCHAR:
311 k = valp->vleng->b_const.fconst.ci;
312 if(elen < k)
313 k = elen;
314
315 for(i = 0 ; i < k ; ++i)
316 {
317 fprintf(initfile, datafmt, varname, offset++, vlen, TYCHAR);
318 fprintf(initfile, "\t%d\n", valp->b_const.fconst.ccp[i]);
319 }
320 k = elen - valp->vleng->b_const.fconst.ci;
321 while( k-- > 0)
322 {
323 fprintf(initfile, datafmt, varname, offset++, vlen, TYCHAR);
324 fprintf(initfile, "\t%d\n", ' ');
325 }
326 break;
327
328 default:
329 fatal1("setdata: impossible type %d", type);
330 }
331
332}
333
334
335void
336frdata(p0)
337chainp p0;
338{
339register chainp p;
340register bigptr q;
341
342for(p = p0 ; p ; p = p->chain.nextp)
343 {
344 q = p->chain.datap;
345 if(q->tag == TIMPLDO)
346 {
347 if(q->isbusy)
348 return; /* circular chain completed */
349 q->isbusy = YES;
350 frdata(q->b_impldo.datalist);
351 ckfree(q);
352 }
353 else
354 frexpr(q);
355 }
356
357frchain( &p0);
358}
Note: See TracBrowser for help on using the repository browser.