xref: /netbsd/external/bsd/pcc/dist/pcc/f77/fcom/init.c (revision 3eb51a41)
1 /*	Id: init.c,v 1.16 2008/12/24 17:40:41 sgk Exp 	*/
2 /*	$NetBSD: init.c,v 1.1.1.3 2010/06/03 18:57:48 plunky Exp $	*/
3 /*
4  * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * Redistributions of source code and documentation must retain the above
11  * copyright notice, this list of conditions and the following disclaimer.
12  * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditionsand the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  * All advertising materials mentioning features or use of this software
16  * must display the following acknowledgement:
17  * 	This product includes software developed or owned by Caldera
18  *	International, Inc.
19  * Neither the name of Caldera International, Inc. nor the names of other
20  * contributors may be used to endorse or promote products derived from
21  * this software without specific prior written permission.
22  *
23  * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
24  * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27  * DISCLAIMED.  IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE
28  * FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OFLIABILITY, WHETHER IN CONTRACT,
32  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
33  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  */
36 #include "defines.h"
37 #include "defs.h"
38 
39 
40 FILEP infile;
41 FILEP diagfile;
42 
43 long int headoffset;
44 
45 char token[100];
46 int toklen;
47 int lineno;
48 char *infname;
49 int needkwd;
50 struct labelblock *thislabel	= NULL;
51 flag nowarnflag	= NO;
52 flag ftn66flag	= NO;
53 flag profileflag	= NO;
54 flag optimflag	= NO;
55 flag quietflag	= NO;
56 flag shiftcase	= YES;
57 flag undeftype	= NO;
58 flag shortsubs	= YES;
59 flag onetripflag	= NO;
60 flag checksubs	= NO;
61 flag debugflag	= NO;
62 int nerr;
63 int nwarn;
64 int ndata;
65 
66 flag saveall;
67 flag substars;
68 int parstate	= OUTSIDE;
69 flag headerdone	= NO;
70 int blklevel;
71 int impltype[26];
72 int implleng[26];
73 int implstg[26];
74 
75 int tyint	= TYLONG ;
76 int tylogical	= TYLONG;
77 ftnint typesize[NTYPES]
78 	= { 1, FSZADDR, FSZSHORT, FSZLONG, FSZLONG, 2*FSZLONG,
79 	    2*FSZLONG, 4*FSZLONG, FSZLONG, 1, 1, 1};
80 int typealign[NTYPES]
81 	= { 1, ALIADDR, ALISHORT, ALILONG, ALILONG, ALIDOUBLE,
82 	    ALILONG, ALIDOUBLE, ALILONG, 1, 1, 1};
83 int procno;
84 int proctype	= TYUNKNOWN;
85 char *procname;
86 int rtvlabel[NTYPES];
87 int fudgelabel;
88 struct bigblock *typeaddr;
89 struct bigblock *retslot;
90 int cxslot	= -1;
91 int chslot	= -1;
92 int chlgslot	= -1;
93 int procclass	= CLUNKNOWN;
94 int nentry;
95 flag multitype;
96 ftnint procleng;
97 int lastlabno	= 10;
98 int lastvarno;
99 int lastargslot;
100 int argloc;
101 ftnint autoleng;
102 ftnint bssleng	= 0;
103 int retlabel;
104 int ret0label;
105 struct ctlframe ctls[MAXCTL];
106 struct ctlframe *ctlstack	= ctls-1;
107 struct ctlframe *lastctl	= ctls+MAXCTL ;
108 
109 bigptr regnamep[10]; /* XXX MAXREGVAR */
110 int highregvar;
111 
112 struct extsym extsymtab[MAXEXT];
113 struct extsym *nextext	= extsymtab;
114 struct extsym *lastext	= extsymtab+MAXEXT;
115 
116 struct equivblock eqvclass[MAXEQUIV];
117 struct hashentry hashtab[MAXHASH];
118 struct hashentry *lasthash	= hashtab+MAXHASH;
119 
120 struct labelblock labeltab[MAXSTNO];
121 struct labelblock *labtabend	= labeltab+MAXSTNO;
122 struct labelblock *highlabtab =	labeltab;
123 chainp rpllist	= NULL;
124 chainp curdtp	= NULL;
125 flag toomanyinit;
126 ftnint curdtelt;
127 chainp templist	= NULL;
128 chainp holdtemps	= NULL;
129 int dorange	= 0;
130 chainp entries	= NULL;
131 chainp chains	= NULL;
132 
133 flag inioctl;
134 struct bigblock *ioblkp;
135 int iostmt;
136 int nioctl;
137 int nequiv	= 0;
138 int nintnames	= 0;
139 int nextnames	= 0;
140 
141 struct literal litpool[MAXLITERALS];
142 int nliterals;
143 
144 /*
145  * Return a number for internal labels.
146  */
147 int getlab(void);
148 
149 int crslab = 10;
150 int
getlab(void)151 getlab(void)
152 {
153 	return crslab++;
154 }
155 
156 
157 void
fileinit()158 fileinit()
159 {
160 procno = 0;
161 lastlabno = 10;
162 lastvarno = 0;
163 nextext = extsymtab;
164 nliterals = 0;
165 nerr = 0;
166 ndata = 0;
167 }
168 
169 
170 
171 
172 void
procinit()173 procinit()
174 {
175 register struct bigblock *p;
176 register struct dimblock *q;
177 register struct hashentry *hp;
178 register struct labelblock *lp;
179 chainp cp;
180 int i;
181 
182 	setloc(RDATA);
183 parstate = OUTSIDE;
184 headerdone = NO;
185 blklevel = 1;
186 saveall = NO;
187 substars = NO;
188 nwarn = 0;
189 thislabel = NULL;
190 needkwd = 0;
191 
192 ++procno;
193 proctype = TYUNKNOWN;
194 procname = "MAIN_    ";
195 procclass = CLUNKNOWN;
196 nentry = 0;
197 multitype = NO;
198 typeaddr = NULL;
199 retslot = NULL;
200 cxslot = -1;
201 chslot = -1;
202 chlgslot = -1;
203 procleng = 0;
204 blklevel = 1;
205 lastargslot = 0;
206 	autoleng = AUTOINIT;
207 
208 for(lp = labeltab ; lp < labtabend ; ++lp)
209 	lp->stateno = 0;
210 
211 for(hp = hashtab ; hp < lasthash ; ++hp)
212 	if((p = hp->varp))
213 		{
214 		frexpr(p->vleng);
215 		if((q = p->b_name.vdim))
216 			{
217 			for(i = 0 ; i < q->ndim ; ++i)
218 				{
219 				frexpr(q->dims[i].dimsize);
220 				frexpr(q->dims[i].dimexpr);
221 				}
222 			frexpr(q->nelt);
223 			frexpr(q->baseoffset);
224 			frexpr(q->basexpr);
225 			ckfree(q);
226 			}
227 		ckfree(p);
228 		hp->varp = NULL;
229 		}
230 nintnames = 0;
231 highlabtab = labeltab;
232 
233 ctlstack = ctls - 1;
234 for(cp = templist ; cp ; cp = cp->chain.nextp)
235 	ckfree(cp->chain.datap);
236 frchain(&templist);
237 holdtemps = NULL;
238 dorange = 0;
239 highregvar = 0;
240 entries = NULL;
241 rpllist = NULL;
242 inioctl = NO;
243 ioblkp = NULL;
244 nequiv = 0;
245 
246 for(i = 0 ; i<NTYPES ; ++i)
247 	rtvlabel[i] = 0;
248 fudgelabel = 0;
249 
250 if(undeftype)
251 	setimpl(TYUNKNOWN, (ftnint) 0, 'a', 'z');
252 else
253 	{
254 	setimpl(TYREAL, (ftnint) 0, 'a', 'z');
255 	setimpl(tyint,  (ftnint) 0, 'i', 'n');
256 	}
257 setimpl(-STGBSS, (ftnint) 0, 'a', 'z');	/* set class */
258 setlog();
259 }
260 
261 
262 
263 void
setimpl(type,length,c1,c2)264 setimpl(type, length, c1, c2)
265 int type;
266 ftnint length;
267 int c1, c2;
268 {
269 int i;
270 char buff[100];
271 
272 if(c1==0 || c2==0)
273 	return;
274 
275 if(c1 > c2) {
276 	sprintf(buff, "characters out of order in implicit:%c-%c", c1, c2);
277 	err(buff);
278 } else
279 	if(type < 0)
280 		for(i = c1 ; i<=c2 ; ++i)
281 			implstg[i-'a'] = - type;
282 	else
283 		{
284 		type = lengtype(type, (int) length);
285 		if(type != TYCHAR)
286 			length = 0;
287 		for(i = c1 ; i<=c2 ; ++i)
288 			{
289 			impltype[i-'a'] = type;
290 			implleng[i-'a'] = length;
291 			}
292 		}
293 }
294