=================================================================== RCS file: /cvs/mandoc/mdoc_macro.c,v retrieving revision 1.33 retrieving revision 1.40 diff -u -p -r1.33 -r1.40 --- mandoc/mdoc_macro.c 2009/08/20 08:59:12 1.33 +++ mandoc/mdoc_macro.c 2010/01/01 17:14:29 1.40 @@ -1,4 +1,4 @@ -/* $Id: mdoc_macro.c,v 1.33 2009/08/20 08:59:12 kristaps Exp $ */ +/* $Id: mdoc_macro.c,v 1.40 2010/01/01 17:14:29 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -14,11 +14,16 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include #include #include #include +#include #include "libmdoc.h" @@ -46,8 +51,8 @@ static int rew_sub(enum mdoc_type, struct mdoc *, static int rew_last(struct mdoc *, const struct mdoc_node *); static int append_delims(struct mdoc *, int, int *, char *); -static int lookup(struct mdoc *, int, const char *); -static int lookup_raw(struct mdoc *, const char *); +static int lookup(int, const char *); +static int lookup_raw(const char *); static int swarn(struct mdoc *, enum mdoc_type, int, int, const struct mdoc_node *); @@ -174,6 +179,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { in_line_eoln, 0 }, /* %Q */ { in_line_eoln, 0 }, /* br */ { in_line_eoln, 0 }, /* sp */ + { in_line_eoln, 0 }, /* %U */ }; const struct mdoc_macro * const mdoc_macros = __mdoc_macros; @@ -258,12 +264,13 @@ mdoc_macroend(struct mdoc *m) * Look up a macro from within a subsequent context. */ static int -lookup(struct mdoc *mdoc, int from, const char *p) +lookup(int from, const char *p) { + /* FIXME: make -diag lists be un-PARSED. */ if ( ! (MDOC_PARSED & mdoc_macros[from].flags)) return(MDOC_MAX); - return(lookup_raw(mdoc, p)); + return(lookup_raw(p)); } @@ -271,11 +278,11 @@ lookup(struct mdoc *mdoc, int from, const char *p) * Lookup a macro following the initial line macro. */ static int -lookup_raw(struct mdoc *mdoc, const char *p) +lookup_raw(const char *p) { int res; - if (MDOC_MAX == (res = mdoc_hash_find(mdoc->htab, p))) + if (MDOC_MAX == (res = mdoc_hash_find(p))) return(MDOC_MAX); if (MDOC_CALLABLE & mdoc_macros[res].flags) return(res); @@ -669,7 +676,7 @@ blk_exp_close(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; - if (MDOC_MAX != (c = lookup(m, tok, p))) { + if (MDOC_MAX != (c = lookup(tok, p))) { if ( ! flushed) { if ( ! rew_sub(MDOC_BLOCK, m, tok, line, ppos)) return(0); @@ -753,7 +760,7 @@ in_line(MACRO_PROT_ARGS) /* Quoted words shouldn't be looked-up. */ - c = ARGS_QWORD == w ? MDOC_MAX : lookup(m, tok, p); + c = ARGS_QWORD == w ? MDOC_MAX : lookup(tok, p); /* * In this case, we've located a submacro and must @@ -805,6 +812,17 @@ in_line(MACRO_PROT_ARGS) cnt++; if ( ! mdoc_word_alloc(m, line, la, p)) return(0); + + /* + * `Fl' macros have their scope re-opened with each new + * word so that the `-' can be added to each one without + * having to parse out spaces. + */ + if (0 == lastpunct && MDOC_Fl == tok) { + if ( ! rew_elem(m, tok)) + return(0); + lastpunct = 1; + } } if (0 == lastpunct && ! rew_elem(m, tok)) @@ -932,7 +950,7 @@ blk_full(MACRO_PROT_ARGS) continue; } - if (MDOC_MAX == (c = lookup(m, tok, p))) { + if (MDOC_MAX == (c = lookup(tok, p))) { if ( ! mdoc_word_alloc(m, line, lastarg, p)) return(0); continue; @@ -995,7 +1013,7 @@ blk_part_imp(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; - if (MDOC_MAX == (c = lookup(m, tok, p))) { + if (MDOC_MAX == (c = lookup(tok, p))) { if ( ! mdoc_word_alloc(m, line, la, p)) return(0); continue; @@ -1098,7 +1116,7 @@ blk_part_exp(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; - if (MDOC_MAX != (c = lookup(m, tok, p))) { + if (MDOC_MAX != (c = lookup(tok, p))) { if ( ! flushed) { if ( ! rew_sub(MDOC_HEAD, m, tok, line, ppos)) return(0); @@ -1209,7 +1227,7 @@ in_line_argn(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; - if (MDOC_MAX != (c = lookup(m, tok, p))) { + if (MDOC_MAX != (c = lookup(tok, p))) { if ( ! flushed && ! rew_elem(m, tok)) return(0); flushed = 1; @@ -1284,7 +1302,7 @@ in_line_eoln(MACRO_PROT_ARGS) if (ARGS_EOLN == w) break; - c = ARGS_QWORD == w ? MDOC_MAX : lookup(m, tok, p); + c = ARGS_QWORD == w ? MDOC_MAX : lookup(tok, p); if (MDOC_MAX != c) { if ( ! rew_elem(m, tok)) @@ -1333,7 +1351,7 @@ phrase(struct mdoc *m, int line, int ppos, char *buf) if (ARGS_EOLN == w) break; - c = ARGS_QWORD == w ? MDOC_MAX : lookup_raw(m, p); + c = ARGS_QWORD == w ? MDOC_MAX : lookup_raw(p); if (MDOC_MAX != c) { if ( ! mdoc_macro(m, c, line, la, &pos, buf))