=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.18 retrieving revision 1.20 diff -u -p -r1.18 -r1.20 --- mandoc/roff.c 2008/11/29 16:11:42 1.18 +++ mandoc/roff.c 2008/11/30 12:41:45 1.20 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.18 2008/11/29 16:11:42 kristaps Exp $ */ +/* $Id: roff.c,v 1.20 2008/11/30 12:41:45 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -190,7 +190,7 @@ static const struct rofftok tokens[ROFF_MAX] = { { roff_layout, roffarg_Bl, NULL, roffchild_Bl, 0, ROFF_LAYOUT, 0 }, /* Bl */ { roff_close, NULL, roffparent_El, NULL, ROFF_Bl, ROFF_LAYOUT, 0 }, /* El */ { roff_layout, NULL, roffparent_It, NULL, ROFF_It, ROFF_LAYOUT, ROFF_SHALLOW }, /* It */ - { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ad */ + { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ad */ /* FIXME */ { roff_text, roffarg_An, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* An */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ar */ { roff_text, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_QUOTES }, /* Cd */ /* XXX man.4 only */ @@ -696,7 +696,51 @@ rofffindtok(const char *buf) } +#if notyet static int +roffispunct(const char *p) +{ + + if (0 == *p) + return(0); + if (0 != *(p + 1)) + return(0); + + switch (*p) { + case('{'): + /* FALLTHROUGH */ + case('.'): + /* FALLTHROUGH */ + case(','): + /* FALLTHROUGH */ + case(';'): + /* FALLTHROUGH */ + case(':'): + /* FALLTHROUGH */ + case('?'): + /* FALLTHROUGH */ + case('!'): + /* FALLTHROUGH */ + case('('): + /* FALLTHROUGH */ + case(')'): + /* FALLTHROUGH */ + case('['): + /* FALLTHROUGH */ + case(']'): + /* FALLTHROUGH */ + case('}'): + return(1); + default: + break; + } + + return(0); +} +#endif + + +static int rofffindcallable(const char *name) { int c; @@ -1011,20 +1055,27 @@ roff_text(ROFFCALL_ARGS) } while (*argv) { - if (ROFF_MAX != (c = rofffindcallable(*argv))) { - if (NULL == tokens[c].cb) { - roff_err(tree, *argv, "unsupported " - "macro `%s'", - toknames[c]); + if (ROFF_MAX == (c = rofffindcallable(*argv))) { + if ( ! (*tree->cb.roffdata)(tree->arg, *argv++)) return(0); - } - if ( ! (*tokens[c].cb)(c, tree, - argv, ROFF_ENTER)) - return(0); - break; + continue; } - if ( ! (*tree->cb.roffdata)(tree->arg, *argv++)) + + /* + * A sub-command has been found. Execute it and + * discontinue parsing for arguments. + */ + + if (NULL == tokens[c].cb) { + roff_err(tree, *argv, "unsupported macro `%s'", + toknames[c]); return(0); + } + + if ( ! (*tokens[c].cb)(c, tree, argv, ROFF_ENTER)) + return(0); + + break; } return((*tree->cb.roffout)(tree->arg, tok));