|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 8177 (0x1ff1)
Types: TextFile
Names: »macro.c,v«
└─⟦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«
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;
@