V10/cmd/vsw/switch.c

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

#include	<libc.h>
#include	<fio.h>
#include	"crossbar.h"
#include	"switch.h"

extern int verbose;

Switch::Switch(char *nam, int n)
{
	int i;

	name = nam;
	nwires = n;
	maxlines = 0;
	for(i = 0; i < MAXLABEL; i++)
		lines[i][0] = lines[i][1] = 0;
}

void
Switch::add(int inout, char label, char *n1, char *n2, Crossbar *c, int l)
{
	int n = labeltoint(label);

	if(n > maxlines)
		maxlines = n;
	if(lines[n][inout])
		fprint(2, "warning: redefining label %s.%c\n", name, label);
	lines[n][inout] = new Line(label, n1, n2, c, l);
}

void
Switch::reinit()
{
}

void
Switch::describe()
{
	int imax, omax, n, i;
	char bi[256], bo[256];

	if(verbose)
		Fprint(1, "%s video switch:\n", name);
	imax = 6, omax = 7;	/* inputs/outputs */
	for(i = 0; i <= maxlines; i++){
		n = lines[i][0]->pr(i, bi, 0);
		if(n > imax) imax = n;
		n = lines[i][1]->pr(i, bi, 0);
		if(n > omax) omax = n;
	}
	blank(1, n = (imax-6)/2);
	Fprint(1, "inputs");
	blank(1, imax+3+(omax-7)/2-n-6);
	Fprint(1, "outputs\n");
	for(i = 0; i <= maxlines; i++){
		lines[i][0]->pr(i, bi, imax+3);
		lines[i][1]->pr(i, bo, 0);
		Fprint(1, "%s%s\n", bi, bo);
	}
}

void
Switch::pr(char opt)
{
	int i, j, l[50], k;
	Crossbar *c[50];
	Line *lp, *ll;
	char buf[256];
	int didit;

	if(!verbose)
		Fprint(1, "-%c", opt);
	for(i = 0; i <= maxlines; i++)
		if(ll = lines[i][0]){
			if(k = ll->c->map(ll->line, c, l)){
				didit = 0;
				for(j = 0; c[j]; j++)
					if((k = lineofcl(1, c[j], l[j])) >= 0){
						if(didit == 0){
							if(verbose)
								Fprint(1, "%s[i%c] ==>", ll->name[0], ll->label);
							didit = 1;
						}
						lp = lines[k][1];
						if(verbose)
							Fprint(1, " %s[o%c]", lp->name[0], lp->label);
						else
							Fprint(1, " %c%c", lines[i][1]->label, lp->label);
					}
				if(didit && verbose)
					Fprint(1, "\n");
			}
		}
	if(!verbose)
		Fprint(1, "\n");
}

void
Switch::connect(char input, char output)
{
	int i, o;
	Line *lp;

	i = labeltoint(input);
	o = labeltoint(output);
	lp = lines[i][0];
	lp->c->connect(lp->line, lines[o][1]->c, lines[o][1]->line, nwires);
}

int
Switch::lineofcl(int output, Crossbar *c, int l)
{
	int i;
	register Line *lp;

	for(i = 0; i <= maxlines; i++){
		lp = lines[i][output];
		if((lp->c == c) && (lp->line == l))
			return(i);
	}
	return(-1);
}

int
labeltoint(char label)
{
	if((label >= '0') && (label <= '9'))
		return(label-'0');
	if((label >= 'a') && (label <= 'z'))
		return((label-'a')+10);
	fprint(2, "bad arg to labeltoint '%c'\n", label);
	abort();
	return(0);
}

char
inttolabel(int i)
{
	if((i >= 0) && (i < MAXLABEL))
		return("0123456789abcdefghijklmnopqrstuvwxyz"[i]);
	fprint(2, "bad arg to inttolabel %d\n", i);
	abort();
	return(0);
}

void
blank(int fd, int n)
{
	while(n-- > 0)
		Fputc(fd, ' ');
}

#include	<sys/filio.h>
#include	<sys/ttyio.h>
#include	<sysent.h>
#include	<ipc.h>

int
opendk(char *name)
{
	int rfs;
	char buf[256];
	struct sgttyb vvec;
	extern int tty_ld, buf_ld;

	sprint(buf, "/cs/dk!%s", name);
	rfs = ipcopen(buf, "light");
	if(rfs < 0){
		perror(buf);
		exit(1);
	}
	ioctl(rfs, FIOPUSHLD, &buf_ld);
	if(ioctl(rfs, FIOLOOKLD, 0) != tty_ld){
		if(ioctl(rfs, FIOPUSHLD, &tty_ld) < 0){
			perror("tty_ld");
			exit(1);
		}
	}
	vvec.sg_flags = RAW;
	vvec.sg_erase = 0;
	vvec.sg_kill = 0;
	if(ioctl(rfs, TIOCSETP, &vvec) < 0){
		perror("ioctl");
		exit(1);
	}
	return(rfs);
}