1BSD/ashell/sh_sem.c

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

#include "sh.h"

execute(t, pf1, pf2)
	int *t, *pf1, *pf2;
{
	int i, f, pv[2];
	register *t1;
	char *cp1, *cp2;
	char *scp;

	if (t == 0)
		return;
	switch(t[DTYP]) {
		case TCOM:
			i = 100;
			do
				if (func(t))
					return;
			while (--i && alias(&t[DCOM]));
			if (i == 0) {
				bferr2(t[DCOM], ": Alias loop detected");
				return;
			}
		case TPAR:
			t1 = t;
			f = t1[DFLG];
			i = 0;
			if ((f&FPAR) == 0)
				i = fork();
			if (i == -1) {
				err("No more processes");
				return;
			}
			if (i != 0) {
				if ((f&FPIN) != 0) {
					close(pf1[0]);
					close(pf1[1]);
				}
				if ((f&FPRS) != 0) {
					prn(i);
					prs("\n");
					set(pcs, putn(i));
				}
				if ((f&FAND) != 0)
					return;
				if ((f&FPOU) == 0)
					pwait(i);
				return;
			}
			set(prompt,"");
			unsetv(prompt);
			if ((cp1 = t1[DLEF]) != 0) {
				close(0);
				cp1 = globone(cp1);
				if (cp1 == 0)
					exit(1);
				strip(cp1);
				if (open(cp1, 0) < 0) {
					prs(cp1);
					err(": Cannot open");
					exit(1);
				}
			}
			if ((cp2 = t1[DRIT]) != 0) {
				while (*cp2)
					*cp2++ =& 0177;
				strip(cp2);
				cp2 = t1[DRIT];
				close(1);
				if ((f&FCAT) != 0 && open(cp2, 1) >= 0)
					seek(1, 0, 2);
				else if (creat(cp2, 0644) < 0) {
					prs(t1[DRIT]);
					err(": Cannot create");
					exit(1);
				}
			}
			if ((f&FPIN) != 0) {
				close(0);
				dup(pf1[0]);
				close(pf1[0]);
				close(pf1[1]);
			}
			if ((f&FPOU) != 0) {
				close(1);
				dup(pf2[1]);
				close(pf2[0]);
				close(pf2[1]);
			}
			if (f&FDIAG) {
				close(2);
				dup(1);
			}
			if ((f&FINT)!=0 && t1[DLEF]==0 && (f&FPIN)==0) {
				close(0);
				open("/dev/null", 0);
			}
			if ((f&FINT) == 0 && setintr) {
				signal(INTR, 0);
				signal(QUIT, 0);
			}
			if (t1[DTYP] == TPAR) {
				if (t1 = t1[DSPR])
					t1[DFLG] =| f&FINT;
				execute(t1);
				exit(1);
			}
			doexec(t1);
			/* no return */
		case TFIL:
			f = t[DFLG];
			pipe(pv);
			t1 = t[DLEF];
			t1[DFLG] =| FPOU | (f&(FPIN|FINT|FPRS|FDIAG));
			execute(t1, pf1, pv);
			t1 = t[DRIT];
			t1[DFLG] =| FPIN | (f&(FPOU|FINT|FAND|FPRS));
			execute(t1, pv, pf2);
			return;
		case TLST:
			f = t[DFLG]&FINT;
			if (t1 = t[DLEF])
				t1[DFLG] =| f;
			execute(t1);
			if (t1 = t[DRIT])
				t1[DFLG] =| f;
			execute(t1);
			return;
	}
}

strip(cp)
	register char *cp;
{

	while (*cp++ =& 0177)
		continue;
}