File:  [CSRG BSD Unix] / 43BSDReno / sys / kdb / Old / kdb_command.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:12:57 2018 UTC (8 years, 1 month ago) by root
Branches: MAIN, BSD
CVS tags: HEAD, BSD43reno
BSD 4.3reno

/*
 * Copyright (c) 1986 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 *
 *	@(#)kdb_command.c	7.3 (Berkeley) 12/15/86
 */

#include "../kdb/defs.h"

char	*BADEQ;
char	*NOMATCH;
char	*BADVAR;
char	*BADCOM;

int	executing;
char	*lp;

char	lastc;
char	eqformat[512] = "z";
char	stformat[512] = "X\"= \"^i";

long	ditto;
int	lastcom = '=';
long	locval;
long	locmsk;
long	expv;

/* command decoding */

command(buf, defcom)
	char *buf, defcom;
{
	register itype, ptype, modifier, regptr;
	int longpr, eqcom;
	char wformat[1], savc;
	register long w, savdot;
	char *savlp=lp;

	if (buf) {
		if (*buf==EOR)
			return (0);
		lp=buf;
	}

	do {
		if (adrflg=expr(0)) {
			dot=expv;
			ditto=dot;
		}
		adrval=dot;
		cntflg = (rdc() == ',' && expr(0));
		if (cntflg)
			cntval=expv;
		else
			cntval=1, lp--;
		if (eol(rdc())) {
			if (!adrflg)
				dot=inkdot(dotinc);
			lp--; lastcom=defcom;
		} else
			lastcom=lastc;
		switch (lastcom&STRIP) {

		case '/':
			itype=DSP; ptype=DSYM;
			goto trystar;

		case '=':
			itype=NSP; ptype=0;
			goto trypr;

		case '?':
			itype=ISP; ptype=ISYM;
			goto trystar;

		trystar:
			if (rdc()=='*')
				lastcom |= QUOTE;
			else
				lp--;
			if (lastcom&QUOTE) {
				itype |= STAR;
				ptype = (DSYM+ISYM)-ptype;
			}

		trypr:
			longpr=0; eqcom=lastcom=='=';
			switch (rdc()) {

			case 'L':
				longpr=1;
			case 'l':
				/*search for exp*/
				if (eqcom)
					error(BADEQ);
				dotinc=(longpr?4:2); savdot=dot;
				(void) expr(1); locval=expv;
				if (expr(0))
					locmsk=expv;
				else
					locmsk = -1L;
				if (!longpr) {
					locmsk &= 0xFFFF;
					locval &= 0xFFFF;
				}
				for (;;) {
					w=get(dot,itype);
					if (errflg || mkfault ||
					    (w&locmsk)==locval)
						break;
					 dot=inkdot(dotinc);
				}
				if (errflg) {
					dot=savdot;
					errflg=NOMATCH;
				}
				psymoff(dot,ptype,"");
				break;

			case 'W':
				longpr=1;
			case 'w':
				if (eqcom)
					error(BADEQ);
				wformat[0]=lastc; (void) expr(1);
				do {
					savdot=dot;
					psymoff(dot,ptype,":%16t");
					(void) exform(1,wformat,itype,ptype);
					errflg=0; dot=savdot;
					if (longpr)
						put(dot,itype,expv);
					else
						put(dot,itype,
						    itol(expv,get(dot,itype)));
					savdot=dot;
					printf("=%8t");
					(void) exform(1,wformat,itype,ptype);
					printc(EOR);
				} while (expr(0) && errflg==0);
				dot=savdot;
				chkerr();
				break;

			default:
				lp--;
				getformat(eqcom ? eqformat : stformat);
				if (!eqcom)
					psymoff(dot,ptype,":%16t");
				scanform(cntval,
				    (eqcom?eqformat:stformat),itype,ptype);
			}
			break;

		case '>':
			lastcom=0; savc=rdc();
			if ((regptr=getreg(savc)) != -1)
				*(int *)regptr = dot;
			else if ((modifier=varchk(savc)) != -1)
				var[modifier]=dot;
			else
				error(BADVAR);
			break;

		case '$':
			lastcom=0;
			printtrace(nextchar());
			break;

		case ':':
			if (executing)
				break;
			executing=1; subpcs(nextchar()); executing=0;
			lastcom=0;
			break;

		case '\0':
			break;

		default:
			error(BADCOM);
		}
		flushbuf();
	} while (rdc()==';');
	if (buf)
		lp=savlp;
	else
		lp--;
	return (adrflg && dot!=0);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.