|
|
1.1 root 1: /* Open and close files for bison,
2: Copyright (C) 1984, 1986 Bob Corbett and Free Software Foundation, Inc.
3:
4: BISON is distributed in the hope that it will be useful, but WITHOUT ANY
5: WARRANTY. No author or distributor accepts responsibility to anyone
6: for the consequences of using it or for whether it serves any
7: particular purpose or works at all, unless he says so in writing.
8: Refer to the BISON General Public License for full details.
9:
10: Everyone is granted permission to copy, modify and redistribute BISON,
11: but only under the conditions described in the BISON General Public
12: License. A copy of this license is supposed to have been given to you
13: along with BISON so you can know your rights and responsibilities. It
14: should be in a file named COPYING. Among other things, the copyright
15: notice and this notice must be preserved on all copies.
16:
17: In other words, you are welcome to use, share and improve this program.
18: You are forbidden to forbid anyone else to use, share and improve
19: what you give them. Help stamp out software-hoarding! */
20:
21: #ifdef VMS
22: #include <ssdef.h>
23: #define unlink delete
24: #define XPFILE "GNU_BISON:[000000]BISON.SIMPLE"
25: #define XPFILE1 "GNU_BISON:[000000]BISON.HAIRY"
26: #endif
27:
28: #include <stdio.h>
29: #include "files.h"
30: #include "new.h"
31: #include "gram.h"
32:
33: FILE *finput = NULL;
34: FILE *foutput = NULL;
35: FILE *fdefines = NULL;
36: FILE *ftable = NULL;
37: FILE *fattrs = NULL;
38: FILE *fguard = NULL;
39: FILE *faction = NULL;
40: FILE *fparser = NULL;
41:
42: /* File name specified with -o for the output file, or 0 if no -o. */
43: char *spec_outfile;
44:
45: char *infile;
46: char *outfile;
47: char *defsfile;
48: char *tabfile;
49: char *attrsfile;
50: char *guardfile;
51: char *actfile;
52: char *tmpattrsfile;
53: char *tmptabfile;
54:
55: char *mktemp(); /* So the compiler won't complain */
56: FILE *tryopen(); /* This might be a good idea */
57:
58: extern int verboseflag;
59: extern int definesflag;
60: int fixed_outfiles = 0;
61:
62:
63: char*
64: stringappend(string1, end1, string2)
65: char *string1;
66: int end1;
67: char *string2;
68: {
69: register char *ostring;
70: register char *cp, *cp1;
71: register int i;
72:
73: cp = string2; i = 0;
74: while (*cp++) i++;
75:
76: ostring = NEW2(i+end1+1, char);
77:
78: cp = ostring;
79: cp1 = string1;
80: for (i = 0; i < end1; i++)
81: *cp++ = *cp1++;
82:
83: cp1 = string2;
84: while (*cp++ = *cp1++) ;
85:
86: return ostring;
87: }
88:
89:
90: /* JF this has been hacked to death. Nowaday it sets up the file names for
91: the output files, and opens the tmp files and the parser */
92: openfiles()
93: {
94: char *name_base;
95: register char *cp;
96: char *filename;
97: int base_length;
98: int short_base_length;
99:
100: #ifdef VMS
101: char *tmp_base = "sys$scratch:b_";
102: #else
103: char *tmp_base = "/tmp/b.";
104: #endif
105: int tmp_len = strlen (tmp_base);
106:
107: if (spec_outfile)
108: {
109: /* -o was specified. The precise -o name will be used for ftable.
110: For other output files, remove the ".c" or ".tab.c" suffix. */
111: name_base = spec_outfile;
112: /* BASE_LENGTH includes ".tab" but not ".c". */
113: base_length = strlen (name_base);
114: if (!strcmp (name_base + base_length - 2, ".c"))
115: base_length -= 2;
116: /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c". */
117: short_base_length = base_length;
118: if (!strcmp (name_base + short_base_length - 4, ".tab"))
119: short_base_length -= 4;
120: else if (!strcmp (name_base + short_base_length - 4, "_tab"))
121: short_base_length -= 4;
122: }
123: else
124: {
125: /* -o was not specified; compute output file name from input
126: or use y.tab.c, etc., if -y was specified. */
127:
128: name_base = fixed_outfiles ? "y.y" : infile;
129:
130: /* Discard any directory names from the input file name
131: to make the base of the output. */
132: cp = name_base;
133: while (*cp)
134: {
135: if (*cp == '/')
136: name_base = cp+1;
137: cp++;
138: }
139:
140: /* BASE_LENGTH gets length of NAME_BASE, sans ".y" suffix if any. */
141:
142: base_length = strlen (name_base);
143: if (!strcmp (name_base + base_length - 2, ".y"))
144: base_length -= 2;
145: short_base_length = base_length;
146:
147: #ifdef VMS
148: name_base = stringappend(name_base, short_base_length, "_tab");
149: #else
150: name_base = stringappend(name_base, short_base_length, ".tab");
151: #endif
152: base_length = short_base_length + 4;
153: }
154:
155: finput = tryopen(infile, "r");
156:
157: filename = (char *) getenv ("BISON_SIMPLE");
158: fparser = tryopen(filename ? filename : PFILE, "r");
159:
160: if (verboseflag)
161: {
162: outfile = stringappend(name_base, short_base_length, ".output");
163: foutput = tryopen(outfile, "w");
164: }
165:
166: if (definesflag)
167: {
168: defsfile = stringappend(name_base, base_length, ".h");
169: fdefines = tryopen(defsfile, "w");
170: }
171:
172: actfile = mktemp(stringappend(tmp_base, tmp_len, "act.XXXXXX"));
173: faction = tryopen(actfile, "w+");
174: unlink(actfile);
175:
176: tmpattrsfile = mktemp(stringappend(tmp_base, tmp_len, "attrs.XXXXXX"));
177: fattrs = tryopen(tmpattrsfile,"w+");
178: unlink(tmpattrsfile);
179:
180: tmptabfile = mktemp(stringappend(tmp_base, tmp_len, "tab.XXXXXX"));
181: ftable = tryopen(tmptabfile, "w+");
182: unlink(tmptabfile);
183:
184: /* These are opened by `done' or `open_extra_files', if at all */
185: if (spec_outfile)
186: tabfile = spec_outfile;
187: else
188: tabfile = stringappend(name_base, base_length, ".c");
189:
190: #ifdef VMS
191: attrsfile = stringappend(name_base, short_base_length, "_stype.h");
192: guardfile = stringappend(name_base, short_base_length, "_guard.c");
193: #else
194: attrsfile = stringappend(name_base, short_base_length, ".stype.h");
195: guardfile = stringappend(name_base, short_base_length, ".guard.c");
196: #endif
197: }
198:
199:
200:
201: /* open the output files needed only for the semantic parser.
202: This is done when %semantic_parser is seen in the declarations section. */
203: open_extra_files()
204: {
205: FILE *ftmp;
206: int c;
207: char *filename;
208: /* JF change open parser file */
209: fclose(fparser);
210: filename = (char *) getenv ("BISON_HAIRY");
211: fparser= tryopen(filename ? filename : PFILE1, "r");
212:
213: /* JF change from inline attrs file to separate one */
214: ftmp = tryopen(attrsfile, "w");
215: rewind(fattrs);
216: while((c=getc(fattrs))!=EOF) /* Thank god for buffering */
217: putc(c,ftmp);
218: fclose(fattrs);
219: fattrs=ftmp;
220:
221: fguard = tryopen(guardfile, "w");
222:
223: }
224:
225: /* JF to make file opening easier. This func tries to open file
226: NAME with mode MODE, and prints an error message if it fails. */
227: FILE *
228: tryopen(name, mode)
229: char *name;
230: char *mode;
231: {
232: FILE *ptr;
233:
234: ptr = fopen(name, mode);
235: if (ptr == NULL)
236: {
237: fprintf(stderr, "bison: ");
238: perror(name);
239: done(2);
240: }
241: return ptr;
242: }
243:
244: done(k)
245: int k;
246: {
247: if (faction)
248: fclose(faction);
249:
250: if (fattrs)
251: fclose(fattrs);
252:
253: if (fguard)
254: fclose(fguard);
255:
256: if (finput)
257: fclose(finput);
258:
259: if (fparser)
260: fclose(fparser);
261:
262: /* JF we don't need this anymore
263: if (fparser1)
264: fclose(fparser1); */
265:
266: if (foutput)
267: fclose(foutput);
268:
269: /* JF write out the output file */
270: if (k == 0 && ftable)
271: {
272: FILE *ftmp;
273: register int c;
274:
275: ftmp=tryopen(tabfile, "w");
276: rewind(ftable);
277: while((c=getc(ftable)) != EOF)
278: putc(c,ftmp);
279: fclose(ftmp);
280: fclose(ftable);
281: }
282:
283: #ifdef VMS
284: delete(actfile);
285: delete(tmpattrsfile);
286: delete(tmptabfile);
287: if (k==0) sys$exit(SS$_NORMAL);
288: sys$exit(SS$_ABORT);
289: #else
290: exit(k);
291: #endif
292: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.