X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/01b844b7e61d6537be3f75acc1a747ed4fda206f..94187a80bd60baab4b9c4b949ad820d730578123:/sbr/mf.c diff --git a/sbr/mf.c b/sbr/mf.c index e0abb293..6c4afec5 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,77 +148,51 @@ static struct adrx adrxs2; struct adrx * getadrx (const char *addrs, int eai) { + int parse; char *bp; struct adrx *adrxp = &adrxs2; - mh_xfree(pers); - mh_xfree(mbox); - mh_xfree(host); - mh_xfree(routepath); - mh_xfree(grp); - mh_xfree(note); + free(pers); + free(mbox); + free(host); + free(routepath); + free(grp); + free(note); pers = mbox = host = routepath = grp = note = NULL; err[0] = 0; if (dp == NULL) { - dp = cp = strdup (addrs ? addrs : ""); + 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) @@ -265,7 +237,7 @@ again: ; } /* FALLTHRU */ case LX_COMA: - mh_xfree(note); + free(note); note = NULL; goto again; @@ -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; } @@ -572,7 +540,7 @@ my_lex (char *buffer) bp = buffer; *bp = 0; if (!cp) - return (last_lex = LX_END); + return last_lex = LX_END; gotat = isat (cp); c = *cp++; @@ -580,7 +548,7 @@ my_lex (char *buffer) c = *cp++; if (c == 0) { cp = NULL; - return (last_lex = LX_END); + return last_lex = LX_END; } if (c == '(') { @@ -589,12 +557,12 @@ my_lex (char *buffer) switch (c = *cp++) { case 0: cp = NULL; - return (last_lex = LX_ERR); - case QUOTE: + return last_lex = LX_ERR; + case '\\': ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL; - return (last_lex = LX_ERR); + return last_lex = LX_ERR; } ADDCHR(c); continue; @@ -621,12 +589,12 @@ my_lex (char *buffer) switch (c = *cp++) { case 0: cp = NULL; - return (last_lex = LX_ERR); - case QUOTE: + return last_lex = LX_ERR; + case '\\': ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL; - return (last_lex = LX_ERR); + return last_lex = LX_ERR; } /* FALLTHRU */ default: @@ -635,7 +603,7 @@ my_lex (char *buffer) case '"': ADDCHR(c); *bp = 0; - return (last_lex = LX_QSTR); + return last_lex = LX_QSTR; } } @@ -645,12 +613,12 @@ my_lex (char *buffer) switch (c = *cp++) { case 0: cp = NULL; - return (last_lex = LX_ERR); - case QUOTE: + return last_lex = LX_ERR; + case '\\': ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL; - return (last_lex = LX_ERR); + return last_lex = LX_ERR; } /* FALLTHRU */ default: @@ -659,7 +627,7 @@ my_lex (char *buffer) case ']': ADDCHR(c); *bp = 0; - return (last_lex = LX_DLIT); + return last_lex = LX_DLIT; } } @@ -667,10 +635,10 @@ my_lex (char *buffer) *bp = 0; for (i = 0; special[i].lx_chr != 0; i++) if (c == special[i].lx_chr) - return (last_lex = special[i].lx_val); + return last_lex = special[i].lx_val; if (iscntrl ((unsigned char) c)) - return (last_lex = LX_ERR); + return last_lex = LX_ERR; for (;;) { if ((c = *cp++) == 0) @@ -695,7 +663,7 @@ got_atom: ; my_lex_buffull: /* Out of buffer space. *bp is the last byte in the buffer */ *bp = 0; - return (last_lex = LX_ERR); + return last_lex = LX_ERR; }