1*3778Sroot static char sccsid[] = "@(#)main.c 4.2 05/15/81"; 23758Sroot /* 33758Sroot * adb - main command loop and error/interrupt handling 43758Sroot */ 53758Sroot #include "defs.h" 63758Sroot 73758Sroot MSG NOEOR; 83758Sroot 93758Sroot INT mkfault; 103758Sroot INT executing; 113758Sroot INT infile; 123758Sroot CHAR *lp; 133758Sroot L_INT maxoff; 143758Sroot L_INT maxpos; 153758Sroot ADDR sigint; 163758Sroot ADDR sigqit; 173758Sroot INT wtflag; 183758Sroot L_INT maxfile; 193758Sroot STRING errflg; 203758Sroot L_INT exitflg; 213758Sroot 223758Sroot CHAR lastc; 233758Sroot INT eof; 243758Sroot 253758Sroot INT lastcom; 263758Sroot 273758Sroot long maxoff = MAXOFF; 283758Sroot long maxpos = MAXPOS; 293758Sroot char *Ipath = "/usr/lib/adb"; 303758Sroot 313758Sroot main(argc, argv) 323758Sroot register char **argv; 333758Sroot int argc; 343758Sroot { 353758Sroot 363758Sroot mkioptab(); 373758Sroot another: 383758Sroot if (argc>1) { 393758Sroot if (eqstr("-w", argv[1])) { 403758Sroot wtflag = 2; /* suitable for open() */ 413758Sroot argc--, argv++; 423758Sroot goto another; 433758Sroot } 44*3778Sroot if (eqstr("-k", argv[1])) { 45*3778Sroot kernel = 1; 46*3778Sroot argc--, argv++; 47*3778Sroot goto another; 48*3778Sroot } 493758Sroot if (argv[1][0] == '-' && argv[1][1] == 'I') { 503758Sroot Ipath = argv[1]+2; 513758Sroot argc--, argv++; 523758Sroot } 533758Sroot } 543758Sroot if (argc > 1) 553758Sroot symfil = argv[1]; 563758Sroot if (argc > 2) 573758Sroot corfil = argv[2]; 583758Sroot xargc = argc; 593758Sroot setsym(); setcor(); setvar(); 603758Sroot 613758Sroot if ((sigint=signal(SIGINT,SIG_IGN)) != SIG_IGN) { 623758Sroot sigint = fault; 633758Sroot signal(SIGINT, fault); 643758Sroot } 653758Sroot sigqit = signal(SIGQUIT, SIG_IGN); 663758Sroot setexit(); 673758Sroot if (executing) 683758Sroot delbp(); 693758Sroot executing = 0; 703758Sroot for (;;) { 713758Sroot flushbuf(); 723758Sroot if (errflg) { 733758Sroot printf("%s\n", errflg); 743758Sroot exitflg = errflg; 753758Sroot errflg = 0; 763758Sroot } 773758Sroot if (mkfault) { 783758Sroot mkfault=0; 793758Sroot printc('\n'); 803758Sroot prints(DBNAME); 813758Sroot } 823758Sroot lp=0; rdc(); lp--; 833758Sroot if (eof) { 843758Sroot if (infile) { 853758Sroot iclose(-1, 0); eof=0; reset(); 863758Sroot } else 873758Sroot done(); 883758Sroot } else 893758Sroot exitflg = 0; 903758Sroot command(0, lastcom); 913758Sroot if (lp && lastc!='\n') 923758Sroot error(NOEOR); 933758Sroot } 943758Sroot } 953758Sroot 963758Sroot done() 973758Sroot { 983758Sroot endpcs(); 993758Sroot exit(exitflg); 1003758Sroot } 1013758Sroot 1023758Sroot L_INT 1033758Sroot round(a,b) 1043758Sroot REG L_INT a, b; 1053758Sroot { 1063758Sroot REG L_INT w; 1073758Sroot w = (a/b)*b; 1083758Sroot IF a!=w THEN w += b; FI 1093758Sroot return(w); 1103758Sroot } 1113758Sroot 1123758Sroot /* 1133758Sroot * If there has been an error or a fault, take the error. 1143758Sroot */ 1153758Sroot chkerr() 1163758Sroot { 1173758Sroot if (errflg || mkfault) 1183758Sroot error(errflg); 1193758Sroot } 1203758Sroot 1213758Sroot /* 1223758Sroot * An error occurred; save the message for later printing, 1233758Sroot * close open files, and reset to main command loop. 1243758Sroot */ 1253758Sroot error(n) 1263758Sroot char *n; 1273758Sroot { 1283758Sroot errflg = n; 1293758Sroot iclose(0, 1); oclose(); 1303758Sroot reset(); 1313758Sroot } 1323758Sroot 1333758Sroot /* 1343758Sroot * An interrupt occurred; reset the interrupt 1353758Sroot * catch, seek to the end of the current file 1363758Sroot * and remember that there was a fault. 1373758Sroot */ 1383758Sroot fault(a) 1393758Sroot { 1403758Sroot signal(a, fault); 1413758Sroot lseek(infile, 0L, 2); 1423758Sroot mkfault++; 1433758Sroot } 144