diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-11-29 03:37:44 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-11-29 03:37:44 +0000 |
commit | 3d06fba36aaf6d0e66e60fba15af8837414b9ff9 (patch) | |
tree | 16b27bee82e04643322d42523d978a2b926670c4 /mdoc_macro.c | |
parent | 857b9aac8422fa0bebd1d83b87c8fbf4d7a1f044 (diff) | |
download | mandoc-3d06fba36aaf6d0e66e60fba15af8837414b9ff9.tar.gz |
Provide a helper function macro_or_word() and use it to prune the
same chunk of argument parsing code out of five of the eight callback
functions. The other three have too much special handling to
participate.
As a bonus, let lookup() and mdoc_args() deal with line macros and
retire the lookup_raw() helper and the mdoc_zargs() internal interface
function.
No functional change, minus 40 lines of code.
Diffstat (limited to 'mdoc_macro.c')
-rw-r--r-- | mdoc_macro.c | 177 |
1 files changed, 62 insertions, 115 deletions
diff --git a/mdoc_macro.c b/mdoc_macro.c index 789aa4dc..11dbf844 100644 --- a/mdoc_macro.c +++ b/mdoc_macro.c @@ -54,10 +54,10 @@ static void dword(struct mdoc *, int, int, const char *, enum mdelim, int); static void append_delims(struct mdoc *, int, int *, char *); static enum mdoct lookup(enum mdoct, const char *); -static enum mdoct lookup_raw(const char *); +static int macro_or_word(MACRO_PROT_ARGS, int); static int make_pending(struct mdoc_node *, enum mdoct, struct mdoc *, int, int); -static void phrase(struct mdoc *, int, int, char *); +static void phrase(struct mdoc *, int, int *, char *); static enum mdoct rew_alt(enum mdoct); static enum rew rew_dohalt(enum mdoct, enum mdoc_type, const struct mdoc_node *); @@ -240,29 +240,19 @@ mdoc_macroend(struct mdoc *mdoc) } /* - * Look up a macro from within a subsequent context. + * Look up the macro at *p called by "from", + * or as a line macro if from == MDOC_MAX. */ static enum mdoct lookup(enum mdoct from, const char *p) { - - if ( ! (MDOC_PARSED & mdoc_macros[from].flags)) - return(MDOC_MAX); - return(lookup_raw(p)); -} - -/* - * Lookup a macro following the initial line macro. - */ -static enum mdoct -lookup_raw(const char *p) -{ enum mdoct res; - if (MDOC_MAX == (res = mdoc_hash_find(p))) - return(MDOC_MAX); - if (MDOC_CALLABLE & mdoc_macros[res].flags) - return(res); + if (from == MDOC_MAX || mdoc_macros[from].flags & MDOC_PARSED) { + res = mdoc_hash_find(p); + if (res != MDOC_MAX && mdoc_macros[res].flags & MDOC_CALLABLE) + return(res); + } return(MDOC_MAX); } @@ -633,17 +623,15 @@ dword(struct mdoc *mdoc, int line, int col, const char *p, static void append_delims(struct mdoc *mdoc, int line, int *pos, char *buf) { - int la; - enum margserr ac; char *p; + int la; if (buf[*pos] == '\0') return; for (;;) { la = *pos; - ac = mdoc_zargs(mdoc, line, pos, buf, &p); - if (ac == ARGS_EOLN) + if (mdoc_args(mdoc, line, pos, buf, MDOC_MAX, &p) == ARGS_EOLN) break; dword(mdoc, line, la, p, DELIM_MAX, 1); @@ -665,6 +653,40 @@ append_delims(struct mdoc *mdoc, int line, int *pos, char *buf) } /* + * Parse one word. + * If it is a macro, call it and return 1. + * Otherwise, allocate it and return 0. + */ +static int +macro_or_word(MACRO_PROT_ARGS, int parsed) +{ + char *p; + enum mdoct ntok; + + p = buf + ppos; + ntok = MDOC_MAX; + if (mdoc->flags & MDOC_PHRASELIT) + /* nothing */; + else if (*p == '"') + p++; + else if (parsed) + ntok = lookup(tok, p); + + if (ntok == MDOC_MAX) { + dword(mdoc, line, ppos, p, DELIM_MAX, tok == MDOC_MAX || + mdoc_macros[tok].flags & MDOC_JOIN); + return(0); + } else { + if (mdoc_macros[tok].fp == in_line_eoln) + rew_elem(mdoc, tok); + mdoc_macro(mdoc, ntok, line, ppos, pos, buf); + if (tok == MDOC_MAX) + append_delims(mdoc, line, pos, buf); + return(1); + } +} + +/* * Close out block partial/full explicit. */ static void @@ -1025,12 +1047,11 @@ in_line(MACRO_PROT_ARGS) static void blk_full(MACRO_PROT_ARGS) { - int la, nl, nparsed; + int la, nl, parsed; 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; char *p; @@ -1077,9 +1098,9 @@ blk_full(MACRO_PROT_ARGS) * parsed, even though `It' macros in general are parsed. */ - nparsed = tok == MDOC_It && - mdoc->last->parent->tok == MDOC_Bl && - mdoc->last->parent->norm->Bl.type == LIST_diag; + parsed = tok != MDOC_It || + mdoc->last->parent->tok != MDOC_Bl || + mdoc->last->parent->norm->Bl.type != LIST_diag; /* * The `Nd' macro has all arguments in its body: it's a hybrid @@ -1160,20 +1181,13 @@ blk_full(MACRO_PROT_ARGS) mdoc->flags |= MDOC_PPHRASE; if (ac == ARGS_PEND && lac == ARGS_PPHRASE) mdoc->flags |= MDOC_PPHRASE; - phrase(mdoc, line, la, buf); + phrase(mdoc, line, &la, buf); mdoc->flags &= ~MDOC_PPHRASE; continue; } - ntok = nparsed || ac == ARGS_QWORD ? - MDOC_MAX : lookup(tok, p); - - if (ntok != MDOC_MAX) { - mdoc_macro(mdoc, ntok, line, la, pos, buf); + if (macro_or_word(mdoc, tok, line, la, pos, buf, parsed)) break; - } - dword(mdoc, line, la, p, DELIM_MAX, - MDOC_JOIN & mdoc_macros[tok].flags); } if (head == NULL) @@ -1214,7 +1228,6 @@ static void blk_part_imp(MACRO_PROT_ARGS) { int la, nl; - enum mdoct ntok; enum margserr ac; char *p; struct mdoc_node *blk; /* saved block context */ @@ -1257,14 +1270,8 @@ blk_part_imp(MACRO_PROT_ARGS) if (body == NULL) body = mdoc_body_alloc(mdoc, line, ppos, tok); - ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup(tok, p); - - if (ntok != MDOC_MAX) { - mdoc_macro(mdoc, ntok, line, la, pos, buf); + if (macro_or_word(mdoc, tok, line, la, pos, buf, 1)) break; - } - dword(mdoc, line, la, p, DELIM_MAX, - MDOC_JOIN & mdoc_macros[tok].flags); } if (body == NULL) body = mdoc_body_alloc(mdoc, line, ppos, tok); @@ -1308,7 +1315,6 @@ blk_part_exp(MACRO_PROT_ARGS) struct mdoc_node *head; /* keep track of head */ struct mdoc_node *body; /* keep track of body */ char *p; - enum mdoct ntok; nl = MDOC_NEWLINE & mdoc->flags; @@ -1356,13 +1362,8 @@ blk_part_exp(MACRO_PROT_ARGS) } assert(head != NULL && body != NULL); - ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup(tok, p); - if (ntok != MDOC_MAX) { - mdoc_macro(mdoc, ntok, line, la, pos, buf); + if (macro_or_word(mdoc, tok, line, la, pos, buf, 1)) break; - } - dword(mdoc, line, la, p, DELIM_MAX, - MDOC_JOIN & mdoc_macros[tok].flags); } /* Clean-up to leave in a consistent state. */ @@ -1473,12 +1474,7 @@ static void in_line_eoln(MACRO_PROT_ARGS) { int la; - enum margserr ac; struct mdoc_arg *arg; - char *p; - enum mdoct ntok; - - assert( ! (MDOC_PARSED & mdoc_macros[tok].flags)); if (tok == MDOC_Pp) rew_sub(MDOC_BLOCK, mdoc, MDOC_Nm, line, ppos); @@ -1486,27 +1482,13 @@ in_line_eoln(MACRO_PROT_ARGS) mdoc_argv(mdoc, line, tok, &arg, pos, buf); mdoc_elem_alloc(mdoc, line, ppos, tok, arg); - /* Parse argument terms. */ - for (;;) { la = *pos; - ac = mdoc_args(mdoc, line, pos, buf, tok, &p); - if (ac == ARGS_EOLN) + if (mdoc_args(mdoc, line, pos, buf, tok, NULL) == ARGS_EOLN) break; - - ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup(tok, p); - - if (ntok != MDOC_MAX) { - rew_elem(mdoc, tok); - mdoc_macro(mdoc, ntok, line, la, pos, buf); + if (macro_or_word(mdoc, tok, line, la, pos, buf, 1)) return; - } - dword(mdoc, line, la, p, DELIM_MAX, - MDOC_JOIN & mdoc_macros[tok].flags); } - - /* Close out (no delimiters). */ - rew_elem(mdoc, tok); } @@ -1530,39 +1512,20 @@ ctx_synopsis(MACRO_PROT_ARGS) * macro is encountered. */ static void -phrase(struct mdoc *mdoc, int line, int ppos, char *buf) +phrase(struct mdoc *mdoc, int line, int *pos, char *buf) { - int la, pos; - enum margserr ac; - enum mdoct ntok; - char *p; - - for (pos = ppos; ; ) { - la = pos; - - ac = mdoc_zargs(mdoc, line, &pos, buf, &p); - if (ac == ARGS_EOLN) - break; - - ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup_raw(p); + int la; - if (ntok != MDOC_MAX) { - mdoc_macro(mdoc, ntok, line, la, &pos, buf); - append_delims(mdoc, line, &pos, buf); - return; - } - dword(mdoc, line, la, p, DELIM_MAX, 1); - } + do + la = *pos; + while (mdoc_args(mdoc, line, pos, buf, MDOC_MAX, NULL) != ARGS_EOLN && + !macro_or_word(mdoc, MDOC_MAX, line, la, pos, buf, 1)); } static void phrase_ta(MACRO_PROT_ARGS) { struct mdoc_node *n; - int la; - enum mdoct ntok; - enum margserr ac; - char *p; /* Make sure we are in a column list or ignore this macro. */ @@ -1579,21 +1542,5 @@ phrase_ta(MACRO_PROT_ARGS) rew_sub(MDOC_BODY, mdoc, MDOC_It, line, ppos); mdoc_body_alloc(mdoc, line, ppos, MDOC_It); - - for (;;) { - la = *pos; - ac = mdoc_zargs(mdoc, line, pos, buf, &p); - if (ac == ARGS_EOLN) - break; - - ntok = ac == ARGS_QWORD ? MDOC_MAX : lookup_raw(p); - - if (ntok != MDOC_MAX) { - mdoc_macro(mdoc, ntok, line, la, pos, buf); - append_delims(mdoc, line, pos, buf); - return; - } - dword(mdoc, line, la, p, DELIM_MAX, - MDOC_JOIN & mdoc_macros[tok].flags); - } + phrase(mdoc, line, pos, buf); } |