=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_macro.c,v retrieving revision 1.36 retrieving revision 1.37 diff -c -r1.36 -r1.37 *** src/usr.bin/mandoc/mdoc_macro.c 2010/05/14 01:54:37 1.36 --- src/usr.bin/mandoc/mdoc_macro.c 2010/05/14 14:47:44 1.37 *************** *** 1,4 **** ! /* $Id: mdoc_macro.c,v 1.36 2010/05/14 01:54:37 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * --- 1,4 ---- ! /* $Id: mdoc_macro.c,v 1.37 2010/05/14 14:47:44 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * *************** *** 43,49 **** 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 enum mdoct rew_alt(enum mdoct); static int rew_dobreak(enum mdoct, const struct mdoc_node *); --- 43,50 ---- 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 *, enum margserr, int); static enum mdoct rew_alt(enum mdoct); static int rew_dobreak(enum mdoct, const struct mdoc_node *); *************** *** 646,656 **** static int blk_exp_close(MACRO_PROT_ARGS) { ! int j, lastarg, maxargs, flushed; enum margserr ac; enum mdoct ntok; char *p; switch (tok) { case (MDOC_Ec): maxargs = 1; --- 647,659 ---- static int blk_exp_close(MACRO_PROT_ARGS) { ! int j, lastarg, maxargs, flushed, nl; enum margserr ac; enum mdoct ntok; char *p; + nl = MDOC_NEWLINE & m->flags; + switch (tok) { case (MDOC_Ec): maxargs = 1; *************** *** 716,722 **** if ( ! flushed && ! rew_sub(MDOC_BLOCK, m, tok, line, ppos)) return(0); ! if (ppos > 1) return(1); return(append_delims(m, line, pos, buf)); } --- 719,725 ---- if ( ! flushed && ! rew_sub(MDOC_BLOCK, m, tok, line, ppos)) return(0); ! if ( ! nl) return(1); return(append_delims(m, line, pos, buf)); } *************** *** 725,737 **** static int in_line(MACRO_PROT_ARGS) { ! int la, lastpunct, cnt, d, nc; enum margverr av; enum mdoct ntok; enum margserr ac; struct mdoc_arg *arg; char *p; /* * Whether we allow ignored elements (those without content, * usually because of reserved words) to squeak by. --- 728,742 ---- static int in_line(MACRO_PROT_ARGS) { ! int la, lastpunct, cnt, d, nc, nl; enum margverr av; enum mdoct ntok; enum margserr ac; struct mdoc_arg *arg; char *p; + nl = MDOC_NEWLINE & m->flags; + /* * Whether we allow ignored elements (those without content, * usually because of reserved words) to squeak by. *************** *** 808,814 **** } if ( ! mdoc_macro(m, ntok, line, la, pos, buf)) return(0); ! if (ppos > 1) return(1); return(append_delims(m, line, pos, buf)); } --- 813,819 ---- } if ( ! mdoc_macro(m, ntok, line, la, pos, buf)) return(0); ! if ( ! nl) return(1); return(append_delims(m, line, pos, buf)); } *************** *** 868,874 **** return(0); } ! if (ppos > 1) return(1); return(append_delims(m, line, pos, buf)); } --- 873,879 ---- return(0); } ! if ( ! nl) return(1); return(append_delims(m, line, pos, buf)); } *************** *** 877,889 **** static int blk_full(MACRO_PROT_ARGS) { ! int la; struct mdoc_arg *arg; struct mdoc_node *head; /* save of head macro */ struct mdoc_node *body; /* save of body macro */ struct mdoc_node *n; enum mdoct ntok; ! enum margserr ac; enum margverr av; char *p; --- 882,894 ---- static int blk_full(MACRO_PROT_ARGS) { ! int la, pcnt; struct mdoc_arg *arg; struct mdoc_node *head; /* save of head macro */ struct mdoc_node *body; /* save of body macro */ struct mdoc_node *n; enum mdoct ntok; ! enum margserr ac, lac; enum margverr av; char *p; *************** *** 944,951 **** body = m->last; } ! for (;;) { la = *pos; ac = mdoc_args(m, line, pos, buf, tok, &p); if (ARGS_ERROR == ac) --- 949,959 ---- body = m->last; } ! ac = ARGS_ERROR; ! ! for (pcnt = 0; ; ) { la = *pos; + lac = ac; ac = mdoc_args(m, line, pos, buf, tok, &p); if (ARGS_ERROR == ac) *************** *** 960,967 **** #if 0 /* Don't emit leading punct. for phrases. */ ! if (NULL == head && ARGS_PHRASE != ac && ARGS_PPHRASE != ac && ARGS_QWORD != ac && 1 == mdoc_isdelim(p)) { if ( ! mdoc_word_alloc(m, line, la, p)) --- 968,977 ---- #if 0 /* Don't emit leading punct. for phrases. */ ! if (NULL == head && ! ARGS_PHRASE != ac && ARGS_PPHRASE != ac && + ARGS_PEND != ac && ARGS_QWORD != ac && 1 == mdoc_isdelim(p)) { if ( ! mdoc_word_alloc(m, line, la, p)) *************** *** 972,986 **** /* Always re-open head for phrases. */ ! if (NULL == head || ARGS_PHRASE == ac || ARGS_PPHRASE == ac) { if ( ! mdoc_head_alloc(m, line, ppos, tok)) return(0); head = m->last; } ! if (ARGS_PHRASE == ac || ARGS_PPHRASE == ac) { ! if ( ! phrase(m, line, la, buf)) return(0); if ( ! rew_sub(MDOC_HEAD, m, tok, line, ppos)) return(0); --- 982,1011 ---- /* Always re-open head for phrases. */ ! if (NULL == head || ! ARGS_PHRASE == ac || ! ARGS_PEND == ac || ARGS_PPHRASE == ac) { if ( ! mdoc_head_alloc(m, line, ppos, tok)) return(0); head = m->last; } ! if (ARGS_PHRASE == ac || ! ARGS_PEND == ac || ! ARGS_PPHRASE == ac) { ! /* ! * Special treatment for the last phrase. A ! * prior ARGS_PHRASE gets is handled as a ! * regular ARGS_PHRASE, but a prior ARGS_PPHRASE ! * has special handling. ! */ ! if (ARGS_PEND == ac && ARGS_ERROR == lac) ! ac = ARGS_PHRASE; ! else if (ARGS_PEND == ac && ARGS_PHRASE == lac) ! ac = ARGS_PHRASE; ! ! if ( ! phrase(m, line, la, buf, ac, pcnt++)) return(0); if ( ! rew_sub(MDOC_HEAD, m, tok, line, ppos)) return(0); *************** *** 1160,1172 **** static int blk_part_exp(MACRO_PROT_ARGS) { ! int la; enum margserr ac; struct mdoc_node *head; /* keep track of head */ struct mdoc_node *body; /* keep track of body */ char *p; enum mdoct ntok; /* * The opening of an explicit macro having zero or more leading * punctuation nodes; a head with optional single element (the --- 1185,1199 ---- static int blk_part_exp(MACRO_PROT_ARGS) { ! int la, nl; enum margserr ac; struct mdoc_node *head; /* keep track of head */ struct mdoc_node *body; /* keep track of body */ char *p; enum mdoct ntok; + nl = MDOC_NEWLINE & m->flags; + /* * The opening of an explicit macro having zero or more leading * punctuation nodes; a head with optional single element (the *************** *** 1265,1287 **** /* Standard appending of delimiters. */ ! if (ppos > 1) return(1); - return(append_delims(m, line, pos, buf)); } static int in_line_argn(MACRO_PROT_ARGS) { ! int la, flushed, j, maxargs; enum margserr ac; enum margverr av; struct mdoc_arg *arg; char *p; enum mdoct ntok; /* * A line macro that has a fixed number of arguments (maxargs). * Only open the scope once the first non-leading-punctuation is --- 1292,1316 ---- /* Standard appending of delimiters. */ ! if ( ! nl) return(1); return(append_delims(m, line, pos, buf)); } + /* ARGSUSED */ static int in_line_argn(MACRO_PROT_ARGS) { ! int la, flushed, j, maxargs, nl; enum margserr ac; enum margverr av; struct mdoc_arg *arg; char *p; enum mdoct ntok; + nl = MDOC_NEWLINE & m->flags; + /* * A line macro that has a fixed number of arguments (maxargs). * Only open the scope once the first non-leading-punctuation is *************** *** 1405,1412 **** if ( ! flushed && ! rew_elem(m, tok)) return(0); ! ! if (ppos > 1) return(1); return(append_delims(m, line, pos, buf)); } --- 1434,1440 ---- if ( ! flushed && ! rew_elem(m, tok)) return(0); ! if ( ! nl) return(1); return(append_delims(m, line, pos, buf)); } *************** *** 1482,1494 **** static int 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)); /* If we're a nested call, same place. */ ! if (ppos > 1) return(in_line(m, tok, line, ppos, pos, buf)); /* --- 1510,1525 ---- static int ctx_synopsis(MACRO_PROT_ARGS) { + int nl; + nl = MDOC_NEWLINE & m->flags; + /* 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)); /* If we're a nested call, same place. */ ! if ( ! nl) return(in_line(m, tok, line, ppos, pos, buf)); /* *************** *** 1516,1540 **** * macro is encountered. */ static int ! phrase(struct mdoc *m, int line, int ppos, char *buf) { int la, pos; ! enum margserr ac; enum mdoct ntok; char *p; for (pos = ppos; ; ) { la = pos; /* Note: no calling context! */ ! ac = mdoc_zargs(m, line, &pos, buf, 0, &p); ! if (ARGS_ERROR == ac) return(0); ! if (ARGS_EOLN == ac) break; ! ntok = ARGS_QWORD == ac ? MDOC_MAX : lookup_raw(p); if (MDOC_MAX == ntok) { if ( ! mdoc_word_alloc(m, line, la, p)) --- 1547,1580 ---- * macro is encountered. */ static int ! phrase(struct mdoc *m, int line, int ppos, char *buf, ! enum margserr ac, int count) { int la, pos; ! enum margserr aac; enum mdoct ntok; char *p; + assert(ARGS_PHRASE == ac || + ARGS_PEND == ac || + ARGS_PPHRASE == ac); + + if (count && ARGS_PPHRASE == ac) + return(mdoc_word_alloc(m, line, ppos, &buf[ppos])); + for (pos = ppos; ; ) { la = pos; /* Note: no calling context! */ ! aac = mdoc_zargs(m, line, &pos, buf, 0, &p); ! if (ARGS_ERROR == aac) return(0); ! if (ARGS_EOLN == aac) break; ! ntok = ARGS_QWORD == aac || ARGS_PEND == ac ? ! MDOC_MAX : lookup_raw(p); if (MDOC_MAX == ntok) { if ( ! mdoc_word_alloc(m, line, la, p))