macro.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 260 行
C
260 行
#ifndef lintstatic 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);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?