|
|
1.1 root 1: extern long times_ndx;
2: static char *sccs = "@(#)main.c 2.11";
3: static char *vsbCopyright = "CDB Copyright c 1983 by Third Eye Software";
4: #include <signal.h>
5: #include <setjmp.h>
6: #include <stdio.h>
7: #define SYSTYPES 1
8: #include "cdb.h"
9:
10: export int *venv; /* This may not be portable - it SHOULD be, but ... */
11: export char **venvpParent;
12: jmp_buf venvFixer; /* for error recovery */
13: extern FILE *vfpPlayback;
14:
15: void Fixer();
16:
17: /* M A I N */
18:
19: export void main(argc, argv, envp)
20: int argc;
21: char *argv[];
22: char *envp[];
23: {
24: int cMainArgs, i;
25: FLAGT fUsedArg;
26: char *sbArg, *sbT, *sbUsage, *sbPlayback, *sbRecord;
27:
28: venv = venvFixer;
29: if (setjmp(venvFixer)) {
30: /* in case we hit an error during initialization */
31: printf("Cannot continue\n");
32: exit(1);
33: } /* if */
34:
35: venvpParent = envp;
36: sbPlayback = sbNil;
37: sbRecord = sbNil;
38: switch (**argv) {
39: default:
40: case 'c':
41: vlc = lcC;
42: break;
43: case 'p':
44: vlc = lcPascal;
45: break;
46: case 'f':
47: vlc = lcFortran;
48: break;
49: } /* switch */
50: #ifdef BSD41
51: vcbSbCache = 0; /* unless set, this causes total read of strings */
52: #endif
53: vilvMax = 26; /* `local' variables */
54: vibpMax = 16; /* break points */
55: viadMax = 16; /* assertions */
56:
57: vsbSymfile = "a.out";
58: vsbCorefile = sbNil;
59: sbUsage =
60: "Usage is `cdb [-d dir] [-r file] [-p file] [-a#] [-b#] [-s#] [objfile [corfile]]\n";
61:
62:
63: cMainArgs = 0;
64: for (i=1; i<argc; ++i) {
65: if (*(sbArg=argv[i]) != '-') {
66: switch (cMainArgs) {
67: case 0:
68: vsbSymfile = sbArg;
69: break;
70: case 1:
71: vsbCorefile = sbArg;
72: break;
73: default:
74: printf(sbUsage);
75: exit(1);
76: } /* switch */
77: cMainArgs++;
78: }
79: else {
80: sbArg++; /* move past the '-' */
81: /* point to a potential argument */
82: sbT = (sbArg[1] != chNull) ? sbArg+1 : argv[i+1];
83: fUsedArg = true; /* set FALSE if option does NOT use arg */
84: switch (*sbArg) {
85: default:
86: printf(sbUsage);
87: exit(1);
88: case 'a': /* assertions */
89: viadMax = atoi(sbT);
90: break;
91: case 'b': /* breakpoints */
92: /* we use up one for temp stuff */
93: vibpMax = 1 + atoi(sbT);
94: break;
95: case 'd': /* alternate directory */
96: AddDir(sbT);
97: break;
98: case 'p': /* playback file */
99: sbPlayback = sbT;
100: break;
101: case 'r': /* record file */
102: sbRecord = sbT;
103: break;
104: case 's': /* special variables */
105: vilvMax = atoi(sbT);
106: break;
107: case 'S': /* string space */
108: #ifdef BSD41
109: vcbSbCache = atoi(sbT);
110: #else
111: printf("The -S option is only meaningful on BSD 4.X systems\n");
112: fUsedArg = false;
113: exit(1);
114: #endif
115: break;
116: } /* switch */
117: if ((fUsedArg) AND (sbArg[1] == chNull))
118: i++; /* eat next word - it was the arg we used */
119: } /* if */
120: } /* for */
121:
122: InitAll(); /* calls all of the initialization routines */
123:
124: if (setjmp(venvFixer) == 0) {
125: if (sbRecord != sbNil)
126: SetRecord(sbRecord);
127: if (sbPlayback != sbNil)
128: SetPlayback(sbPlayback, false);
129: if (vfnCore != fnNil) {
130: FDoCommand("L", true); /* put them at error location */
131: }
132: else {
133: if (vfPascal) {
134: FDoCommand("e program", true); /* first line to execute */
135: }
136: else {
137: FDoCommand("e main", true); /* first line to execute */
138: }
139: }
140: } /* if */
141:
142: vivarMac = 0; /* stack pointers might be trashed by error (see expr.c) */
143: viopMac = 0;
144: vcNest = 0; /* nesting level for printing structure indents */
145:
146: InitSignals(); /* don't dump on the customers! */
147:
148: DebugIt(true);
149: } /* main */
150:
151:
152: /* D E B U G I T */
153:
154: local void DebugIt(fTopLevel)
155: FLAGT fTopLevel;
156: {
157: int i, cnt;
158: FLAGT fRet;
159: #define cbCmdMax 200
160: char sbCmd[cbCmdMax];
161:
162: fRet = true;
163: while (fRet) {
164: cnt = 1;
165: NextCmd(sbCmd, cbCmdMax, ">");
166: if (*sbCmd == chNull) {
167: printf("\010"); /* backspace gets rid of prompt character */
168: cnt = 10;
169: sbCmd[0] = '~';
170: sbCmd[1] = chNull;
171: } /* if */
172: for (i=0; i < cnt AND fRet; i++) {
173: RecordCmd(sbCmd);
174: fRet = FDoCommand(sbCmd, fTopLevel);
175: } /* for */
176: } /* while */
177: } /* DebugIt */
178:
179:
180: /* O O P S */
181:
182: export void Oops(sig)
183: int sig;
184: {
185: printf("Sorry, Cdb has encountered a \"");
186: PrintSig(sig);
187: UError("\" error, try a different command");
188: } /* Oops */
189:
190:
191: /* I N I T S I G N A L S */
192:
193: local void InitSignals()
194: {
195: signal(SIGINT, Fixer);
196: signal(SIGILL, Oops);
197: signal(SIGFPE, Oops);
198: signal(SIGBUS, Oops);
199: signal(SIGSEGV, Oops);
200: signal(SIGSYS, Oops);
201: signal(SIGPIPE, Oops);
202: } /* InitSignals */
203:
204:
205: /* F I X E R */
206:
207: export void Fixer()
208: {
209: printf("\ncdb\n");
210: if ((vfpPlayback != NULL)
211: AND (vcStepPlayback == 0))
212: vcStepPlayback = 1; /* gives them a chance to regain control */
213: longjmp(venv, 1);
214: } /* Fixer */
215:
216:
217: /* P A N I C */
218:
219: /* VARARGS1 */
220: export void Panic(msg, arg1, arg2, arg3, arg4)
221: char *msg;
222: int arg1, arg2, arg3, arg4;
223: {
224: int err;
225:
226: err = errno;
227: printf("panic - ");
228: if (msg) {
229: printf(msg, arg1, arg2, arg3, arg4);
230: } /* if */
231: if (err != 0) {
232: printf("\nerrno may not be meaningful\n");
233: errno = err;
234: perror("cdb");
235: } /* if */
236: longjmp(venv, 1);
237: } /* Panic */
238:
239:
240: /* U E R R O R */
241:
242: /* VARARGS1 */
243: export void UError(msg, arg1, arg2, arg3, arg4)
244: char *msg;
245: int arg1, arg2, arg3, arg4;
246: {
247: if (msg) {
248: printf(msg, arg1, arg2, arg3, arg4);
249: }
250: else {
251: printf("error");
252: } /* if */
253: printf("\n");
254: longjmp(venv, 1);
255: } /* UError */
256:
257:
258: /* The following routines exist in System III, but not BSD41 */
259:
260: /* s t r c h r */
261:
262: export char * strchr(sb, ch)
263: char *sb, ch;
264: {
265: /* find first instance of ch in sb, return nil if not found */
266: while (*sb != chNull AND *sb != ch)
267: sb++;
268: return((*sb == chNull) ? sbNil : sb);
269: } /* strchr */
270:
271:
272: /* s t r r c h r */
273:
274: export char * strrchr(sb, ch)
275: char *sb, ch;
276: {
277: char *sbBack;
278:
279: sbBack = sb + strlen(sb);
280: while (*sbBack != ch AND sbBack != sb)
281: sbBack--;
282: return((*sbBack == ch) ? sbBack : sbNil);
283: } /* strrchr */
284:
285:
286: /* s t r c s p n */
287:
288: export int strcspn(sbSpan, sbNot)
289: char *sbSpan, *sbNot;
290: {
291: int cSpan;
292: char *sbSave;
293:
294: /* return count of chars from start of sbSpan that do NOT occur in sbNot */
295: cSpan = 0;
296: sbSave = sbNot;
297: while (*sbSpan != chNull) {
298: while (*sbNot != chNull) {
299: if (*sbNot == *sbSpan)
300: return(cSpan);
301: sbNot++;
302: } /* while */
303: sbSpan++;
304: cSpan++;
305: sbNot = sbSave;
306: } /* while */
307: return(cSpan);
308: } /* strcspn */
309:
310: #ifdef REGULUS
311: /* i s x d i g i t */
312:
313: int isxdigit(ch)
314: char ch;
315: {
316: return( (ch >= '0' AND ch <= '9')
317: OR (ch >= 'a' AND ch <= 'f')
318: OR (ch >= 'A' AND ch <= 'F'));
319: } /* isxdigit */
320:
321:
322: /* a b s */
323:
324: int abs(x)
325: int x;
326: {
327: return((x < 0) ? -x : x);
328: } /* abs */
329: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.