|
|
researchv10 Norman
/*
* 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;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.