date and time created 81/05/14 15:19:47 by root
authorBill Joy <root@ucbvax.Berkeley.EDU>
Fri, 15 May 1981 06:19:47 +0000 (22:19 -0800)
committerBill Joy <root@ucbvax.Berkeley.EDU>
Fri, 15 May 1981 06:19:47 +0000 (22:19 -0800)
SCCS-vsn: old/adb/adb.vax/main.c 4.1

usr/src/old/adb/adb.vax/main.c [new file with mode: 0644]

diff --git a/usr/src/old/adb/adb.vax/main.c b/usr/src/old/adb/adb.vax/main.c
new file mode 100644 (file)
index 0000000..d52856e
--- /dev/null
@@ -0,0 +1,138 @@
+static char sccsid[] = "@(#)main.c 4.1 %G%";
+/*
+ * adb - main command loop and error/interrupt handling
+ */
+#include "defs.h"
+
+MSG            NOEOR;
+
+INT            mkfault;
+INT            executing;
+INT            infile;
+CHAR           *lp;
+L_INT          maxoff;
+L_INT          maxpos;
+ADDR           sigint;
+ADDR           sigqit;
+INT            wtflag;
+L_INT          maxfile;
+STRING         errflg;
+L_INT          exitflg;
+
+CHAR           lastc;
+INT            eof;
+
+INT            lastcom;
+
+long   maxoff = MAXOFF;
+long   maxpos = MAXPOS;
+char   *Ipath = "/usr/lib/adb";
+
+main(argc, argv)
+       register char **argv;
+       int argc;
+{
+
+       mkioptab();
+another:
+       if (argc>1) {
+               if (eqstr("-w", argv[1])) {
+                       wtflag = 2;             /* suitable for open() */
+                       argc--, argv++;
+                       goto another;
+               }
+               if (argv[1][0] == '-' && argv[1][1] == 'I') {
+                       Ipath = argv[1]+2;
+                       argc--, argv++;
+               }
+       }
+       if (argc > 1)
+               symfil = argv[1];
+       if (argc > 2)
+               corfil = argv[2];
+       xargc = argc;
+       setsym(); setcor(); setvar();
+
+       if ((sigint=signal(SIGINT,SIG_IGN)) != SIG_IGN) {
+               sigint = fault;
+               signal(SIGINT, fault);
+       }
+       sigqit = signal(SIGQUIT, SIG_IGN);
+       setexit();
+       if (executing)
+               delbp();
+       executing = 0;
+       for (;;) {
+               flushbuf();
+               if (errflg) {
+                       printf("%s\n", errflg);
+                       exitflg = errflg;
+                       errflg = 0;
+               }
+               if (mkfault) {
+                       mkfault=0;
+                       printc('\n');
+                       prints(DBNAME);
+               }
+               lp=0; rdc(); lp--;
+               if (eof) {
+                       if (infile) {
+                               iclose(-1, 0); eof=0; reset();
+                       } else
+                               done();
+               } else
+                       exitflg = 0;
+               command(0, lastcom);
+               if (lp && lastc!='\n')
+                       error(NOEOR);
+       }
+}
+
+done()
+{
+       endpcs();
+       exit(exitflg);
+}
+
+L_INT
+round(a,b)
+REG L_INT a, b;
+{
+       REG L_INT w;
+       w = (a/b)*b;
+       IF a!=w THEN w += b; FI
+       return(w);
+}
+
+/*
+ * If there has been an error or a fault, take the error.
+ */
+chkerr()
+{
+       if (errflg || mkfault)
+               error(errflg);
+}
+
+/*
+ * An error occurred; save the message for later printing,
+ * close open files, and reset to main command loop.
+ */
+error(n)
+       char *n;
+{
+       errflg = n;
+       iclose(0, 1); oclose();
+       reset();
+}
+
+/*
+ * An interrupt occurred; reset the interrupt
+ * catch, seek to the end of the current file
+ * and remember that there was a fault.
+ */
+fault(a)
+{
+       signal(a, fault);
+       lseek(infile, 0L, 2);
+       mkfault++;
+}