V10/lsys/mkconf/readdevs.c

Compare this file to the similar file:
Show the results in this format:

/*
 * master devices file:
 *	name	tag	[stuff]
 */

#include <fio.h>
#include <libc.h>
#include <ctype.h>
#include "mkconf.h"

#define	BIGARGS	30

readdevs(f)
char *f;
{
	int fd;
	register char *p;
	char *args[BIGARGS];
	register int n;
	register Mdev *mp;
	register int i;

	if ((fd = open(f, 0)) < 0) {
		perror(f);
		exit(1);
	}
	while ((p = Frdline(fd)) != NULL) {
		while (isspace(*p))
			p++;
		if (*p == '#' || *p == 0)
			continue;
		if ((n = crack(p, args, BIGARGS)) < 2) {
			fprint(STDERR, "%s: bad line ignored: %s\n", f, p);
			errs++;
			continue;
		}
		if ((mp = (Mdev *)ealloc(sizeof(Mdev))) == NULL) {
			fprint(STDERR, "out of memory\n");
			exit(1);
		}
		mp->name = estrdup(args[0]);
		mp->tag = estrdup(args[1]);
		mp->atype = ANONE;
		mp->adptype = ANONE;
		mp->nvec = 1;
		mp->rept = 1;
		mp->flags = 0;
		for (i = 0; i < NSTR; i++) {
			mp->strs[i] = 0;
			mp->fstrs[i] = 0;
		}
		mdflags(mp, &args[2], n - 2);
		if (badmdev(mp)) {
			free((char *)mp);
			errs++;
			continue;
		}
		mp->next = mlist;
		mlist = mp;
	}
	close(fd);
}

badmdev(mp)
register Mdev *mp;
{
	/* various consistency checks here */
	return (0);
}

mdflags(mp, a, n)
register Mdev *mp;
register char **a;
register int n;
{
	register int i;

	for (; --n >= 0; a++) {
		/*
		 * address types: mine or the bus i control
		 */
		if (strcmp(*a, "sbi") == 0)
			mp->atype = ASBI;
		else if (strcmp(*a, "sbia") == 0)
			mp->adptype = ASBI;
		else if (strcmp(*a, "vaxbi") == 0)
			mp->atype = AVBI;
		else if (strcmp(*a, "vaxbia") == 0)
			mp->adptype = AVBI;
		else if (strcmp(*a, "mb") == 0)
			mp->atype = AMBA;
		else if (strcmp(*a, "mba") == 0)
			mp->adptype = AMBA;
		else if (strcmp(*a, "ub") == 0)
			mp->atype = AUBA;
		else if (strcmp(*a, "uba") == 0)
			mp->adptype = AUBA;
		else if (strcmp(*a, "sub") == 0)
			mp->atype = ASUB;
		else if (strcmp(*a, "count") == 0)
			mp->atype = ACNT;
		else if (strcmp(*a, "param") == 0)
			mp->atype = APARAM;
		else if (strcmp(*a, "mscp") == 0)
			mp->atype = AMSCP;
		else if (strcmp(*a, "mscpa") == 0)
			mp->adptype = AMSCP;
		else if (strcmp(*a, "nobus") == 0)
			mp->atype = ANOBUS;
		/*
		 * hacks
		 */
		else if (strcmp(*a, "vec") == 0) {
			if (--n < 0) {
				fprint(STDERR, "%s: vec what?\n", mp->name);
				errs++;
				continue;
			}
			mp->nvec = atoi(*++a);
		} else if (strcmp(*a, "rep") == 0) {
			if (--n < 0) {
				fprint(STDERR, "%s: rep what?\n", mp->name);
				errs++;
				continue;
			}
			mp->rept = atoi(*++a);
		} else if (strcmp(*a, "dupok") == 0)
			mp->flags |= FDUPOK;
		else if (strcmp(*a, "rawvec") == 0)
			mp->flags |= FRAWVEC;
		/*
		 * structures, includes
		 */
		else if (strcmp(*a, "data") == 0) {
			i = mddata(mp, a, n);
			a += i;
			n -= i;
		} else if (strcmp(*a, "inc") == 0) {
			i = mdincl(mp, a, n);
			a += i;
			n -= i;
		} else {
			fprint(STDERR, "%s: unknown arg %s\n", mp->name, *a);
			errs++;
		}
	}
}

int
mddata(mp, a, n)
register Mdev *mp;
register char **a;
int n;
{
	register int i;
	char buf[80];
	register char *p, *q;
	register int xn;
	int c;

	i = 0;
	xn = n - 1;
	++a;		/* skip "data" */
	while (xn >= 0) {
		q = buf;
		do {
			p = *a++;
			while ((*q++ = *p++) != 0)
				;
			q[-1] = ' ';
		} while (--xn >= 0 && q[-2] != ';' && q[-2] != ',');
		*--q = 0;	/* smash last blank */
		c = q[-1];
		if (c == ';' || c == ',')
			*--q = 0;
		if (i < NSTR-1)
			mp->strs[i++] = estrdup(buf);
		else {
			fprint(STDERR, "%s: too much data\n", mp->name);
			errs++;
		}
		if (c == ';')
			break;
	}
	return (n - xn - 1);
}

Include *inclist;

int
mdincl(mp, a, n)
Mdev *mp;
register char **a;
int n;
{
	register int xn;
	register Include *ip, *jp;
	register char *p;
	Include *bjp;
	char *s;
	int last;

	xn = n;
	a++;		/* skip "inc" */
	last = 0;
	while (last == 0 && --xn >= 0) {
		s = *a++;
		for (p = s; *p; p++)
			;
		if (*--p == ';') {
			*p = 0;
			last = 1;
		}
		bjp = NULL;
		for (jp = inclist; jp; bjp = jp, jp = jp->next)
			if (strcmp(jp->incl, s) == 0)
				break;
		ip = (Include *)ealloc(sizeof(Include));
		ip->inuse = 0;
		ip->dev = mp;
		if (jp)
			ip->incl = jp->incl;
		else
			ip->incl = estrdup(s);
		if (bjp) {
			ip->next = bjp->next;
			bjp->next = ip;
		}
		else {
			ip->next = inclist;
			inclist = ip;
		}
	}
	return (n - xn);
}

incfix(dp)
Dev *dp;
{
	register Mdev *mp;
	register Include *ip;

	mp = dp->mdev;
	for (ip = inclist; ip; ip = ip->next)
		if (ip->dev == mp)
			ip->inuse = 1;
}