1 /*
2  * SOFTWARE RIGHTS
3  *
4  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
5  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
6  * company may do whatever they wish with source code distributed with
7  * PCCTS or the code generated by PCCTS, including the incorporation of
8  * PCCTS, or its output, into commerical software.
9  *
10  * We encourage users to develop software with PCCTS.  However, we do ask
11  * that credit is given to us for developing PCCTS.  By "credit",
12  * we mean that if you incorporate our source code into one of your
13  * programs (commercial product, research project, or otherwise) that you
14  * acknowledge this fact somewhere in the documentation, research report,
15  * etc...  If you like PCCTS and have developed a nice tool with the
16  * output, please mention that you developed it using PCCTS.  In
17  * addition, we ask that this header remain intact in our source code.
18  * As long as these guidelines are kept, we expect to continue enhancing
19  * this system and expect to make other tools available as they are
20  * completed.
21  *
22  * DLG 1.33
23  * Will Cohen
24  * With mods by Terence Parr; AHPCRC, University of Minnesota
25  * 1989-2001
26  */
27 
28 #include <stdio.h>
29 #include <string.h>
30 #include "dlg.h"
31 #ifdef MEMCHK
32 #include "trax.h"
33 #else
34 #ifdef __STDC__
35 #include <stdlib.h>
36 #else
37 #include <malloc.h>
38 #endif /* __STDC__ */
39 #endif
40 
41 int	err_found = 0;			/* indicates whether problem found */
42 
43 #ifdef __USE_PROTOS
internal_error(char * s,char * file,int line)44 void internal_error(char *s, char *file,int line)    /* MR9 23-Sep-97 */
45 #else
46 void internal_error(s,file,line)    /* MR9 23-Sep-97 */
47 char *s,*file;
48 int line;
49 #endif
50 {
51 	fprintf(stderr,s,file,line);
52 	exit(PCCTS_EXIT_FAILURE);
53 }
54 
55 #ifdef __USE_PROTOS
dlg_malloc(int bytes,char * file,int line)56 char *dlg_malloc(int bytes,char *file,int line)
57 #else
58 char *dlg_malloc(bytes,file,line)
59 int bytes;
60 char *file;
61 int line;
62 #endif
63 {
64 	char *t;
65 
66 	t = (char *) malloc(bytes);
67 	if (!t){
68 		/* error */
69 		internal_error("%s(%d): unable to allocate memory\n",
70 			file,line);
71 	}
72 	return t;
73 }
74 
75 
76 #ifdef __USE_PROTOS
dlg_calloc(int n,int bytes,char * file,int line)77 char *dlg_calloc(int n,int bytes,char *file,int line)
78 #else
79 char *dlg_calloc(n,bytes,file,line)
80 int n,bytes;
81 char *file;
82 int line;
83 #endif
84 {
85 	char *t;
86 
87 	t = (char *) calloc(n,bytes);
88 	if (!t){
89 		/* error */
90 		internal_error("%s(%d): unable to allocate memory\n",
91 			file,line);
92 	}
93 	return t;
94 }
95 
96 
97 #ifdef __USE_PROTOS
read_stream(char * name)98 FILE *read_stream(char *name)
99 #else
100 FILE *read_stream(name)
101 char *name;
102 #endif
103 {
104 	FILE *f;
105 
106 	if (name){
107 		if (name[0] == '-') {
108 			fprintf(stderr, "dlg: invalid option: '%s'\n", name);
109 			f = NULL;
110 		}else{
111 			f = fopen(name, "r");
112 			if (f == NULL){
113 				/* couldn't open file */
114 				fprintf(stderr,
115 					"dlg: Warning: Can't read file %s.\n",
116 					name);
117 			}
118 		}
119 	}else{
120 		/* open stdin if nothing there */
121 		f = stdin;
122 	}
123 	return f;
124 }
125 
126 #ifdef __USE_PROTOS
write_stream(char * name)127 FILE *write_stream(char *name)
128 #else
129 FILE *write_stream(name)
130 char *name;
131 #endif
132 {
133 	FILE *f;
134 
135 	if (name){
136 		if (name[0] == '-') {
137 			fprintf(stderr, "dlg: invalid option: '%s'\n", name);
138 			f = NULL;
139 		}else{
140 			f = fopen(OutMetaName(name), "w");
141 			if (f == NULL){
142 				/* couldn't open file */
143 				fprintf(stderr,
144 					"dlg: Warning: Can't write to file %s.\n",
145 					name);
146 			}
147 			else
148 #ifdef SPECIAL_FOPEN
149                 special_fopen_actions(OutMetaName(name));	/* MR1 */
150 #else
151 		;						/* MR1 */
152 #endif
153 		}
154 	}else{
155 		/* open stdout if nothing there */
156 		f = stdout;
157 	}
158 	return f;
159 }
160 
161 
162 #ifdef __USE_PROTOS
fatal(char * message,int line_no)163 void fatal(char *message,int line_no)
164 #else
165 void fatal(message,line_no)
166 char *message;
167 int line_no;
168 #endif
169 {
170 	fprintf(stderr,ErrHdr,
171 		(file_str[0] ? file_str[0] : "stdin"), line_no);
172 	fprintf(stderr, " Fatal: %s\n", message);
173 	exit(PCCTS_EXIT_FAILURE);
174 }
175 
176 #ifdef __USE_PROTOS
error(char * message,int line_no)177 void error(char *message,int line_no)
178 #else
179 void error(message,line_no)
180 char *message;
181 int line_no;
182 #endif
183 {
184 	fprintf(stderr,ErrHdr,
185 		(file_str[0] ? file_str[0] : "stdin"), line_no);
186 	fprintf(stderr, " Error: %s\n", message);
187 	err_found = 1;
188 }
189 
190 #ifdef __USE_PROTOS
warning(char * message,int line_no)191 void warning(char *message,int line_no)
192 #else
193 void warning(message,line_no)
194 char *message;
195 int line_no;
196 #endif
197 {
198 	fprintf(stderr,ErrHdr,
199 		(file_str[0] ? file_str[0] : "stdin"), line_no);
200 	fprintf(stderr, " Warning: %s\n", message);
201 }
202 
203 /* MR10: Jeff Vincent
204    MR10: Changed to remove directory information from n only if
205    MR10: if OutputDirectory was changed by user (-o option)
206 */
207 
208 #ifdef __USE_PROTOS
OutMetaName(char * n)209 char *OutMetaName(char *n)
210 #else
211 char *OutMetaName(n)
212 char *n;
213 #endif
214 {
215     static char *dir_sym = DirectorySymbol;
216     static char newname[MaxFileName+1];
217     char *p;
218 
219 	/* If OutputDirectory is same as TopDirectory (platform default) then leave n alone. */
220     if (strcmp(OutputDirectory, TopDirectory) == 0)
221 		return n;
222 
223 	/* p will point to filename without path information */
224 	if ((p = strrchr(n, *dir_sym)) != NULL)
225 		p++;
226 	else
227 		p = n;
228 
229 	/* Copy new output directory into newname[] */
230 	strcpy(newname, OutputDirectory);
231 
232 	/* if new output directory does not have trailing dir_sym, add it! */
233 	if (newname[strlen(newname)-1] != *dir_sym)
234 		strcat(newname, dir_sym);
235 
236 	/* contatenate FILE NAME ONLY to new output directory */
237 	strcat(newname, p);
238 
239 	return newname;
240 }
241