1*7775Srrh static char sccsid[] = "@(#)main.c 4.2 08/17/82";
21337Sbill #
31337Sbill /*
41337Sbill *
51337Sbill * UNIX debugger
61337Sbill *
71337Sbill */
81337Sbill
91337Sbill #include "head.h"
101337Sbill #include <signal.h>
111337Sbill #include <stdio.h>
121337Sbill #include <sys/stat.h>
131337Sbill
141337Sbill INT mkfault;
151337Sbill INT executing;
161337Sbill CHAR *lp;
171337Sbill L_INT maxoff;
181337Sbill L_INT maxpos;
191337Sbill ADDR sigint;
201337Sbill ADDR sigqit;
211337Sbill INT wtflag;
221337Sbill L_INT maxfile;
231337Sbill L_INT maxstor;
241337Sbill L_INT txtsiz;
251337Sbill L_INT datsiz;
261337Sbill L_INT datbas;
271337Sbill L_INT stksiz;
281337Sbill STRING errflg;
291337Sbill INT magic;
301337Sbill L_INT entrypt;
311337Sbill
321337Sbill CHAR lastc;
331337Sbill
341337Sbill STRING symfil;
351337Sbill STRING corfil;
361337Sbill INT argcount;
371337Sbill ADDR userpc;
381337Sbill int fpe();
391337Sbill
main(argc,argv)401337Sbill main(argc, argv)
411337Sbill REG STRING *argv;
421337Sbill REG INT argc;
431337Sbill {
441337Sbill register char *p;
451337Sbill struct stat stbuf;
461337Sbill
471337Sbill userpc = 1;
481337Sbill symfil = "a.out";
491337Sbill corfil = "core";
501337Sbill maxfile=1L<<24; maxstor=1L<<31;
511337Sbill #ifndef STD
521337Sbill #ifndef VAX135
531337Sbill maxstor -= ctob(UPAGES);
541337Sbill #endif
551337Sbill #endif
561337Sbill
571337Sbill setbuf(stdout, NULL);
581337Sbill setbuf(stderr, NULL);
591337Sbill
601337Sbill WHILE argc>1
611337Sbill DO IF eqstr("-w",argv[1])
621337Sbill THEN wtflag=2; argc--; argv++;
631337Sbill ELSE break;
641337Sbill FI
651337Sbill OD
661337Sbill
671337Sbill IF argc>1 THEN symfil = argv[1]; FI
681337Sbill IF argc>2 THEN corfil = argv[2]; FI
691337Sbill fp = filework;
701337Sbill if (argc > 3) {
711337Sbill for (p = argv[3]; *p; *fp++ = *p++) ;
721337Sbill *fp++ = '/';
731337Sbill }
741337Sbill argcount=argc;
751337Sbill
761337Sbill if (stat(symfil, &stbuf) == -1) {
771337Sbill printf("`%s' does not exist\n", symfil);
781337Sbill exit(4);
791337Sbill }
801337Sbill symtime = stbuf.st_mtime;
811337Sbill if (stat(corfil, &stbuf) != -1) {
821337Sbill if (symtime > stbuf.st_mtime)
831337Sbill printf("Warning: `%s' newer than `%s'\n",
841337Sbill symfil, corfil);
851337Sbill }
861337Sbill
871337Sbill setsym(); setcor();
881337Sbill initfp();
891337Sbill mkioptab();
901337Sbill
911337Sbill /* set up variables for user */
921337Sbill maxoff=MAXOFF; maxpos=MAXPOS;
931337Sbill gtty(2, &sdbttym);
941337Sbill IF (sigint= (ADDR) signal(SIGINT,01))!=01
951337Sbill THEN sigint= (ADDR) fault; signal(SIGINT,fault);
961337Sbill FI
971337Sbill sigqit= (ADDR) signal(SIGQUIT,1);
981337Sbill signal(SIGILL, fpe);
991337Sbill
1001337Sbill setjmp(env);
1011337Sbill if (debug) printf("Sdb restarted\n");
1021337Sbill gtty(2, &userttym);
1031337Sbill if (sdbttym.sg_flags != userttym.sg_flags)
1041337Sbill stty(2, &sdbttym);
1051337Sbill IF executing THEN delbp(); FI
1061337Sbill executing=FALSE;
1071337Sbill
1081337Sbill for (;;) {
1091337Sbill mkfault = 0;
1101337Sbill printf("*");
1111337Sbill if (decode(readline(stdin)) == 1) {
1121337Sbill printf("Error; try again\n");
1131337Sbill continue;
1141337Sbill }
1151337Sbill
1161337Sbill if (debug) {
1171337Sbill printf("cmd %c:\n", cmd);
1181337Sbill printf("%s:%s\n", proc, var);
1191337Sbill printf("args-%s;re-%s;integ-%d\n", args, re, integ);
1201337Sbill printf("scallf-%d;reflg-%d\n", scallf, reflag);
1211337Sbill printf("colonflag-%d;ncolonflag-%d\n\n",
1221337Sbill colonflag, ncolonflag);
1231337Sbill }
1241337Sbill docommand();
1251337Sbill }
1261337Sbill }
1271337Sbill
1281337Sbill
fault(a)1291337Sbill fault(a)
1301337Sbill {
1311337Sbill signal(a,fault);
1321337Sbill mkfault++;
1331337Sbill printf("\n");
1341337Sbill longjmp(env, 0);
1351337Sbill }
1361337Sbill
fpe()1371337Sbill fpe() {
1381337Sbill signal(SIGILL, fpe);
1391337Sbill error("Illegal floating constant");
1401337Sbill longjmp(env, 0);
1411337Sbill }
142