xref: /original-bsd/old/sdb/main.c (revision 6b7db209)
1 static	char sccsid[] = "@(#)main.c 4.2 08/17/82";
2 #
3 /*
4  *
5  *	UNIX debugger
6  *
7  */
8 
9 #include	"head.h"
10 #include	<signal.h>
11 #include	<stdio.h>
12 #include	<sys/stat.h>
13 
14 INT		mkfault;
15 INT		executing;
16 CHAR		*lp;
17 L_INT		maxoff;
18 L_INT		maxpos;
19 ADDR		sigint;
20 ADDR		sigqit;
21 INT		wtflag;
22 L_INT		maxfile;
23 L_INT		maxstor;
24 L_INT		txtsiz;
25 L_INT		datsiz;
26 L_INT		datbas;
27 L_INT		stksiz;
28 STRING		errflg;
29 INT		magic;
30 L_INT		entrypt;
31 
32 CHAR		lastc;
33 
34 STRING		symfil;
35 STRING		corfil;
36 INT 		argcount;
37 ADDR		userpc;
38 int	fpe();
39 
40 main(argc, argv)
41 REG STRING	*argv;
42 REG INT		argc;
43 {
44 	register char *p;
45 	struct stat stbuf;
46 
47 	userpc = 1;
48 	symfil = "a.out";
49 	corfil = "core";
50 	maxfile=1L<<24; maxstor=1L<<31;
51 #ifndef STD
52 #ifndef VAX135
53 	maxstor -= ctob(UPAGES);
54 #endif
55 #endif
56 
57 	setbuf(stdout, NULL);
58 	setbuf(stderr, NULL);
59 
60 	WHILE argc>1
61 	DO	IF eqstr("-w",argv[1])
62 		THEN	wtflag=2; argc--; argv++;
63 		ELSE	break;
64 		FI
65 	OD
66 
67 	IF argc>1 THEN symfil = argv[1]; FI
68 	IF argc>2 THEN corfil = argv[2]; FI
69 	fp = filework;
70 	if (argc > 3) {
71 		for (p = argv[3]; *p; *fp++ = *p++) ;
72 		*fp++ = '/';
73 	}
74 	argcount=argc;
75 
76 	if (stat(symfil, &stbuf) == -1) {
77 		printf("`%s' does not exist\n", symfil);
78 		exit(4);
79 	}
80 	symtime = stbuf.st_mtime;
81 	if (stat(corfil, &stbuf) != -1) {
82 		if (symtime > stbuf.st_mtime)
83 			printf("Warning: `%s' newer than `%s'\n",
84 				symfil, corfil);
85 	}
86 
87 	setsym(); setcor();
88 	initfp();
89 	mkioptab();
90 
91 	/* set up variables for user */
92 	maxoff=MAXOFF; maxpos=MAXPOS;
93 	gtty(2, &sdbttym);
94 	IF (sigint= (ADDR) signal(SIGINT,01))!=01
95 	THEN	sigint= (ADDR) fault; signal(SIGINT,fault);
96 	FI
97 	sigqit= (ADDR) signal(SIGQUIT,1);
98 	signal(SIGILL, fpe);
99 
100 	setjmp(env);
101 	if (debug) printf("Sdb restarted\n");
102 	gtty(2, &userttym);
103 	if (sdbttym.sg_flags != userttym.sg_flags)
104 		stty(2, &sdbttym);
105 	IF executing THEN delbp(); FI
106 	executing=FALSE;
107 
108 	for (;;) {
109 		mkfault = 0;
110 		printf("*");
111 		if (decode(readline(stdin)) == 1) {
112 			printf("Error; try again\n");
113 			continue;
114 		}
115 
116 	if (debug) {
117 		printf("cmd %c:\n", cmd);
118 		printf("%s:%s\n", proc, var);
119 		printf("args-%s;re-%s;integ-%d\n", args, re, integ);
120 		printf("scallf-%d;reflg-%d\n", scallf, reflag);
121 		printf("colonflag-%d;ncolonflag-%d\n\n",
122 			colonflag, ncolonflag);
123  	}
124 		docommand();
125 	}
126 }
127 
128 
129 fault(a)
130 {
131 	signal(a,fault);
132 	mkfault++;
133 	printf("\n");
134 	longjmp(env, 0);
135 }
136 
137 fpe() {
138 	signal(SIGILL, fpe);
139 	error("Illegal floating constant");
140 	longjmp(env, 0);
141 }
142