2.11BSD/src/bin/adb/main.c
#include "defs.h"
MSG NOEOR;
char *myname; /* program name */
int argcount;
int mkfault;
int executing;
int infile;
char *lp;
int maxoff;
int maxpos;
int (*sigint)();
int (*sigqit)();
int wtflag;
int kernel;
long maxfile;
long maxstor;
long txtsiz;
long datsiz;
long datbas;
long stksiz;
long ovlsiz;
int overlay;
char *errflg;
int exitflg;
int magic;
long entrypt;
char lastc;
int eof;
int lastcom;
long var[36];
char *symfil;
char *corfil;
char *printptr;
char *Ipath = "/usr/share/adb";
long round(a,b)
long a, b;
{
long w;
w = ((a+b-1)/b)*b;
return(w);
}
/* error handling */
chkerr()
{
IF errflg ORF mkfault
THEN error(errflg);
FI
}
error(n)
char *n;
{
errflg=n;
iclose(0, 1); oclose();
longjmp(erradb,1);
}
fault(a)
{
signal(a,fault);
lseek(infile,0L,2);
mkfault++;
}
/* set up files and initial address mappings */
main(argc, argv)
register char **argv;
int argc;
{
short mynamelen; /* length of program name */
maxfile = 1L << 24;
maxstor = 1L << 16;
if (isatty(0))
myname = *argv;
else
myname = "adb";
mynamelen = strlen(myname);
gtty(0,&adbtty);
gtty(0,&usrtty);
WHILE argc>1
DO IF !strcmp("-w",argv[1])
THEN wtflag=2; argc--; argv++; continue;
ELIF !strcmp("-k",argv[1])
THEN kernel++; argc--; argv++; continue;
ELIF !strcmp("-I",argv[1])
THEN Ipath = argv[2]; argc -= 2; argv += 2; continue;
ELSE break;
FI
OD
IF argc>1 THEN symfil = argv[1]; FI
IF argc>2 THEN corfil = argv[2]; FI
argcount=argc;
setsym(); setcor();
/* set up variables for user */
maxoff=MAXOFF; maxpos=MAXPOS;
var[VARB] = datbas;
var[VARD] = datsiz;
var[VARE] = entrypt;
var[VARM] = magic;
var[VARS] = stksiz;
var[VART] = txtsiz;
/* if text overlay, enter total overlay area size */
IF overlay
THEN var[VARO] = ovlsiz;
FI
IF (sigint=signal(SIGINT,SIG_IGN))!=SIG_IGN
THEN sigint=fault; signal(SIGINT,fault);
FI
sigqit=signal(SIGQUIT,SIG_IGN);
siginterrupt(SIGINT, 1);
siginterrupt(SIGQUIT, 1);
setjmp(erradb);
IF executing THEN delbp(); FI
executing=FALSE;
LOOP flushbuf();
IF errflg
THEN printf("%s\n",errflg);
exitflg=(int)errflg;
errflg=0;
FI
IF mkfault
THEN mkfault=0; printc(EOR);
printf("%s\n", myname);
FI
IF myname ANDF !infile
THEN write(1,myname,mynamelen);
write(1,"> ",2);
FI
lp=0; rdc(); lp--;
IF eof
THEN IF infile
THEN iclose(-1, 0); eof=0; longjmp(erradb,1);
ELSE done();
FI
ELSE exitflg=0;
FI
command(0,lastcom);
IF lp ANDF lastc!=EOR THEN error(NOEOR); FI
POOL
}
done()
{
endpcs();
exit(exitflg);
}