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 (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)
}
/* FALLTHRU */
case LX_COMA:
- mh_xfree(note);
+ free(note);
note = NULL;
goto 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;
}
bp = buffer;
*bp = 0;
if (!cp)
- return (last_lex = LX_END);
+ return last_lex = LX_END;
gotat = isat (cp);
c = *cp++;
c = *cp++;
if (c == 0) {
cp = NULL;
- return (last_lex = LX_END);
+ return last_lex = LX_END;
}
if (c == '(') {
switch (c = *cp++) {
case 0:
cp = NULL;
- return (last_lex = LX_ERR);
+ 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;
switch (c = *cp++) {
case 0:
cp = NULL;
- return (last_lex = LX_ERR);
+ 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:
case '"':
ADDCHR(c);
*bp = 0;
- return (last_lex = LX_QSTR);
+ return last_lex = LX_QSTR;
}
}
switch (c = *cp++) {
case 0:
cp = NULL;
- return (last_lex = LX_ERR);
+ 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:
case ']':
ADDCHR(c);
*bp = 0;
- return (last_lex = LX_DLIT);
+ return last_lex = LX_DLIT;
}
}
*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)
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;
}