=================================================================== RCS file: /cvs/mandoc/mdoc_macro.c,v retrieving revision 1.75 retrieving revision 1.81 diff -u -p -r1.75 -r1.81 --- mandoc/mdoc_macro.c 2010/05/31 10:28:04 1.75 +++ mandoc/mdoc_macro.c 2010/06/26 16:07:08 1.81 @@ -1,6 +1,6 @@ -/* $Id: mdoc_macro.c,v 1.75 2010/05/31 10:28:04 kristaps Exp $ */ +/* $Id: mdoc_macro.c,v 1.81 2010/06/26 16:07:08 kristaps Exp $ */ /* - * Copyright (c) 2008, 2009 Kristaps Dzonsons + * Copyright (c) 2008, 2009 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -50,7 +50,9 @@ static int append_delims(struct mdoc *, int, int *, char *); static enum mdoct lookup(enum mdoct, const char *); static enum mdoct lookup_raw(const char *); -static int phrase(struct mdoc *, int, int, char *); +static int phrase(struct mdoc *, + const struct regset *, + int, int, char *); static enum mdoct rew_alt(enum mdoct); static int rew_dobreak(enum mdoct, const struct mdoc_node *); @@ -739,7 +741,7 @@ blk_exp_close(MACRO_PROT_ARGS) return(0); flushed = 1; } - if ( ! mdoc_macro(m, ntok, line, lastarg, pos, buf)) + if ( ! mdoc_macro(m, regs, ntok, line, lastarg, pos, buf)) return(0); break; } @@ -840,7 +842,7 @@ in_line(MACRO_PROT_ARGS) if ( ! mdoc_pmsg(m, line, ppos, MANDOCERR_MACROEMPTY)) return(0); } - if ( ! mdoc_macro(m, ntok, line, la, pos, buf)) + if ( ! mdoc_macro(m, regs, ntok, line, la, pos, buf)) return(0); if ( ! nl) return(1); @@ -1086,7 +1088,7 @@ blk_full(MACRO_PROT_ARGS) if (ARGS_PEND == ac && ARGS_PPHRASE == lac) m->flags |= MDOC_PPHRASE; - if ( ! phrase(m, line, la, buf)) + if ( ! phrase(m, regs, line, la, buf)) return(0); m->flags &= ~MDOC_PPHRASE; @@ -1101,7 +1103,7 @@ blk_full(MACRO_PROT_ARGS) continue; } - if ( ! mdoc_macro(m, ntok, line, la, pos, buf)) + if ( ! mdoc_macro(m, regs, ntok, line, la, pos, buf)) return(0); break; } @@ -1118,7 +1120,7 @@ blk_full(MACRO_PROT_ARGS) /* If we've already opened our body, exit now. */ if (NULL != body) - return(1); + goto out; #ifdef UGLY /* @@ -1145,6 +1147,16 @@ blk_full(MACRO_PROT_ARGS) if ( ! mdoc_body_alloc(m, line, ppos, tok)) return(0); +out: + if ( ! (MDOC_FREECOL & m->flags)) + return(1); + + if ( ! rew_sub(MDOC_BODY, m, tok, line, ppos)) + return(0); + if ( ! rew_sub(MDOC_BLOCK, m, tok, line, ppos)) + return(0); + + m->flags &= ~MDOC_FREECOL; return(1); } @@ -1219,7 +1231,7 @@ blk_part_imp(MACRO_PROT_ARGS) continue; } - if ( ! mdoc_macro(m, ntok, line, la, pos, buf)) + if ( ! mdoc_macro(m, regs, ntok, line, la, pos, buf)) return(0); break; } @@ -1364,7 +1376,7 @@ blk_part_exp(MACRO_PROT_ARGS) continue; } - if ( ! mdoc_macro(m, ntok, line, la, pos, buf)) + if ( ! mdoc_macro(m, regs, ntok, line, la, pos, buf)) return(0); break; } @@ -1483,7 +1495,7 @@ in_line_argn(MACRO_PROT_ARGS) if ( ! flushed && ! rew_elem(m, tok)) return(0); flushed = 1; - if ( ! mdoc_macro(m, ntok, line, la, pos, buf)) + if ( ! mdoc_macro(m, regs, ntok, line, la, pos, buf)) return(0); j++; break; @@ -1589,7 +1601,7 @@ in_line_eoln(MACRO_PROT_ARGS) if ( ! rew_elem(m, tok)) return(0); - return(mdoc_macro(m, ntok, line, la, pos, buf)); + return(mdoc_macro(m, regs, ntok, line, la, pos, buf)); } /* Close out (no delimiters). */ @@ -1608,11 +1620,11 @@ ctx_synopsis(MACRO_PROT_ARGS) /* If we're not in the SYNOPSIS, go straight to in-line. */ if (SEC_SYNOPSIS != m->lastsec) - return(in_line(m, tok, line, ppos, pos, buf)); + return(in_line(m, regs, tok, line, ppos, pos, buf)); /* If we're a nested call, same place. */ if ( ! nl) - return(in_line(m, tok, line, ppos, pos, buf)); + return(in_line(m, regs, tok, line, ppos, pos, buf)); /* * XXX: this will open a block scope; however, if later we end @@ -1620,7 +1632,7 @@ ctx_synopsis(MACRO_PROT_ARGS) * the formatting. Be careful. */ - return(blk_part_imp(m, tok, line, ppos, pos, buf)); + return(blk_part_imp(m, regs, tok, line, ppos, pos, buf)); } @@ -1639,7 +1651,8 @@ obsolete(MACRO_PROT_ARGS) * macro is encountered. */ static int -phrase(struct mdoc *m, int line, int ppos, char *buf) +phrase(struct mdoc *m, const struct regset *regs, + int line, int ppos, char *buf) { int la, pos; enum margserr ac; @@ -1664,7 +1677,7 @@ phrase(struct mdoc *m, int line, int ppos, char *buf) continue; } - if ( ! mdoc_macro(m, ntok, line, la, &pos, buf)) + if ( ! mdoc_macro(m, regs, ntok, line, la, &pos, buf)) return(0); return(append_delims(m, line, &pos, buf)); } @@ -1673,13 +1686,13 @@ phrase(struct mdoc *m, int line, int ppos, char *buf) } +/* ARGSUSED */ static int phrase_ta(MACRO_PROT_ARGS) { int la; enum mdoct ntok; enum margserr ac; - struct mdoc_node *n; char *p; /* @@ -1687,26 +1700,8 @@ phrase_ta(MACRO_PROT_ARGS) * it should simply error out with ARGSLOST. */ - n = m->last; if ( ! rew_sub(MDOC_BODY, m, MDOC_It, line, ppos)) return(0); - - /* - * FIXME: this is necessary in bogus constructions like - * .Bl -column foo bar - * .Sy foo Ta bar - * It is, however, an ugly way to do it. - * - * XXX; remove this when the above construct builds an implied - * `It' marker. - */ - if (NULL == m->last || - MDOC_BODY != m->last->type || - MDOC_It != m->last->tok) { - swarn(m, tok, line, ppos, n); - return(0); - } - if ( ! mdoc_body_alloc(m, line, ppos, MDOC_It)) return(0); @@ -1727,7 +1722,7 @@ phrase_ta(MACRO_PROT_ARGS) continue; } - if ( ! mdoc_macro(m, ntok, line, la, pos, buf)) + if ( ! mdoc_macro(m, regs, ntok, line, la, pos, buf)) return(0); return(append_delims(m, line, pos, buf)); }