--- lib/address.cc +++ lib/address.cc @@ -163,7 +163,7 @@ case LSQBRACKET: case RSQBRACKET: case AT: case COMMA: case SEMICOLON: case COLON: - case ESCAPE: case QUOTE: case PERIOD: + case ESCAPE: case QUOTE: return true; default: return false; @@ -446,29 +446,30 @@ RETURN(node->next, node->str, comment, node->str); else if(node->type == QUOTED_STRING) { mystring addr = unquote(node->str); - RETURN(node->next, quote(addr), comment, addr); + RETURN(node->next, node->str, comment, node->str); } FAIL("did not match ATOM or QUOTED-STRING"); } RULE(local_part) { - ENTER("word *(PERIOD word)"); - MATCHRULE(r, word); + ENTER("[word] *(PERIOD [word])"); + result r = match_word (node); if(! r ) r = node; for(;;) { node = r.next = skipcomment(r.next, r.comment); if(node->type != PERIOD) break; node = node->next; result r1 = match_word(node); - if(!r1) - break; - r.next = r1.next; + r.next = !r1 ? node : r1.next; r.str += PERIOD; - r.str += r1.str; - r.comment += r1.comment; + if(!!r1) + r.str += r1.str; + if(!!r1) + r.comment += r1.comment; r.addr += PERIOD; - r.addr += r1.addr; + if(!!r1) + r.addr += r1.addr; } RETURNR(r); }