Blame


1 84114f06 2004-04-19 devnull /*
2 84114f06 2004-04-19 devnull * db - main command loop and error/interrupt handling
3 84114f06 2004-04-19 devnull */
4 84114f06 2004-04-19 devnull #include "defs.h"
5 84114f06 2004-04-19 devnull #include "fns.h"
6 84114f06 2004-04-19 devnull
7 84114f06 2004-04-19 devnull int wtflag = OREAD;
8 84114f06 2004-04-19 devnull BOOL kflag;
9 84114f06 2004-04-19 devnull
10 84114f06 2004-04-19 devnull BOOL mkfault;
11 84114f06 2004-04-19 devnull ADDR maxoff;
12 84114f06 2004-04-19 devnull
13 84114f06 2004-04-19 devnull int xargc; /* bullshit */
14 84114f06 2004-04-19 devnull
15 84114f06 2004-04-19 devnull extern BOOL executing;
16 84114f06 2004-04-19 devnull extern int infile;
17 84114f06 2004-04-19 devnull int exitflg;
18 84114f06 2004-04-19 devnull extern int eof;
19 84114f06 2004-04-19 devnull
20 84114f06 2004-04-19 devnull int alldigs(char*);
21 84114f06 2004-04-19 devnull void fault(void*, char*);
22 84114f06 2004-04-19 devnull
23 84114f06 2004-04-19 devnull extern char *Ipath;
24 84114f06 2004-04-19 devnull jmp_buf env;
25 84114f06 2004-04-19 devnull static char *errmsg;
26 84114f06 2004-04-19 devnull
27 84114f06 2004-04-19 devnull void
28 84114f06 2004-04-19 devnull usage(void)
29 84114f06 2004-04-19 devnull {
30 84114f06 2004-04-19 devnull fprint(2, "usage: db [-kw] [-m machine] [-I dir] [symfile] [pid]\n");
31 84114f06 2004-04-19 devnull exits("usage");
32 84114f06 2004-04-19 devnull }
33 84114f06 2004-04-19 devnull
34 84114f06 2004-04-19 devnull void
35 84114f06 2004-04-19 devnull main(int argc, char **argv)
36 84114f06 2004-04-19 devnull {
37 c6ff2c76 2005-01-24 devnull int omode;
38 c6ff2c76 2005-01-24 devnull volatile int quiet;
39 84114f06 2004-04-19 devnull char *s;
40 84114f06 2004-04-19 devnull char *name;
41 84114f06 2004-04-19 devnull
42 b030a6c3 2005-01-23 devnull quiet = 0;
43 84114f06 2004-04-19 devnull name = 0;
44 84114f06 2004-04-19 devnull outputinit();
45 84114f06 2004-04-19 devnull maxoff = MAXOFF;
46 84114f06 2004-04-19 devnull omode = OREAD;
47 84114f06 2004-04-19 devnull ARGBEGIN{
48 84114f06 2004-04-19 devnull default:
49 84114f06 2004-04-19 devnull usage();
50 84114f06 2004-04-19 devnull case 'A':
51 84114f06 2004-04-19 devnull abort();
52 84114f06 2004-04-19 devnull case 'k':
53 84114f06 2004-04-19 devnull kflag = 1;
54 84114f06 2004-04-19 devnull break;
55 84114f06 2004-04-19 devnull case 'w':
56 84114f06 2004-04-19 devnull omode = ORDWR;
57 84114f06 2004-04-19 devnull break;
58 84114f06 2004-04-19 devnull case 'I':
59 84114f06 2004-04-19 devnull s = ARGF();
60 84114f06 2004-04-19 devnull if(s == 0)
61 84114f06 2004-04-19 devnull dprint("missing -I argument\n");
62 84114f06 2004-04-19 devnull else
63 84114f06 2004-04-19 devnull Ipath = s;
64 84114f06 2004-04-19 devnull break;
65 84114f06 2004-04-19 devnull case 'm':
66 84114f06 2004-04-19 devnull name = ARGF();
67 84114f06 2004-04-19 devnull if(name == 0)
68 84114f06 2004-04-19 devnull dprint("missing -m argument\n");
69 84114f06 2004-04-19 devnull break;
70 b030a6c3 2005-01-23 devnull case 'q':
71 b030a6c3 2005-01-23 devnull quiet = 1;
72 b030a6c3 2005-01-23 devnull break;
73 84114f06 2004-04-19 devnull }ARGEND
74 84114f06 2004-04-19 devnull
75 b030a6c3 2005-01-23 devnull attachargs(argc, argv, omode, !quiet);
76 84114f06 2004-04-19 devnull
77 84114f06 2004-04-19 devnull dotmap = dumbmap(-1);
78 84114f06 2004-04-19 devnull
79 84114f06 2004-04-19 devnull /*
80 84114f06 2004-04-19 devnull * show initial state and drop into the execution loop.
81 84114f06 2004-04-19 devnull */
82 84114f06 2004-04-19 devnull notify(fault);
83 84114f06 2004-04-19 devnull setsym();
84 84114f06 2004-04-19 devnull if(setjmp(env) == 0){
85 84114f06 2004-04-19 devnull if (pid || corhdr)
86 84114f06 2004-04-19 devnull setcor(); /* could get error */
87 b030a6c3 2005-01-23 devnull if (correg && !quiet) {
88 84114f06 2004-04-19 devnull dprint("%s\n", mach->exc(cormap, correg));
89 84114f06 2004-04-19 devnull printpc();
90 84114f06 2004-04-19 devnull }
91 84114f06 2004-04-19 devnull }
92 84114f06 2004-04-19 devnull
93 84114f06 2004-04-19 devnull setjmp(env);
94 84114f06 2004-04-19 devnull if (executing)
95 84114f06 2004-04-19 devnull delbp();
96 84114f06 2004-04-19 devnull executing = FALSE;
97 84114f06 2004-04-19 devnull for (;;) {
98 84114f06 2004-04-19 devnull flushbuf();
99 84114f06 2004-04-19 devnull if (errmsg) {
100 84114f06 2004-04-19 devnull dprint(errmsg);
101 84114f06 2004-04-19 devnull printc('\n');
102 84114f06 2004-04-19 devnull errmsg = 0;
103 84114f06 2004-04-19 devnull exitflg = 0;
104 84114f06 2004-04-19 devnull }
105 84114f06 2004-04-19 devnull if (mkfault) {
106 84114f06 2004-04-19 devnull mkfault=0;
107 84114f06 2004-04-19 devnull printc('\n');
108 84114f06 2004-04-19 devnull prints(DBNAME);
109 84114f06 2004-04-19 devnull }
110 84114f06 2004-04-19 devnull clrinp();
111 84114f06 2004-04-19 devnull rdc();
112 84114f06 2004-04-19 devnull reread();
113 84114f06 2004-04-19 devnull if (eof) {
114 84114f06 2004-04-19 devnull if (infile == STDIN)
115 84114f06 2004-04-19 devnull done();
116 84114f06 2004-04-19 devnull iclose(-1, 0);
117 84114f06 2004-04-19 devnull eof = 0;
118 84114f06 2004-04-19 devnull longjmp(env, 1);
119 84114f06 2004-04-19 devnull }
120 84114f06 2004-04-19 devnull exitflg = 0;
121 84114f06 2004-04-19 devnull command(0, 0);
122 84114f06 2004-04-19 devnull reread();
123 84114f06 2004-04-19 devnull if (rdc() != '\n')
124 84114f06 2004-04-19 devnull error("newline expected");
125 84114f06 2004-04-19 devnull }
126 84114f06 2004-04-19 devnull }
127 84114f06 2004-04-19 devnull
128 84114f06 2004-04-19 devnull int
129 84114f06 2004-04-19 devnull alldigs(char *s)
130 84114f06 2004-04-19 devnull {
131 84114f06 2004-04-19 devnull while(*s){
132 84114f06 2004-04-19 devnull if(*s<'0' || '9'<*s)
133 84114f06 2004-04-19 devnull return 0;
134 84114f06 2004-04-19 devnull s++;
135 84114f06 2004-04-19 devnull }
136 84114f06 2004-04-19 devnull return 1;
137 84114f06 2004-04-19 devnull }
138 84114f06 2004-04-19 devnull
139 84114f06 2004-04-19 devnull void
140 84114f06 2004-04-19 devnull done(void)
141 84114f06 2004-04-19 devnull {
142 84114f06 2004-04-19 devnull if (pid)
143 84114f06 2004-04-19 devnull endpcs();
144 84114f06 2004-04-19 devnull exits(exitflg? "error": 0);
145 84114f06 2004-04-19 devnull }
146 84114f06 2004-04-19 devnull
147 84114f06 2004-04-19 devnull /*
148 84114f06 2004-04-19 devnull * An error occurred; save the message for later printing,
149 84114f06 2004-04-19 devnull * close open files, and reset to main command loop.
150 84114f06 2004-04-19 devnull */
151 84114f06 2004-04-19 devnull void
152 84114f06 2004-04-19 devnull error(char *n)
153 84114f06 2004-04-19 devnull {
154 84114f06 2004-04-19 devnull errmsg = n;
155 84114f06 2004-04-19 devnull iclose(0, 1);
156 84114f06 2004-04-19 devnull oclose();
157 84114f06 2004-04-19 devnull flush();
158 84114f06 2004-04-19 devnull delbp();
159 84114f06 2004-04-19 devnull ending = 0;
160 84114f06 2004-04-19 devnull longjmp(env, 1);
161 84114f06 2004-04-19 devnull }
162 84114f06 2004-04-19 devnull
163 84114f06 2004-04-19 devnull void
164 84114f06 2004-04-19 devnull errors(char *m, char *n)
165 84114f06 2004-04-19 devnull {
166 84114f06 2004-04-19 devnull static char buf[128];
167 84114f06 2004-04-19 devnull
168 84114f06 2004-04-19 devnull sprint(buf, "%s: %s", m, n);
169 84114f06 2004-04-19 devnull error(buf);
170 84114f06 2004-04-19 devnull }
171 84114f06 2004-04-19 devnull
172 84114f06 2004-04-19 devnull /*
173 84114f06 2004-04-19 devnull * An interrupt occurred;
174 84114f06 2004-04-19 devnull * seek to the end of the current file
175 84114f06 2004-04-19 devnull * and remember that there was a fault.
176 84114f06 2004-04-19 devnull */
177 84114f06 2004-04-19 devnull void
178 84114f06 2004-04-19 devnull fault(void *a, char *s)
179 84114f06 2004-04-19 devnull {
180 84114f06 2004-04-19 devnull USED(a);
181 84114f06 2004-04-19 devnull if(strncmp(s, "interrupt", 9) == 0){
182 84114f06 2004-04-19 devnull seek(infile, 0L, 2);
183 84114f06 2004-04-19 devnull mkfault++;
184 84114f06 2004-04-19 devnull noted(NCONT);
185 84114f06 2004-04-19 devnull }
186 84114f06 2004-04-19 devnull noted(NDFLT);
187 84114f06 2004-04-19 devnull }