/*
- * mf.c -- mail filter subroutines
- *
- * This code is Copyright (c) 2002, by the authors of nmh. See the
- * COPYRIGHT file in the root directory of the nmh distribution for
- * complete copyright information.
- */
+** mf.c -- mail filter subroutines
+**
+** This code is Copyright (c) 2002, by the authors of nmh. See the
+** COPYRIGHT file in the root directory of the nmh distribution for
+** complete copyright information.
+*/
#include <h/mf.h>
#include <ctype.h>
#include <h/utils.h>
/*
- * static prototypes
- */
-static char *getcpy (char *);
-static int isat (char *);
-static int parse_address (void);
-static int phrase (char *);
-static int route_addr (char *);
-static int local_part (char *);
-static int domain (char *);
-static int route (char *);
-static int my_lex (char *);
+** static prototypes
+*/
+static char *getcpy(char *);
+static int isat(char *);
+static int parse_address(void);
+static int phrase(char *);
+static int route_addr(char *);
+static int local_part(char *);
+static int domain(char *);
+static int route(char *);
+static int my_lex(char *);
static char *
-getcpy (char *s)
+getcpy(char *s)
{
register char *p;
if (!s) {
/*
- * causes compiles to blow up because the symbol _cleanup
- * is undefined where did this ever come from?
- */
+ ** causes compiles to blow up because the symbol _cleanup
+ ** is undefined where did this ever come from?
+ */
/* _cleanup(); */
abort();
for(;;)
pause();
}
- p = mh_xmalloc ((size_t) (strlen (s) + 2));
- strcpy (p, s);
+ p = mh_xmalloc((size_t) (strlen(s) + 2));
+ strcpy(p, s);
return p;
}
static int
-isat (char *p)
+isat(char *p)
{
- return (strncmp (p, " AT ", 4)
- && strncmp (p, " At ", 4)
- && strncmp (p, " aT ", 4)
- && strncmp (p, " at ", 4) ? FALSE : TRUE);
+ return (strncmp(p, " AT ", 4)
+ && strncmp(p, " At ", 4)
+ && strncmp(p, " aT ", 4)
+ && strncmp(p, " at ", 4) ? FALSE : TRUE);
}
/*
- *
- * getadrx() implements a partial 822-style address parser. The parser
- * is neither complete nor correct. It does however recognize nearly all
- * of the 822 address syntax. In addition it handles the majority of the
- * 733 syntax as well. Most problems arise from trying to accomodate both.
- *
- * In terms of 822, the route-specification in
- *
- * "<" [route] local-part "@" domain ">"
- *
- * is parsed and returned unchanged. Multiple at-signs are compressed
- * via source-routing. Recursive groups are not allowed as per the
- * standard.
- *
- * In terms of 733, " at " is recognized as equivalent to "@".
- *
- * In terms of both the parser will not complain about missing hosts.
- *
- * -----
- *
- * We should not allow addresses like
- *
- * Marshall T. Rose <MRose@UCI>
- *
- * but should insist on
- *
- * "Marshall T. Rose" <MRose@UCI>
- *
- * Unfortunately, a lot of mailers stupidly let people get away with this.
- *
- * -----
- *
- * We should not allow addresses like
- *
- * <MRose@UCI>
- *
- * but should insist on
- *
- * MRose@UCI
- *
- * Unfortunately, a lot of mailers stupidly let people's UAs get away with
- * this.
- *
- * -----
- *
- * We should not allow addresses like
- *
- * @UCI:MRose@UCI-750a
- *
- * but should insist on
- *
- * Marshall Rose <@UCI:MRose@UCI-750a>
- *
- * Unfortunately, a lot of mailers stupidly do this.
- *
- */
+**
+** getadrx() implements a partial 822-style address parser. The parser
+** is neither complete nor correct. It does however recognize nearly all
+** of the 822 address syntax. In addition it handles the majority of the
+** 733 syntax as well. Most problems arise from trying to accomodate both.
+**
+** In terms of 822, the route-specification in
+**
+** "<" [route] local-part "@" domain ">"
+**
+** is parsed and returned unchanged. Multiple at-signs are compressed
+** via source-routing. Recursive groups are not allowed as per the
+** standard.
+**
+** In terms of 733, " at " is recognized as equivalent to "@".
+**
+** In terms of both the parser will not complain about missing hosts.
+**
+** -----
+**
+** We should not allow addresses like
+**
+** Marshall T. Rose <MRose@UCI>
+**
+** but should insist on
+**
+** "Marshall T. Rose" <MRose@UCI>
+**
+** Unfortunately, a lot of mailers stupidly let people get away with this.
+**
+** -----
+**
+** We should not allow addresses like
+**
+** <MRose@UCI>
+**
+** but should insist on
+**
+** MRose@UCI
+**
+** Unfortunately, a lot of mailers stupidly let people's UAs get away with
+** this.
+**
+** -----
+**
+** We should not allow addresses like
+**
+** @UCI:MRose@UCI-750a
+**
+** but should insist on
+**
+** Marshall Rose <@UCI:MRose@UCI-750a>
+**
+** Unfortunately, a lot of mailers stupidly do this.
+**
+*/
#define QUOTE '\\'
struct adrx *
-getadrx (char *addrs)
+getadrx(char *addrs)
{
register char *bp;
register struct adrx *adrxp = &adrxs2;
if (pers)
- free (pers);
+ free(pers);
if (mbox)
- free (mbox);
+ free(mbox);
if (host)
- free (host);
+ free(host);
if (path)
- free (path);
+ free(path);
if (grp)
- free (grp);
+ free(grp);
if (note)
- free (note);
+ free(note);
pers = mbox = host = path = grp = note = NULL;
err[0] = 0;
if (dp == NULL) {
- dp = cp = getcpy (addrs ? addrs : "");
+ dp = cp = getcpy(addrs ? addrs : "");
glevel = 0;
} else if (cp == NULL) {
- free (dp);
+ free(dp);
dp = NULL;
return NULL;
}
- switch (parse_address ()) {
+ switch (parse_address()) {
case DONE:
- free (dp);
+ free(dp);
dp = cp = NULL;
return NULL;
default: /* catch trailing comments */
bp = cp;
- my_lex (adr);
+ my_lex(adr);
cp = bp;
break;
}
break;
default:
- my_lex (adr);
+ my_lex(adr);
continue;
}
break;
}
- while (isspace (*ap))
+ while (isspace(*ap))
ap++;
if (cp)
- sprintf (adr, "%.*s", (int)(cp - ap), ap);
+ sprintf(adr, "%.*s", (int)(cp - ap), ap);
else
- strcpy (adr, ap);
- bp = adr + strlen (adr) - 1;
+ strcpy(adr, ap);
+ bp = adr + strlen(adr) - 1;
if (*bp == ',' || *bp == ';' || *bp == '\n')
*bp = 0;
static int
-parse_address (void)
+parse_address(void)
{
char buffer[BUFSIZ];
again: ;
ap = cp;
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_ATOM:
case LX_QSTR:
- pers = getcpy (buffer);
+ pers = getcpy(buffer);
break;
case LX_SEMI:
if (glevel-- <= 0) {
- strcpy (err, "extraneous semi-colon");
+ strcpy(err, "extraneous semi-colon");
return NOTOK;
}
case LX_COMA:
if (note) {
- free (note);
+ free(note);
note = NULL;
}
goto again;
case LX_AT: /* sigh (3) */
cp = ap;
- if (route_addr (buffer) == NOTOK)
+ if (route_addr(buffer) == NOTOK)
return NOTOK;
return OK; /* why be choosy? */
default:
- sprintf (err, "illegal address construct (%s)", buffer);
+ sprintf(err, "illegal address construct (%s)", buffer);
return NOTOK;
}
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_ATOM:
case LX_QSTR:
- pers = add (buffer, add (" ", pers));
+ pers = add(buffer, add(" ", pers));
more_phrase: ; /* sigh (1) */
- if (phrase (buffer) == NOTOK)
+ if (phrase(buffer) == NOTOK)
return NOTOK;
switch (last_lex) {
case LX_LBRK:
get_addr: ;
- if (route_addr (buffer) == NOTOK)
+ if (route_addr(buffer) == NOTOK)
return NOTOK;
if (last_lex == LX_RBRK)
return OK;
- sprintf (err, "missing right-bracket (%s)", buffer);
+ sprintf(err, "missing right-bracket (%s)", buffer);
return NOTOK;
case LX_COLN:
get_group: ;
if (glevel++ > 0) {
- sprintf (err, "nested groups not allowed (%s)", pers);
+ sprintf(err, "nested groups not allowed (%s)", pers);
return NOTOK;
}
- grp = add (": ", pers);
+ grp = add(": ", pers);
pers = NULL;
{
char *pp = cp;
for (;;)
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_SEMI:
case LX_END: /* tsk, tsk */
glevel--;
default:
cp = pp;
- return parse_address ();
+ return parse_address();
}
}
case LX_DOT: /* sigh (1) */
- pers = add (".", pers);
+ pers = add(".", pers);
goto more_phrase;
default:
- sprintf (err, "no mailbox in address, only a phrase (%s%s)", pers, buffer);
+ sprintf(err, "no mailbox in address, only a phrase (%s%s)", pers, buffer);
return NOTOK;
}
goto get_group;
case LX_DOT:
- mbox = add (buffer, pers);
+ mbox = add(buffer, pers);
pers = NULL;
- if (route_addr (buffer) == NOTOK)
+ if (route_addr(buffer) == NOTOK)
return NOTOK;
goto check_end;
ingrp = glevel;
mbox = pers;
pers = NULL;
- if (domain (buffer) == NOTOK)
+ if (domain(buffer) == NOTOK)
return NOTOK;
check_end: ;
switch (last_lex) {
case LX_SEMI:
if (glevel-- <= 0) {
- strcpy (err, "extraneous semi-colon");
+ strcpy(err, "extraneous semi-colon");
return NOTOK;
}
case LX_COMA:
return OK;
default:
- sprintf (err, "junk after local@domain (%s)", buffer);
+ sprintf(err, "junk after local@domain (%s)", buffer);
return NOTOK;
}
case LX_END:
ingrp = glevel;
if (last_lex == LX_SEMI && glevel-- <= 0) {
- strcpy (err, "extraneous semi-colon");
+ strcpy(err, "extraneous semi-colon");
return NOTOK;
}
mbox = pers;
return OK;
default:
- sprintf (err, "missing mailbox (%s)", buffer);
+ sprintf(err, "missing mailbox (%s)", buffer);
return NOTOK;
}
}
static int
-phrase (char *buffer)
+phrase(char *buffer)
{
for (;;)
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_ATOM:
case LX_QSTR:
- pers = add (buffer, add (" ", pers));
+ pers = add(buffer, add(" ", pers));
continue;
default:
static int
-route_addr (char *buffer)
+route_addr(char *buffer)
{
register char *pp = cp;
- if (my_lex (buffer) == LX_AT) {
- if (route (buffer) == NOTOK)
+ if (my_lex(buffer) == LX_AT) {
+ if (route(buffer) == NOTOK)
return NOTOK;
}
else
cp = pp;
- if (local_part (buffer) == NOTOK)
+ if (local_part(buffer) == NOTOK)
return NOTOK;
switch (last_lex) {
case LX_AT:
- return domain (buffer);
+ return domain(buffer);
case LX_SEMI: /* if in group */
case LX_RBRK: /* no host */
return OK;
default:
- sprintf (err, "no at-sign after local-part (%s)", buffer);
+ sprintf(err, "no at-sign after local-part (%s)", buffer);
return NOTOK;
}
}
static int
-local_part (char *buffer)
+local_part(char *buffer)
{
ingrp = glevel;
for (;;) {
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_ATOM:
case LX_QSTR:
- mbox = add (buffer, mbox);
+ mbox = add(buffer, mbox);
break;
default:
- sprintf (err, "no mailbox in local-part (%s)", buffer);
+ sprintf(err, "no mailbox in local-part (%s)",
+ buffer);
return NOTOK;
}
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_DOT:
- mbox = add (buffer, mbox);
+ mbox = add(buffer, mbox);
continue;
default:
static int
-domain (char *buffer)
+domain(char *buffer)
{
for (;;) {
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_ATOM:
case LX_DLIT:
- host = add (buffer, host);
+ host = add(buffer, host);
break;
default:
- sprintf (err, "no sub-domain in domain-part of address (%s)", buffer);
+ sprintf(err, "no sub-domain in domain-part of address (%s)", buffer);
return NOTOK;
}
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_DOT:
- host = add (buffer, host);
+ host = add(buffer, host);
continue;
case LX_AT: /* sigh (0) */
- mbox = add (host, add ("%", mbox));
- free (host);
+ mbox = add(host, add("%", mbox));
+ free(host);
host = NULL;
continue;
static int
-route (char *buffer)
+route(char *buffer)
{
- path = getcpy ("@");
+ path = getcpy("@");
for (;;) {
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_ATOM:
case LX_DLIT:
- path = add (buffer, path);
+ path = add(buffer, path);
break;
default:
- sprintf (err, "no sub-domain in domain-part of address (%s)", buffer);
+ sprintf(err, "no sub-domain in domain-part of address (%s)", buffer);
return NOTOK;
}
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_COMA:
- path = add (buffer, path);
+ path = add(buffer, path);
for (;;) {
- switch (my_lex (buffer)) {
+ switch (my_lex(buffer)) {
case LX_COMA:
continue;
case LX_AT:
- path = add (buffer, path);
+ path = add(buffer, path);
break;
default:
- sprintf (err, "no at-sign found for next domain in route (%s)",
+ sprintf(err, "no at-sign found for next domain in route (%s)",
buffer);
}
break;
case LX_AT: /* XXX */
case LX_DOT:
- path = add (buffer, path);
+ path = add(buffer, path);
continue;
case LX_COLN:
- path = add (buffer, path);
+ path = add(buffer, path);
return OK;
default:
- sprintf (err, "no colon found to terminate route (%s)", buffer);
+ sprintf(err, "no colon found to terminate route (%s)", buffer);
return NOTOK;
}
}
static int
-my_lex (char *buffer)
+my_lex(char *buffer)
{
/* buffer should be at least BUFSIZ bytes long */
int i, gotat = 0;
register char *bp;
/*
- * Add C to the buffer bp. After use of this macro *bp is guaranteed
- * to be within the buffer.
- */
+ ** Add C to the buffer bp. After use of this macro *bp is guaranteed
+ ** to be within the buffer.
+ */
#define ADDCHR(C) \
do { \
*bp++ = (C); \
if (!cp)
return (last_lex = LX_END);
- gotat = isat (cp);
+ gotat = isat(cp);
c = *cp++;
- while (isspace (c))
+ while (isspace(c))
c = *cp++;
if (c == 0) {
cp = NULL;
ADDCHR(c);
if (--i < 0) {
*bp = 0;
- note = note ? add (buffer, add (" ", note))
- : getcpy (buffer);
- return my_lex (buffer);
+ note = note ? add(buffer, add(" ", note)) : getcpy(buffer);
+ return my_lex(buffer);
}
}
}
if (c == special[i].lx_chr)
return (last_lex = special[i].lx_val);
- if (iscntrl (c))
+ if (iscntrl(c))
return (last_lex = LX_ERR);
for (;;) {
for (i = 0; special[i].lx_chr != 0; i++)
if (c == special[i].lx_chr)
goto got_atom;
- if (iscntrl (c) || isspace (c))
+ if (iscntrl(c) || isspace(c))
break;
ADDCHR(c);
}
char *
-legal_person (char *p)
+legal_person(char *p)
{
int i;
register char *cp;
for (cp = p; *cp; cp++)
for (i = 0; special[i].lx_chr; i++)
if (*cp == special[i].lx_chr) {
- sprintf (buffer, "\"%s\"", p);
+ sprintf(buffer, "\"%s\"", p);
return buffer;
}