AUSAM/source/S/cdb3.c

#
/*

	C debugger - variable group handlers

*/

#include <param.h>
#include <user.h>
#include "cdb.h"


gcom(grp)
{
	register struct grpmem *gp1,*gp2;

	if (grp>9 || grp<0) {
		errflg++;
		return;
	}
	while (*lp==' ' || *lp=='\t')
		lp++;
	if (*lp=='\n') {
		dalloc(group[grp].memptr);
		group[grp].memptr = NULL;
		return;
	}
	gp1 = gp2 = NULL;
	recur++;
	while (expr()) {
		if (gp1==NULL)
			gp1 = gp2 = alloc(sizeof membr);
		else {
			gp1->link = alloc(sizeof membr);
			gp1 = gp1->link;
		}
		if (is_auto) {
			gp1->adr = pokeval;
			gp1->offset = symval;
			gp1->fcnnam = fcnstr;
			gp1->fcnnam =- 11;
			gp1->varnam = symptr;
			gp1->varnam =- 12;
		} else
			gp1->offset = gp1->adr = tdot;
		if (*lp=='/') {
			lp++;
			gp1->mode = *lp++;
		} else
			gp1->mode = 'o';
		gp1->mode =| (symflg<<8);
		gp1->link = NULL;
		if (*lp==',')
			lp++;
		is_auto = 0;
	}
	recur = 0;
	if (*lp!='\n' || errflg) {
		errflg++;
		dalloc(gp2);
		return;
	}

	dalloc(group[grp].memptr);
	group[grp].memptr = gp2;
}

grprnt(grp)
{
	extern lastype,lastcom;
	register struct grpmem *ptr;

	printf("\n");
	modifier = 0;
	ptr = group[grp].memptr;
	while (ptr != NULL) {
		symflg = ptr->mode>>8;
		lastype = ptr->mode&0377;
		if (ptr->adr == ptr->offset) {
			dot = ptr->adr;
			psymoff(dot,010000);
			printf("/%c\t",lastype);
		} else {
			printf("%s:%s/%c\t",ptr->fcnnam,ptr->varnam,lastype);
			symval = ptr->offset;
			if (localsym(ptr->adr))
				dot = ssymval;
			else {
				printf("???\n");
				ptr = ptr->link;
				continue;
			}
		}
		switch (lastype) {

		case '!':
		case 'o':
		case 'i':
		case 'd':
		case 'f':
			lastcom = '/';
			break;

		default:
			lastcom = lastype;
		}
		scommand(1);
		ptr = ptr->link;
	}
	printf("\n");
}

dalloc(p)
{
	register struct grpmem *p1,*p2;

	p1 = p;
	if (p1 == NULL)
		return;
	do {
		p2 = p1->link;
		free(p1);
		p1 = p2;
	} while (p2 != NULL);
}