aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-11-29 03:37:44 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-11-29 03:37:44 +0000
commit51e313e588be7d0035542c2c7b1fb7fbbe768e34 (patch)
tree5893269576d9c6b09b0002a68c141f44de14b641
parentaaa501aed947d338340f598a6c435126af70b9a4 (diff)
downloadmandoc-51e313e588be7d0035542c2c7b1fb7fbbe768e34.tar.gz
mandoc-51e313e588be7d0035542c2c7b1fb7fbbe768e34.tar.zst
mandoc-51e313e588be7d0035542c2c7b1fb7fbbe768e34.zip
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.
-rw-r--r--libmdoc.h4
-rw-r--r--mdoc_argv.c17
-rw-r--r--mdoc_macro.c179
3 files changed, 70 insertions, 130 deletions
diff --git a/libmdoc.h b/libmdoc.h
index 7a2c63e8..056e9c9b 100644
--- a/libmdoc.h
+++ b/libmdoc.h
@@ -1,4 +1,4 @@
-/* $Id: libmdoc.h,v 1.94 2014/11/28 23:21:32 schwarze Exp $ */
+/* $Id: libmdoc.h,v 1.95 2014/11/29 03:37:44 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -125,8 +125,6 @@ void mdoc_argv(struct mdoc *, int, enum mdoct,
void mdoc_argv_free(struct mdoc_arg *);
enum margserr mdoc_args(struct mdoc *, int,
int *, char *, enum mdoct, char **);
-enum margserr mdoc_zargs(struct mdoc *, int,
- int *, char *, char **);
void mdoc_macroend(struct mdoc *);
enum mdelim mdoc_isdelim(const char *);
diff --git a/mdoc_argv.c b/mdoc_argv.c
index aebbac3a..3e7fabd2 100644
--- a/mdoc_argv.c
+++ b/mdoc_argv.c
@@ -412,22 +412,17 @@ argn_free(struct mdoc_arg *p, int iarg)
}
enum margserr
-mdoc_zargs(struct mdoc *mdoc, int line, int *pos, char *buf, char **v)
-{
-
- return(args(mdoc, line, pos, buf, ARGSFL_NONE, v));
-}
-
-enum margserr
mdoc_args(struct mdoc *mdoc, int line, int *pos,
char *buf, enum mdoct tok, char **v)
{
- enum argsflag fl;
struct mdoc_node *n;
+ char *v_local;
+ enum argsflag fl;
- fl = mdocargs[tok].flags;
-
- if (MDOC_It != tok)
+ if (v == NULL)
+ v = &v_local;
+ fl = tok == MDOC_MAX ? ARGSFL_NONE : mdocargs[tok].flags;
+ if (tok != MDOC_It)
return(args(mdoc, line, pos, buf, fl, v));
/*
diff --git a/mdoc_macro.c b/mdoc_macro.c
index 177ef874..d43416a7 100644
--- a/mdoc_macro.c
+++ b/mdoc_macro.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_macro.c,v 1.152 2014/11/28 23:21:32 schwarze Exp $ */
+/* $Id: mdoc_macro.c,v 1.153 2014/11/29 03:37:44 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -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);
}