Digital的Unix操作系统VAX 4.2源码

源代码在线查看: macro.c

软件大小: 51179 K
上传用户: zhuying0000
关键词: Digital Unix 4.2 VAX
下载地址: 免注册下载 普通下载 VIP

相关代码

				#ifndef lint				static	char	*sccsid = "@(#)macro.c	4.1	(ULTRIX)	7/2/90";				#endif lint								/************************************************************************				 *									*				 *			Copyright (c) 1987 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.	*				 *									*				 ************************************************************************/								# include "sendmail.h"								/*				**  EXPAND -- macro expand a string using $x escapes.				**				**	Parameters:				**		s -- the string to expand.				**		buf -- the place to put the expansion.				**		buflim -- the buffer limit, i.e., the address				**			of the last usable position in buf.				**		e -- envelope in which to work.				**				**	Returns:				**		none.				**				**	Side Effects:				**		none.				*/								expand(s, buf, buflim, e)					register char *s;					register char *buf;					char *buflim;					register ENVELOPE *e;				{					register char *xp;					register char *q;					bool skipping;		/* set if conditionally skipping output */					bool recurse = FALSE;	/* set if recursion required */					int i;					char xbuf[BUFSIZ];					extern char *macvalue();								# ifdef DEBUG					if (tTd(35, 24))					{						printf("expand(");						xputs(s);						printf(")\n");					}				# endif DEBUG									skipping = FALSE;					if (s == NULL)						s = "";					for (xp = xbuf; *s != '\0'; s++)					{						char c;										/*						**  Check for non-ordinary (special?) character.						**	'q' will be the interpolated quantity.						*/										q = NULL;						c = *s;						switch (c)						{						  case CONDIF:		/* see if var set */							c = *++s;							skipping = macvalue(c, e) == NULL;							continue;										  case CONDELSE:	/* change state of skipping */							skipping = !skipping;							continue;										  case CONDFI:		/* stop skipping */							skipping = FALSE;							continue;										  case '\001':		/* macro interpolation */							c = *++s;							q = macvalue(c & 0177, e);							if (q == NULL)								continue;							break;						}										/*						**  Interpolate q or output one character						*/										if (skipping || xp >= &xbuf[sizeof xbuf])							continue;						if (q == NULL)							*xp++ = c;						else						{							/* copy to end of q or max space remaining in buf */							while ((c = *q++) != '\0' && xp < &xbuf[sizeof xbuf - 1])							{								if (iscntrl(c) && !isspace(c))									recurse = TRUE;								*xp++ = c;							}						}					}					*xp = '\0';								# ifdef DEBUG					if (tTd(35, 24))					{						printf("expand ==> ");						xputs(xbuf);						printf("\n");					}				# endif DEBUG									/* recurse as appropriate */					if (recurse)					{						expand(xbuf, buf, buflim, e);						return;					}									/* copy results out */					i = buflim - buf - 1;					if (i > xp - xbuf)						i = xp - xbuf;					bcopy(xbuf, buf, i);					buf[i] = '\0';				}				/*				**  DEFINE -- define a macro.				**				**	this would be better done using a #define macro.				**				**	Parameters:				**		n -- the macro name.				**		v -- the macro value.				**		e -- the envelope to store the definition in.				**				**	Returns:				**		none.				**				**	Side Effects:				**		e->e_macro[n] is defined.				**				**	Notes:				**		There is one macro for each ASCII character,				**		although they are not all used.  The currently				**		defined macros are:				**				**		$a   date in ARPANET format (preferring the Date: line				**		     of the message)				**		$b   the current date (as opposed to the date as found				**		     the message) in ARPANET format				**		$c   hop count				**		$d   (current) date in UNIX (ctime) format				**		$e   the SMTP entry message+				**		$f   raw from address				**		$g   translated from address				**		$h   to host				**		$i   queue id				**		$j   official SMTP hostname, used in messages+				**		$l   UNIX-style from line+				**		$n   name of sendmail ("MAILER-DAEMON" on local				**		     net typically)+				**		$o   delimiters ("operators") for address tokens+				**		$p   my process id in decimal				**		$q   the string that becomes an address -- this is				**		     normally used to combine $g & $x.				**		$r   protocol used to talk to sender				**		$s   sender's host name				**		$t   the current time in seconds since 1/1/1970				**		$u   to user				**		$v   version number of sendmail				**		$w   our host name (if it can be determined)				**		$x   signature (full name) of from person				**		$y   the tty id of our terminal				**		$z   home directory of to person				**				**		Macros marked with + must be defined in the				**		configuration file and are used internally, but				**		are not set.				**				**		There are also some macros that can be used				**		arbitrarily to make the configuration file				**		cleaner.  In general all upper-case letters				**		are available.				*/								define(n, v, e)					char n;					char *v;					register ENVELOPE *e;				{				# ifdef DEBUG					if (tTd(35, 9))					{						printf("define(%c as ", n);						xputs(v);						printf(")\n");					}				# endif DEBUG					e->e_macro[n & 0177] = v;				}				/*				**  MACVALUE -- return uninterpreted value of a macro.				**				**	Parameters:				**		n -- the name of the macro.				**				**	Returns:				**		The value of n.				**				**	Side Effects:				**		none.				*/								char *				macvalue(n, e)					char n;					register ENVELOPE *e;				{					n &= 0177;					while (e != NULL)					{						register char *p = e->e_macro[n];										if (p != NULL)							return (p);						e = e->e_parent;					}					return (NULL);				}							

相关资源