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