=================================================================== RCS file: /cvs/mandoc/Attic/macro.c,v retrieving revision 1.67 retrieving revision 1.70 diff -u -p -r1.67 -r1.70 --- mandoc/Attic/macro.c 2009/03/12 02:57:36 1.67 +++ mandoc/Attic/macro.c 2009/03/12 16:30:50 1.70 @@ -1,4 +1,4 @@ -/* $Id: macro.c,v 1.67 2009/03/12 02:57:36 kristaps Exp $ */ +/* $Id: macro.c,v 1.70 2009/03/12 16:30:50 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -40,7 +40,7 @@ static int macro_text(MACRO_PROT_ARGS); static int macro_scoped(MACRO_PROT_ARGS); static int macro_scoped_close(MACRO_PROT_ARGS); static int macro_scoped_line(MACRO_PROT_ARGS); -static int macro_phrase(struct mdoc *, int, char *); +static int macro_phrase(struct mdoc *, int, int, char *); #define REWIND_REWIND (1 << 0) #define REWIND_NOHALT (1 << 1) @@ -89,7 +89,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Ad */ { macro_text, MDOC_PARSED }, /* An */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Ar */ - { macro_constant, 0 }, /* Cd */ + { macro_constant, MDOC_CALLABLE }, /* Cd */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Cm */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Dv */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Er */ @@ -188,6 +188,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Brq */ { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Bro */ { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Brc */ + { macro_constant, 0 }, /* %C */ }; const struct mdoc_macro * const mdoc_macros = __mdoc_macros; @@ -1004,7 +1005,7 @@ macro_scoped(MACRO_PROT_ARGS) * in the columnar output of a macro. They need * special handling. */ - if ( ! macro_phrase(mdoc, line, p)) + if ( ! macro_phrase(mdoc, line, lastarg, buf)) return(0); if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos)) return(0); @@ -1393,8 +1394,6 @@ macro_constant(MACRO_PROT_ARGS) struct mdoc_arg *arg; char *p; - assert( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)); - arg = NULL; for (;;) { @@ -1459,19 +1458,39 @@ macro_phrase(struct mdoc *mdoc, int line, int ppos, ch { int i, la, c; - i = ppos; + for (i = ppos; buf[i]; ) { + assert(' ' != buf[i]); -again: - la = i; - while (buf[i] && ! isspace((unsigned char)buf[i])) - i++; + la = i; + if ('\"' == buf[i]) { + la = ++i; + while (buf[i] && '\"' != buf[i]) + i++; + if (0 == buf[i]) + return(mdoc_err(mdoc, "unterminated quoted parameter")); + } else + while (buf[i] && ! isspace ((unsigned char)buf[i])) + i++; - if (0 == buf[i]) - return(mdoc_word_alloc(mdoc, line, la, buf)); + if (buf[i]) + buf[i++] = 0; - buf[i] = 0; + while (buf[i] && isspace((unsigned char)buf[i])) + i++; - if (MDOC_MAX == (c = mdoc_tokhash_find(mdoc->htab, p))) { - if ( ! mdoc_word_alloc(mdoc, line, + if (MDOC_MAX != (c = mdoc_tokhash_find(mdoc->htab, &buf[la]))) { + if ( ! mdoc_macro(mdoc, c, line, la, &i, buf)) + return(0); + return(append_delims(mdoc, line, &i, buf)); + } + + if ( ! mdoc_word_alloc(mdoc, line, la, &buf[la])) + return(0); + mdoc->next = MDOC_NEXT_SIBLING; + + while (buf[i] && isspace((unsigned char)buf[i])) + i++; } + + return(1); }