X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/042f5bed7ff3e5b34ff3166951a7b98bf6bbf105..faf6326828be2108facd64fcca291c4ffb523eea:/sbr/mf.c diff --git a/sbr/mf.c b/sbr/mf.c index b6c72912..86104de2 100644 --- a/sbr/mf.c +++ b/sbr/mf.c @@ -90,8 +90,6 @@ isat (const char *p) * */ -#define QUOTE '\\' - #define LX_END 0 #define LX_ERR 1 #define LX_ATOM 2 @@ -120,7 +118,7 @@ static struct specials special[] = { { '@', LX_AT }, { '(', LX_ERR }, { ')', LX_ERR }, - { QUOTE, LX_ERR }, + { '\\', LX_ERR }, { '"', LX_ERR }, { '[', LX_ERR }, { ']', LX_ERR }, @@ -150,6 +148,7 @@ static struct adrx adrxs2; struct adrx * getadrx (const char *addrs, int eai) { + int parse; char *bp; struct adrx *adrxp = &adrxs2; @@ -165,62 +164,35 @@ getadrx (const char *addrs, int eai) if (dp == NULL) { dp = cp = strdup (FENDNULL(addrs)); glevel = 0; + } else if (cp == NULL) { + free (dp); + dp = NULL; + return NULL; } - else - if (cp == NULL) { - free (dp); - dp = NULL; - return NULL; - } - - switch (parse_address ()) { - case DONE: - free (dp); - dp = cp = NULL; - return NULL; - - case OK: - switch (last_lex) { - case LX_COMA: - case LX_END: - break; - - default: /* catch trailing comments */ - bp = cp; - my_lex (adr); - cp = bp; - break; - } - break; - - default: - break; - } - if (! eai) { - /* - * Reject the address if key fields contain 8bit characters - */ - - if (contains8bit(mbox, NULL) || contains8bit(host, NULL) || - contains8bit(routepath, NULL) || contains8bit(grp, NULL)) { - strcpy(err, "Address contains 8-bit characters"); - } + parse = parse_address(); + if (parse == DONE) { + free(dp); + dp = cp = NULL; + return NULL; + } + if (parse == OK && last_lex != LX_COMA && last_lex != LX_END) { + /* catch trailing comments */ + bp = cp; + my_lex(adr); + cp = bp; } + /* Reject the address if key fields contain 8bit characters. */ + if (!eai && + (contains8bit(mbox, NULL) || contains8bit(host, NULL) || + contains8bit(routepath, NULL) || contains8bit(grp, NULL))) + strcpy(err, "Address contains 8-bit characters"); + if (err[0]) - for (;;) { - switch (last_lex) { - case LX_COMA: - case LX_END: - break; + while (last_lex != LX_COMA && last_lex != LX_END) + my_lex(adr); - default: - my_lex (adr); - continue; - } - break; - } while (isspace ((unsigned char) *ap)) ap++; if (cp) @@ -367,7 +339,7 @@ again: ; strcpy (err, "extraneous semi-colon"); return NOTOK; } - /* FALLTHRU */ + return OK; case LX_COMA: case LX_END: return OK; @@ -399,16 +371,12 @@ again: ; static int phrase (char *buffer) { - for (;;) - switch (my_lex (buffer)) { - case LX_ATOM: - case LX_QSTR: - pers = add (buffer, add (" ", pers)); - continue; + int lex; - default: - return OK; - } + while ((lex = my_lex(buffer)) == LX_ATOM || lex == LX_QSTR) + pers = add(buffer, add(" ", pers)); + + return OK; } @@ -590,7 +558,7 @@ my_lex (char *buffer) case 0: cp = NULL; return (last_lex = LX_ERR); - case QUOTE: + case '\\': ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL; @@ -622,7 +590,7 @@ my_lex (char *buffer) case 0: cp = NULL; return (last_lex = LX_ERR); - case QUOTE: + case '\\': ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL; @@ -646,7 +614,7 @@ my_lex (char *buffer) case 0: cp = NULL; return (last_lex = LX_ERR); - case QUOTE: + case '\\': ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL;