1 static char sccsid[] = "@(#)main.c 4.3 04/01/82"; 2 /* 3 * adb - main command loop and error/interrupt handling 4 */ 5 #include "defs.h" 6 7 MSG NOEOR; 8 9 INT mkfault; 10 INT executing; 11 INT infile; 12 CHAR *lp; 13 L_INT maxoff; 14 L_INT maxpos; 15 ADDR sigint; 16 ADDR sigqit; 17 INT wtflag; 18 L_INT maxfile; 19 STRING errflg; 20 L_INT exitflg; 21 22 CHAR lastc; 23 INT eof; 24 25 INT lastcom; 26 27 long maxoff = MAXOFF; 28 long maxpos = MAXPOS; 29 char *Ipath = "/usr/lib/adb"; 30 31 main(argc, argv) 32 register char **argv; 33 int argc; 34 { 35 36 mkioptab(); 37 another: 38 if (argc>1) { 39 if (eqstr("-w", argv[1])) { 40 wtflag = 2; /* suitable for open() */ 41 argc--, argv++; 42 goto another; 43 } 44 if (eqstr("-k", argv[1])) { 45 kernel = 1; 46 argc--, argv++; 47 goto another; 48 } 49 if (argv[1][0] == '-' && argv[1][1] == 'I') { 50 Ipath = argv[1]+2; 51 argc--, argv++; 52 } 53 } 54 if (argc > 1) 55 symfil = argv[1]; 56 if (argc > 2) 57 corfil = argv[2]; 58 xargc = argc; 59 setsym(); setcor(); setvar(); 60 61 if ((sigint=signal(SIGINT,SIG_IGN)) != SIG_IGN) { 62 sigint = fault; 63 signal(SIGINT, fault); 64 } 65 sigqit = signal(SIGQUIT, SIG_IGN); 66 setexit(); 67 if (executing) 68 delbp(); 69 executing = 0; 70 for (;;) { 71 flushbuf(); 72 if (errflg) { 73 printf("%s\n", errflg); 74 exitflg = errflg; 75 errflg = 0; 76 } 77 if (mkfault) { 78 mkfault=0; 79 printc('\n'); 80 prints(DBNAME); 81 } 82 lp=0; rdc(); lp--; 83 if (eof) { 84 if (infile) { 85 iclose(-1, 0); eof=0; reset(); 86 } else 87 done(); 88 } else 89 exitflg = 0; 90 command(0, lastcom); 91 if (lp && lastc!='\n') 92 error(NOEOR); 93 } 94 } 95 96 done() 97 { 98 endpcs(); 99 exit(exitflg); 100 } 101 102 L_INT 103 round(a,b) 104 REG L_INT a, b; 105 { 106 REG L_INT w; 107 w = (a/b)*b; 108 IF a!=w THEN w += b; FI 109 return(w); 110 } 111 112 /* 113 * If there has been an error or a fault, take the error. 114 */ 115 chkerr() 116 { 117 if (errflg || mkfault) 118 error(errflg); 119 } 120 121 /* 122 * An error occurred; save the message for later printing, 123 * close open files, and reset to main command loop. 124 */ 125 error(n) 126 char *n; 127 { 128 errflg = n; 129 iclose(0, 1); oclose(); 130 reset(); 131 } 132 133 /* 134 * An interrupt occurred; reset the interrupt 135 * catch, seek to the end of the current file 136 * and remember that there was a fault. 137 */ 138 fault(a) 139 { 140 signal(a, fault); 141 lseek(infile, 0L, 2); 142 mkfault++; 143 } 144