diff options
Diffstat (limited to 'src/macro.c')
-rw-r--r-- | src/macro.c | 437 |
1 files changed, 0 insertions, 437 deletions
diff --git a/src/macro.c b/src/macro.c deleted file mode 100644 index d45a0c7..0000000 --- a/src/macro.c +++ /dev/null @@ -1,437 +0,0 @@ -/* - * Copyright (c) 1998 Sendmail, Inc. All rights reserved. - * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - * - */ - -#ifndef lint -static char sccsid[] = "@(#)macro.c 8.26 (Berkeley) 11/8/1998"; -#endif /* not lint */ - -# include "sendmail.h" - -char *MacroName[256]; /* macro id to name table */ -int NextMacroId = 0240; /* codes for long named macros */ - - -/* -** EXPAND -- macro expand a string using $x escapes. -** -** Parameters: -** s -- the string to expand. -** buf -- the place to put the expansion. -** bufsize -- the size of the buffer. -** e -- envelope in which to work. -** -** Returns: -** none. -** -** Side Effects: -** none. -*/ - -void -expand(s, buf, bufsize, e) - register char *s; - register char *buf; - size_t bufsize; - 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; - int skiplev; /* skipping nesting level */ - int iflev; /* if nesting level */ - char xbuf[MACBUFSIZE]; - static int explevel = 0; - - if (tTd(35, 24)) - { - printf("expand("); - xputs(s); - printf(")\n"); - } - - skipping = FALSE; - skiplev = 0; - iflev = 0; - if (s == NULL) - s = ""; - for (xp = xbuf; *s != '\0'; s++) - { - int c; - - /* - ** Check for non-ordinary (special?) character. - ** 'q' will be the interpolated quantity. - */ - - q = NULL; - c = *s; - switch (c & 0377) - { - case CONDIF: /* see if var set */ - iflev++; - c = *++s; - if (skipping) - skiplev++; - else - skipping = macvalue(c, e) == NULL; - continue; - - case CONDELSE: /* change state of skipping */ - if (iflev == 0) - break; - if (skiplev == 0) - skipping = !skipping; - continue; - - case CONDFI: /* stop skipping */ - if (iflev == 0) - break; - iflev--; - if (skiplev == 0) - skipping = FALSE; - if (skipping) - skiplev--; - continue; - - case MACROEXPAND: /* macro interpolation */ - c = *++s & 0377; - if (c != '\0') - q = macvalue(c, e); - else - { - s--; - q = NULL; - } - if (q == NULL) - continue; - break; - } - - /* - ** Interpolate q or output one character - */ - - if (skipping || xp >= &xbuf[sizeof xbuf - 1]) - 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]) - { - /* check for any sendmail metacharacters */ - if ((c & 0340) == 0200) - recurse = TRUE; - *xp++ = c; - } - } - } - *xp = '\0'; - - if (tTd(35, 24)) - { - printf("expand ==> "); - xputs(xbuf); - printf("\n"); - } - - /* recurse as appropriate */ - if (recurse) - { - if (explevel < MaxMacroRecursion) - { - explevel++; - expand(xbuf, buf, bufsize, e); - explevel--; - return; - } - syserr("expand: recursion too deep (%d max)", - MaxMacroRecursion); - } - - /* copy results out */ - i = xp - xbuf; - if (i >= bufsize) - i = bufsize - 1; - 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+ -** $k UUCP node name -** $l UNIX-style from line+ -** $m The domain part of our full name. -** $n name of sendmail ("MAILER-DAEMON" on local -** net typically)+ -** $o delimiters ("operators") for address tokens+ -** (set via OperatorChars option in V6 or later -** sendmail.cf files) -** $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 -** $_ RFC1413 authenticated sender address -** -** 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. -*/ - -void -define(n, v, e) - int n; - char *v; - register ENVELOPE *e; -{ - if (tTd(35, 9)) - { - printf("%sdefine(%s as ", - (e->e_macro[n & 0377] == NULL) ? "" : "re", macname(n)); - xputs(v); - printf(")\n"); - } - e->e_macro[n & 0377] = 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) - int n; - register ENVELOPE *e; -{ - n &= 0377; - while (e != NULL) - { - register char *p = e->e_macro[n]; - - if (p != NULL) - return (p); - e = e->e_parent; - } - return (NULL); -} -/* -** MACNAME -- return the name of a macro given its internal id -** -** Parameter: -** n -- the id of the macro -** -** Returns: -** The name of n. -** -** Side Effects: -** none. -*/ - -char * -macname(n) - int n; -{ - static char mbuf[2]; - - n &= 0377; - if (bitset(0200, n)) - { - char *p = MacroName[n]; - - if (p != NULL) - return p; - return "***UNDEFINED MACRO***"; - } - mbuf[0] = n; - mbuf[1] = '\0'; - return mbuf; -} -/* -** MACID -- return id of macro identified by its name -** -** Parameters: -** p -- pointer to name string -- either a single -** character or {name}. -** ep -- filled in with the pointer to the byte -** after the name. -** -** Returns: -** The internal id code for this macro. This will -** fit into a single byte. -** -** Side Effects: -** If this is a new macro name, a new id is allocated. -*/ - -int -macid(p, ep) - register char *p; - char **ep; -{ - int mid; - register char *bp; - char mbuf[MAXMACNAMELEN + 1]; - - if (tTd(35, 14)) - { - printf("macid("); - xputs(p); - printf(") => "); - } - - if (*p == '\0' || (p[0] == '{' && p[1] == '}')) - { - syserr("Name required for macro/class"); - if (ep != NULL) - *ep = p; - if (tTd(35, 14)) - printf("NULL\n"); - return '\0'; - } - if (*p != '{') - { - /* the macro is its own code */ - if (ep != NULL) - *ep = p + 1; - if (tTd(35, 14)) - printf("%c\n", *p); - return *p; - } - bp = mbuf; - while (*++p != '\0' && *p != '}' && bp < &mbuf[sizeof mbuf - 1]) - { - if (isascii(*p) && (isalnum(*p) || *p == '_')) - *bp++ = *p; - else - syserr("Invalid macro/class character %c", *p); - } - *bp = '\0'; - mid = -1; - if (*p == '\0') - { - syserr("Unbalanced { on %s", mbuf); /* missing } */ - } - else if (*p != '}') - { - syserr("Macro/class name ({%s}) too long (%d chars max)", - mbuf, sizeof mbuf - 1); - } - else if (mbuf[1] == '\0') - { - /* ${x} == $x */ - mid = mbuf[0]; - p++; - } - else - { - register STAB *s; - - s = stab(mbuf, ST_MACRO, ST_ENTER); - if (s->s_macro != 0) - mid = s->s_macro; - else - { - if (NextMacroId > 0377) - { - syserr("Macro/class {%s}: too many long names", mbuf); - s->s_macro = -1; - } - else - { - MacroName[NextMacroId] = s->s_name; - s->s_macro = mid = NextMacroId++; - } - } - p++; - } - if (ep != NULL) - *ep = p; - if (tTd(35, 14)) - printf("0x%x\n", mid); - return mid; -} -/* -** WORDINCLASS -- tell if a word is in a specific class -** -** Parameters: -** str -- the name of the word to look up. -** cl -- the class name. -** -** Returns: -** TRUE if str can be found in cl. -** FALSE otherwise. -*/ - -bool -wordinclass(str, cl) - char *str; - int cl; -{ - register STAB *s; - - s = stab(str, ST_CLASS, ST_FIND); - return s != NULL && bitnset(cl & 0xff, s->s_class); -} |