=================================================================== RCS file: /cvs/mandoc/mdoc_macro.c,v retrieving revision 1.26 retrieving revision 1.29 diff -u -p -r1.26 -r1.29 --- mandoc/mdoc_macro.c 2009/07/24 12:17:25 1.26 +++ mandoc/mdoc_macro.c 2009/07/29 08:52:24 1.29 @@ -1,4 +1,4 @@ -/* $Id: mdoc_macro.c,v 1.26 2009/07/24 12:17:25 kristaps Exp $ */ +/* $Id: mdoc_macro.c,v 1.29 2009/07/29 08:52:24 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -47,7 +47,8 @@ static int rew_subblock(enum mdoc_type, struct mdoc *, int, int, int); static int rew_last(struct mdoc *, struct mdoc_node *); static int append_delims(struct mdoc *, int, int *, char *); -static int lookup(struct mdoc *, int, int, int, const char *); +static int lookup(struct mdoc *, int, const char *); +static int lookup_raw(struct mdoc *, const char *); static int swarn(struct mdoc *, enum mdoc_type, int, int, const struct mdoc_node *); @@ -253,17 +254,24 @@ mdoc_macroend(struct mdoc *mdoc) } static int -lookup(struct mdoc *mdoc, int line, int pos, int from, const char *p) +lookup(struct mdoc *mdoc, int from, const char *p) { + + if ( ! (MDOC_PARSED & mdoc_macros[from].flags)) + return(MDOC_MAX); + return(lookup_raw(mdoc, p)); +} + + +static int +lookup_raw(struct mdoc *mdoc, const char *p) +{ int res; - res = mdoc_hash_find(mdoc->htab, p); - if (MDOC_PARSED & mdoc_macros[from].flags) + if (MDOC_MAX == (res = mdoc_hash_find(mdoc->htab, p))) + return(MDOC_MAX); + if (MDOC_CALLABLE & mdoc_macros[res].flags) return(res); - if (MDOC_MAX == res) - return(res); - if ( ! mdoc_pwarn(mdoc, line, pos, EMACPARM)) - return(-1); return(MDOC_MAX); } @@ -681,7 +689,7 @@ blk_exp_close(MACRO_PROT_ARGS) mdoc->next = MDOC_NEXT_CHILD; } - for (lastarg = ppos, flushed = j = 0; ; j++) { + for (flushed = j = 0; ; j++) { lastarg = *pos; if (j == maxargs && ! flushed) { @@ -699,9 +707,7 @@ blk_exp_close(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; - if (-1 == (c = lookup(mdoc, line, lastarg, tok, p))) - return(0); - else if (MDOC_MAX != c) { + if (MDOC_MAX != (c = lookup(mdoc, tok, p))) { if ( ! flushed) { if ( ! rew_expblock(mdoc, tok, line, ppos)) @@ -760,7 +766,7 @@ in_line(MACRO_PROT_ARGS) break; } - for (la = ppos, arg = NULL;; ) { + for (arg = NULL;; ) { la = *pos; c = mdoc_argv(mdoc, line, tok, &arg, pos, buf); @@ -790,8 +796,7 @@ in_line(MACRO_PROT_ARGS) /* Quoted words shouldn't be looked-up. */ - c = ARGS_QWORD == w ? MDOC_MAX : - lookup(mdoc, line, la, tok, p); + c = ARGS_QWORD == w ? MDOC_MAX : lookup(mdoc, tok, p); /* * In this case, we've located a submacro and must @@ -800,7 +805,7 @@ in_line(MACRO_PROT_ARGS) * or raise a warning. */ - if (MDOC_MAX != c && -1 != c) { + if (MDOC_MAX != c) { if (0 == lastpunct && ! rew_elem(mdoc, tok)) return(0); if (nc && 0 == cnt) { @@ -820,8 +825,7 @@ in_line(MACRO_PROT_ARGS) if (ppos > 1) return(1); return(append_delims(mdoc, line, pos, buf)); - } else if (-1 == c) - return(0); + } /* * Non-quote-enclosed punctuation. Set up our scope, if @@ -988,10 +992,7 @@ blk_full(MACRO_PROT_ARGS) continue; } - if (-1 == (c = lookup(mdoc, line, lastarg, tok, p))) - return(0); - - if (MDOC_MAX == c) { + if (MDOC_MAX == (c = lookup(mdoc, tok, p))) { if ( ! mdoc_word_alloc(mdoc, line, lastarg, p)) return(0); mdoc->next = MDOC_NEXT_SIBLING; @@ -1046,7 +1047,7 @@ blk_part_imp(MACRO_PROT_ARGS) /* XXX - no known argument macros. */ - for (lastarg = ppos;; ) { + for (;;) { lastarg = *pos; c = mdoc_args(mdoc, line, pos, buf, tok, &p); assert(ARGS_PHRASE != c); @@ -1058,9 +1059,7 @@ blk_part_imp(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; - if (-1 == (c = lookup(mdoc, line, lastarg, tok, p))) - return(0); - else if (MDOC_MAX == c) { + if (MDOC_MAX == (c = lookup(mdoc, tok, p))) { if ( ! mdoc_word_alloc(mdoc, line, lastarg, p)) return(0); mdoc->next = MDOC_NEXT_SIBLING; @@ -1107,7 +1106,6 @@ blk_part_exp(MACRO_PROT_ARGS) int lastarg, flushed, j, c, maxargs; char *p; - lastarg = ppos; flushed = 0; /* @@ -1163,9 +1161,7 @@ blk_part_exp(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; - if (-1 == (c = lookup(mdoc, line, lastarg, tok, p))) - return(0); - else if (MDOC_MAX != c) { + if (MDOC_MAX != (c = lookup(mdoc, tok, p))) { if ( ! flushed) { if ( ! rew_subblock(MDOC_HEAD, mdoc, tok, line, ppos)) @@ -1243,7 +1239,7 @@ in_line_argn(MACRO_PROT_ARGS) break; } - for (lastarg = ppos, arg = NULL;; ) { + for (arg = NULL;; ) { lastarg = *pos; c = mdoc_argv(mdoc, line, tok, &arg, pos, buf); @@ -1283,9 +1279,7 @@ in_line_argn(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; - if (-1 == (c = lookup(mdoc, line, lastarg, tok, p))) - return(0); - else if (MDOC_MAX != c) { + if (MDOC_MAX != (c = lookup(mdoc, tok, p))) { if ( ! flushed && ! rew_elem(mdoc, tok)) return(0); flushed = 1; @@ -1361,15 +1355,13 @@ in_line_eoln(MACRO_PROT_ARGS) if (ARGS_EOLN == w) break; - c = ARGS_QWORD == w ? MDOC_MAX : - lookup(mdoc, line, la, tok, p); + c = ARGS_QWORD == w ? MDOC_MAX : lookup(mdoc, tok, p); - if (MDOC_MAX != c && -1 != c) { + if (MDOC_MAX != c) { if ( ! rew_elem(mdoc, tok)) return(0); return(mdoc_macro(mdoc, c, line, la, pos, buf)); - } else if (-1 == c) - return(0); + } if ( ! mdoc_word_alloc(mdoc, line, la, p)) return(0); @@ -1411,15 +1403,13 @@ phrase(struct mdoc *mdoc, int line, int ppos, char *bu if (ARGS_EOLN == w) break; - c = ARGS_QWORD == w ? MDOC_MAX : - mdoc_hash_find(mdoc->htab, p); + c = ARGS_QWORD == w ? MDOC_MAX : lookup_raw(mdoc, p); - if (MDOC_MAX != c && -1 != c) { + if (MDOC_MAX != c) { if ( ! mdoc_macro(mdoc, c, line, la, &pos, buf)) return(0); return(append_delims(mdoc, line, &pos, buf)); - } else if (-1 == c) - return(0); + } if ( ! mdoc_word_alloc(mdoc, line, la, p)) return(0);