func.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 431 行

C
431
字号
#ifndef lintstatic CHTYPE *sccsid = "@(#)func.c	4.1      7/17/90";#endif lint/************************************************************************ *									* *			Copyright (c) 1986 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//* * *   Modification History: * * 002 - Gary A. Gaudet, Wed Nov  9 10:24:49 EST 1988 *	 	MIPS portability and bug fixes * * 001 - Gary Gaudet for Andy Gadsby 09-mar-88 *	i18n version of csh * * * *//* * UNIX shell * * Bell Telephone Laboratories * */#include	"defs.h"freefunc(n)	struct namnod 	*n;{	freetree((struct trenod *)(n->namenv));}freetree(t)	register struct trenod *t;{	if (t)	{		register int type;		if (t->tretyp & CNTMSK)		{			t->tretyp--;			return;		}		type = t->tretyp & COMMSK;		switch (type)		{			case TFND:				free(fndptr(t)->fndnam);				freetree(fndptr(t)->fndval);				break;			case TCOM:				freeio(comptr(t)->comio);				free_arg(comptr(t)->comarg);				free_arg(comptr(t)->comset);				break;			case TFORK:				freeio(forkptr(t)->forkio);				freetree(forkptr(t)->forktre);				break;			case TPAR:				freetree(parptr(t)->partre);				break;			case TFIL:			case TLST:			case TAND:			case TORF:				freetree(lstptr(t)->lstlef);				freetree(lstptr(t)->lstrit);				break;			case TFOR:			{				struct fornod *f = (struct fornod *)t;				free(f->fornam);				freetree(f->fortre);				if (f->forlst)				{					freeio(f->forlst->comio);					free_arg(f->forlst->comarg);					free_arg(f->forlst->comset);					free(f->forlst);				}			}			break;			case TWH:			case TUN:				freetree(whptr(t)->whtre);				freetree(whptr(t)->dotre);				break;			case TIF:				freetree(ifptr(t)->iftre);				freetree(ifptr(t)->thtre);				freetree(ifptr(t)->eltre);				break;			case TSW:				free(swptr(t)->swarg);				freereg(swptr(t)->swlst);				break;		}		free(t);	}}free_arg(argp)	register struct argnod 	*argp;{	register struct argnod 	*sav;	while (argp)	{		sav = argp->argnxt;		free(argp);		argp = sav;	}}freeio(iop)	register struct ionod *iop;{	register struct ionod *sav;	while (iop)	{		if (iop->iofile & IODOC)		{#ifdef DEBUG			prs("unlinking ");			prs(iop->ioname);			newline();#endif			unlink(wtoc(iop->ioname));			if (fiotemp == iop)				fiotemp = iop->iolst;			else			{				struct ionod *fiop = fiotemp;				while (fiop->iolst != iop)					fiop = fiop->iolst;					fiop->iolst = iop->iolst;			}		}		free(iop->ioname);		free(iop->iolink);		sav = iop->ionxt;		free(iop);		iop = sav;	}}freereg(regp)	register struct regnod 	*regp;{	register struct regnod 	*sav;	while (regp)	{		free_arg(regp->regptr);		freetree(regp->regcom);		sav = regp->regnxt;		free(regp);		regp = sav;	}}prf(t)	register struct trenod	*t;{	sigchk();	if (t)	{		register int	type;		type = t->tretyp & COMMSK;		switch(type)		{			case TFND:			{				register struct fndnod *f = (struct fndnod *)t;				prs_buff(f->fndnam);				prs_buff("(){\n");				prf(f->fndval);				prs_buff("\n}");				break;			}			case TCOM:			{				prarg(comptr(t)->comset);				prarg(comptr(t)->comarg);				prio(comptr(t)->comio);				break;			}			case TFORK:				prf(forkptr(t)->forktre);				prio(forkptr(t)->forkio);				if (forkptr(t)->forktyp & FAMP)					prs_buff(" &");				break;			case TPAR:				prs_buff("( ");				prf(parptr(t)->partre);				prs_buff(" )");				break;			case TFIL:				prf(lstptr(t)->lstlef);				prs_buff(" | ");				prf(lstptr(t)->lstrit);				break;			case TLST:				prf(lstptr(t)->lstlef);				prc_buff(NL);				prf(lstptr(t)->lstrit);				break;			case TAND:				prf(lstptr(t)->lstlef);				prs_buff(" && ");				prf(lstptr(t)->lstrit);				break;			case TORF:				prf(lstptr(t)->lstlef);				prs_buff(" || ");				prf(lstptr(t)->lstrit);				break;			case TFOR:				{					register struct argnod	*arg;					register struct fornod 	*f = (struct fornod *)t;					prs_buff("for ");					prs_buff(f->fornam);					if (f->forlst)					{						arg = f->forlst->comarg;						prs_buff(" in");						while(arg != ENDARGS)						{							prc_buff(SP);							prs_buff(arg->argval);							arg = arg->argnxt;						}					}					prs_buff("\ndo\n");					prf(f->fortre);					prs_buff("\ndone");				}				break;			case TWH:			case TUN:				if (type == TWH)					prs_buff("while ");				else					prs_buff("until ");				prf(whptr(t)->whtre);				prs_buff("\ndo\n");				prf(whptr(t)->dotre);				prs_buff("\ndone");				break;			case TIF:			{				struct ifnod *f = (struct ifnod *)t;				prs_buff("if ");				prf(f->iftre);				prs_buff("\nthen\n");				prf(f->thtre);				if (f->eltre)				{					prs_buff("\nelse\n");					prf(f->eltre);				}				prs_buff("\nfi");				break;			}			case TSW:				{					register struct regnod 	*swl;					prs_buff("case ");					prs_buff(swptr(t)->swarg);					prs_buff(" in");	/* DAG -- bug fix (was missing) */					swl = swptr(t)->swlst;					while(swl)					{						struct argnod	*arg = swl->regptr;						prc_buff('\n');	/* DAG -- bug fix (was missing) */						if (arg)						{							prs_buff(arg->argval);							arg = arg->argnxt;						}						while(arg)						{							prs_buff(" | ");							prs_buff(arg->argval);							arg = arg->argnxt;						}						prs_buff(")");						prf(swl->regcom);						prs_buff(";;");						swl = swl->regnxt;					}					prs_buff("\nesac");	/* DAG -- bug fix (was missing) */				}				break;			} 		} 	sigchk();}prarg(argp)	register struct argnod	*argp;{	while (argp)	{		prs_buff(argp->argval);		prc_buff(SP);		argp=argp->argnxt;	}}prio(iop)	register struct ionod	*iop;{	register int	iof;	register CHTYPE	*ion;	while (iop)	{		iof = iop->iofile;		ion = iop->ioname;		if (ion && *ion)	/* DAG -- added safety check */		{			prn_buff(iof & IOUFD);			if (iof & IODOC)				prs_buff("<<");			else if (iof & IOMOV)			{				if (iof & IOPUT)					prs_buff(">&");				else					prs_buff("<&");			}			else if ((iof & IOPUT) == 0)				prc_buff('<');			else if (iof & IOAPP)				prs_buff(">>");			else				prc_buff('>');			prs_buff(ion);			prc_buff(SP);		}		iop = iop->ionxt;	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?