DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦1279a1214⟧ TextFile

    Length: 8177 (0x1ff1)
    Types: TextFile
    Names: »macro.c,v«

Derivation

└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦bfebc70e2⟧ »EurOpenD3/mail/sendmail-5.65b+IDA-1.4.3.tar.Z« 
        └─⟦f9e35cd84⟧ 
            └─⟦this⟧ »sendmail/src/RCS/macro.c,v« 

TextFile

head	5.7;
branch	5.7.0;
access;
symbols
	UICSO:5.7.0
	VANILLA:5.7;
locks; strict;
comment	@ * @;


5.7
date	90.06.20.08.35.57;	author paul;	state Exp;
branches
	5.7.0.1;
next	;

5.7.0.1
date	90.06.20.09.43.04;	author paul;	state Exp;
branches;
next	5.7.0.2;

5.7.0.2
date	90.10.13.18.40.00;	author paul;	state Exp;
branches;
next	5.7.0.3;

5.7.0.3
date	91.02.17.02.39.09;	author paul;	state Exp;
branches;
next	5.7.0.4;

5.7.0.4
date	91.03.04.21.48.23;	author paul;	state Exp;
branches;
next	;


desc
@@



5.7
log
@5.64 Berkeley release
@
text
@/*
 * Copyright (c) 1983 Eric P. Allman
 * Copyright (c) 1988 Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted provided
 * that: (1) source distributions retain this entire copyright notice and
 * comment, and (2) distributions including binaries display the following
 * acknowledgement:  ``This product includes software developed by the
 * University of California, Berkeley and its contributors'' in the
 * documentation or other materials provided with the distribution and in
 * all advertising materials mentioning features or use of this software.
 * Neither the name of the University nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

#ifndef lint
static char sccsid[] = "@@(#)macro.c	5.7 (Berkeley) 6/1/90";
#endif /* not lint */

# 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();

	if (tTd(35, 24))
	{
		printf("expand(");
		xputs(s);
		printf(")\n");
	}

	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';

	if (tTd(35, 24))
	{
		printf("expand ==> ");
		xputs(xbuf);
		printf("\n");
	}

	/* 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';
}
\f

/*
**  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;
{
	if (tTd(35, 9))
	{
		printf("define(%c as ", n);
		xputs(v);
		printf(")\n");
	}
	e->e_macro[n & 0177] = v;
}
\f

/*
**  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);
}
@


5.7.0.1
log
@IDA patches
@
text
@a53 1
	bool quote, inquote, inescape;
a77 1
		quote = FALSE;
a93 3
		  case QUOTE822:
			quote = TRUE;
			/*FALLTHROUGH*/
a98 2
			if (quote && !mustquote(q))
				quote = FALSE;
a107 2
		inquote = FALSE;
		inescape = FALSE;
a116 12
				if (quote) {
					if (!inquote) {
						*xp++ = '"';
						inquote = TRUE;
					}
					if (c == '"' && !inescape)
						*xp++ = '\\';
					if (c == '\\')
						inescape = !inescape;
					else
						inescape = FALSE;
				}
a118 4
			if (inescape && xp < &xbuf[sizeof xbuf - 1])
				*xp++ = '\\';
			if (quote && xp < &xbuf[sizeof xbuf - 1])
				*xp++ = '"';
a176 1
**		$k   our UUCP host name, if different from $w
a239 3
		if (p == MACNULL)
			/* shadowing null */
			return (NULL);
a244 31
}
\f

/*
**  MUSTQUOTE -- Check if string contains special RFC-822 chars.
**
**	Parameters:
**		s -- the string to be checked.
**
**	Returns:
**		TRUE if string is in need to be quoted, FALSE otherwise.
**
**	Side Effects:
**		none.
**
**	Does this string contain any characters that RFC 822 says
**	must be quoted?
**	This is not strictly correct, since we consider ' ' non-special.
**	Otherwise we'd quote "My Name", which is just too ugly.
*/
mustquote(s)
	register char *s;
{
	register int c;
	extern char *index();

	while (c = *s++) {
		c &= 0177;
		if (c <= 037 || c == 0177 || 		/* CTLs */
		    index(".()<>@@,;:\\\"[]", c) != NULL)/* 822 specials */
			return TRUE;
	}
	return FALSE;
@


5.7.0.2
log
@Deleted declaration of *index() (breaks when index is a #define strchr)
from Bruce Lilly.  Fixed fencepost error in the third expand() argument.
@
text
@d113 1
a113 1
		if (skipping || xp >= &xbuf[(sizeof(xbuf)-1)])
d296 1
@


5.7.0.3
log
@Added static bool declaration to mustquote().
@
text
@a57 1
	static bool mustquote();
a291 1
static bool
@


5.7.0.4
log
@ANSIfied.
@
text
@a26 6
#ifdef __STDC__
static bool mustquote(const char *);
#else /* !__STDC__ */
static bool mustquote();
#endif /* __STDC__ */

a43 1
void
d45 1
a45 1
	const char *s;
d47 1
a47 1
	const char *buflim;
d57 2
a230 1
void
d295 1
a295 1
	register const char *s;
@