Pristine Ack-5.5
[Ack-5.5.git] / util / grind / main.c
1 /* $Id: main.c,v 1.15 1994/06/24 11:00:19 ceriel Exp $ */
2
3 #include <stdio.h>
4 #include <signal.h>
5 #if __STDC__
6 #include <stdarg.h>
7 #else
8 #include <varargs.h>
9 #endif
10
11 #include "tokenname.h"
12 #include "position.h"
13 #include "file.h"
14 #include "symbol.h"
15 #include "scope.h"
16 #include "Lpars.h"
17 #include "type.h"
18 #include "langdep.h"
19 #include "misc.h"
20
21 static char     *usage = "Usage: %s [<ack.out>] [<a.out>]";
22 char            *progname;
23 char            *AckObj;
24 char            *AObj;
25 char            *dirs[] = { "", 0 };
26 FILE            *db_out;
27 FILE            *db_in;
28 int             debug;
29 extern struct tokenname tkidf[];
30 extern char     *strindex();
31 extern void     signal_child();
32 extern void     init_del();
33 extern void     init_run();
34 extern int      eof_seen;
35 extern int      interrupted;
36
37 static struct tokenname shorts[] = {
38         {LIST, "l"},
39         {CONT, "c"},
40         {STEP, "s"},
41         {NEXT, "n"},
42         {DELETE, "d"},
43         {PRINT, "p"},
44         {RESTORE, "r"},
45         {TRACE, "t"},
46         {WHERE, "w"},
47         { 0, 0}
48 };
49
50 main(argc, argv)
51   char  *argv[];
52 {
53   char  *p;
54
55   db_out = stdout;
56   db_in = stdin;
57   progname = argv[0];
58   init_del();
59   while (p = strindex(progname, '/')) {
60         progname = p + 1;
61   }
62   while (argv[1] && argv[1][0] == '-') {
63         switch(argv[1][1]) {
64         case 'v':
65                 debug++;
66                 break;
67         case 'i':
68                 int_size = atoi(&argv[1][2]);
69                 break;
70         case 's':
71                 short_size = atoi(&argv[1][2]);
72                 break;
73         case 'l':
74                 long_size = atoi(&argv[1][2]);
75                 break;
76         case 'f':
77                 float_size = atoi(&argv[1][2]);
78                 break;
79         case 'd':
80                 double_size = atoi(&argv[1][2]);
81                 break;
82         case 'p':
83                 pointer_size = atoi(&argv[1][2]);
84                 break;
85         default:
86                 fatal(usage, progname);
87         }
88         argv++;
89         argc--;
90   }
91   if (argc > 3) {
92         fatal(usage, progname);
93   }
94   AckObj = argv[1] ? argv[1] : "a.out";
95   if (argc == 3) AObj = argv[2];
96   init_types();
97   init_scope();
98   init_languages();
99   if (DbRead(AckObj) && AObj == 0) AObj = AckObj;
100   else if (AObj == 0) AObj = "a.out";
101   reserve(tkidf);
102   reserve(shorts);
103   init_run();
104   if (! currlang) {
105         fatal("could not determine source language. Recompile with -g?");
106   }
107   prompt();
108   Commands();
109   signal_child(SIGKILL);
110   if (eof_seen) putc('\n', db_out);
111   exit(0);
112 }
113
114 prompt()
115 {
116   if (isatty(fileno(db_in))) {
117         fprintf(db_out, "-> ");
118         fflush(db_out);
119   }
120 }
121
122 extern int errorgiven;
123
124 #if __STDC__
125 void
126 fatal(char *fmt, ...)
127 {
128   va_list ap;
129
130   va_start(ap, fmt);
131   {
132         fprintf(db_out, "%s: ", progname);
133         vfprintf(db_out, fmt, ap);
134         fprintf(db_out, "\n");
135   }
136   va_end(ap);
137   exit(1);
138 }
139
140 void
141 error(char *fmt, ...)
142 {
143   va_list ap;
144
145   if (! interrupted) {
146         va_start(ap, fmt);
147         {
148                 fprintf(db_out, "%s: ", progname);
149                 vfprintf(db_out, fmt, ap);
150                 fprintf(db_out, "\n");
151         }
152         va_end(ap);
153   }
154   errorgiven = 1;
155 }
156
157 void
158 warning(char *fmt, ...)
159 {
160   va_list ap;
161
162   va_start(ap, fmt);
163   {
164         fprintf(db_out, "%s: ", progname);
165         vfprintf(db_out, fmt, ap);
166         fprintf(db_out, "\n");
167   }
168   va_end(ap);
169 }
170
171 #else
172 /*VARARGS*/
173 void
174 fatal(va_alist)
175   va_dcl
176 {
177   va_list ap;
178   char *fmt;
179
180   va_start(ap);
181   {
182         fmt = va_arg(ap, char *);
183         fprintf(db_out, "%s: ", progname);
184         vfprintf(db_out, fmt, ap);
185         fprintf(db_out, "\n");
186   }
187   va_end(ap);
188   exit(1);
189 }
190
191 /*VARARGS*/
192 void
193 error(va_alist)
194   va_dcl
195 {
196   va_list ap;
197   char *fmt;
198
199   if (! interrupted) {
200         va_start(ap);
201         {
202                 fmt = va_arg(ap, char *);
203                 fprintf(db_out, "%s: ", progname);
204                 vfprintf(db_out, fmt, ap);
205                 fprintf(db_out, "\n");
206         }
207         va_end(ap);
208   }
209   errorgiven = 1;
210 }
211
212 /*VARARGS*/
213 void
214 warning(va_alist)
215   va_dcl
216 {
217   va_list ap;
218   char *fmt;
219
220   va_start(ap);
221   {
222         fmt = va_arg(ap, char *);
223         fprintf(db_out, "%s: ", progname);
224         vfprintf(db_out, fmt, ap);
225         fprintf(db_out, "\n");
226   }
227   va_end(ap);
228 }
229 #endif
230
231 void
232 rd_fatal()
233 {
234   fatal("read error in %s", AckObj);
235 }
236
237 void
238 No_Mem()
239 {
240   fatal("out of memory");
241 }