summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-02-02 15:02:49 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-02-02 15:02:49 +0000
commit04eac2ffb37cd99c1330662198af9728479381bd (patch)
tree61328f721611cc616bf4ed605b57c2309587e8c5
parent5aa5efecc3c1ed935aac943e15689f4388db9bca (diff)
downloadmandoc-04eac2ffb37cd99c1330662198af9728479381bd.tar.gz
Get rid of all remaining calls to rew_sub() where the target block
is known. This only leaves three that do actual searching. No functional change, minus 30 lines of code.
-rw-r--r--mdoc_macro.c101
1 files changed, 36 insertions, 65 deletions
diff --git a/mdoc_macro.c b/mdoc_macro.c
index e2b4d909..598b32dd 100644
--- a/mdoc_macro.c
+++ b/mdoc_macro.c
@@ -35,9 +35,7 @@ enum rew { /* see rew_dohalt() */
REWIND_NONE,
REWIND_THIS,
REWIND_MORE,
- REWIND_FORCE,
- REWIND_LATER,
- REWIND_ERROR
+ REWIND_FORCE
};
static void blk_full(MACRO_PROT_ARGS);
@@ -366,8 +364,6 @@ rew_alt(enum mdoct tok)
* REWIND_THIS: *p matches tok, so rewind *p and nothing else.
* REWIND_MORE: *p is implicit, rewind it and keep searching for tok.
* REWIND_FORCE: *p is explicit, but tok is full, force rewinding *p.
- * REWIND_LATER: *p is explicit and still open, postpone rewinding.
- * REWIND_ERROR: No tok block is open at all.
*/
static enum rew
rew_dohalt(enum mdoct tok, enum mdoc_type type,
@@ -381,9 +377,7 @@ rew_dohalt(enum mdoct tok, enum mdoc_type type,
* instance anyway.
*/
if (MDOC_ROOT == p->type)
- return(MDOC_BLOCK == type &&
- MDOC_EXPLICIT & mdoc_macros[tok].flags ?
- REWIND_ERROR : REWIND_NONE);
+ return(REWIND_NONE);
/*
* When starting to rewind, skip plain text
@@ -398,8 +392,7 @@ rew_dohalt(enum mdoct tok, enum mdoc_type type,
*/
tok = rew_alt(tok);
if (tok == p->tok)
- return(p->end ? REWIND_NONE :
- type == p->type ? REWIND_THIS : REWIND_MORE);
+ return(type == p->type ? REWIND_THIS : REWIND_MORE);
/*
* While elements do require rewinding for themselves,
@@ -413,24 +406,10 @@ rew_dohalt(enum mdoct tok, enum mdoc_type type,
* Blocks delimiting our target token get REWIND_NONE.
*/
switch (tok) {
- case MDOC_Bl:
- if (MDOC_It == p->tok)
- return(REWIND_MORE);
- break;
case MDOC_It:
if (MDOC_BODY == p->type && MDOC_Bl == p->tok)
return(REWIND_NONE);
break;
- /*
- * XXX Badly nested block handling still fails badly
- * when one block is breaking two blocks of the same type.
- * This is an incomplete and extremely ugly workaround,
- * required to let the OpenBSD tree build.
- */
- case MDOC_Oo:
- if (MDOC_Op == p->tok)
- return(REWIND_MORE);
- break;
case MDOC_Nm:
return(REWIND_NONE);
case MDOC_Nd:
@@ -452,24 +431,19 @@ rew_dohalt(enum mdoct tok, enum mdoc_type type,
/*
* Default block rewinding rules.
- * In particular, always skip block end markers,
- * and let all blocks rewind Nm children.
+ * In particular, let all blocks rewind Nm children.
* Do not warn again when closing a block,
* since closing the body already warned.
*/
- if (ENDBODY_NOT != p->end || MDOC_Nm == p->tok ||
- MDOC_BLOCK == type || (MDOC_BLOCK == p->type &&
- ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)))
+ if (MDOC_Nm == p->tok ||
+ MDOC_BLOCK == type || MDOC_BLOCK == p->type)
return(REWIND_MORE);
/*
* By default, closing out full blocks
- * forces closing of broken explicit blocks,
- * while closing out partial blocks
- * allows delayed rewinding by default.
+ * forces closing of broken explicit blocks.
*/
- return (&blk_full == mdoc_macros[tok].fp ?
- REWIND_FORCE : REWIND_LATER);
+ return (REWIND_FORCE);
}
static void
@@ -489,7 +463,7 @@ rew_elem(struct mdoc *mdoc, enum mdoct tok)
* We are trying to close a block identified by tok,
* but the child block *broken is still open.
* Thus, postpone closing the tok block
- * until the rew_sub call closing *broken.
+ * until the rew_pending() call closing *broken.
*/
static int
make_pending(struct mdoc_node *broken, enum mdoct tok,
@@ -606,16 +580,6 @@ rew_sub(enum mdoc_type t, struct mdoc *mdoc,
to = n;
n = n->parent;
continue;
- case REWIND_LATER:
- if (make_pending(n, tok, mdoc, line, ppos) ||
- t != MDOC_BLOCK)
- return;
- /* FALLTHROUGH */
- case REWIND_ERROR:
- mandoc_msg(MANDOCERR_BLK_NOTOPEN,
- mdoc->parse, line, ppos,
- mdoc_macronames[tok]);
- return;
}
break;
}
@@ -800,9 +764,9 @@ blk_exp_close(MACRO_PROT_ARGS)
break;
/*
- * When there is a pending sub block,
- * postpone closing out the current block
- * until the rew_sub() closing out the sub-block.
+ * When there is a pending sub block, postpone
+ * closing out the current block until the
+ * rew_pending() closing out the sub-block.
*/
make_pending(later, tok, mdoc, line, ppos);
@@ -860,7 +824,8 @@ blk_exp_close(MACRO_PROT_ARGS)
mdoc->parse, line, ppos,
"%s %s", mdoc_macronames[tok],
buf + *pos);
- rew_sub(MDOC_BLOCK, mdoc, tok, line, ppos);
+ if (endbody == NULL)
+ rew_pending(mdoc, n);
return;
}
@@ -1175,7 +1140,8 @@ blk_full(MACRO_PROT_ARGS)
* reopen our scope if the last parse was a
* phrase or partial phrase.
*/
- rew_sub(MDOC_BODY, mdoc, tok, line, ppos);
+ if (body != NULL)
+ rew_last(mdoc, body);
body = mdoc_body_alloc(mdoc, line, ppos, tok);
break;
}
@@ -1209,8 +1175,7 @@ blk_full(MACRO_PROT_ARGS)
* head; if we have, rewind that instead.
*/
- rew_sub(body ? MDOC_BODY : MDOC_HEAD,
- mdoc, tok, line, ppos);
+ rew_last(mdoc, body == NULL ? head : body);
body = mdoc_body_alloc(mdoc, line, ppos, tok);
/*
@@ -1244,7 +1209,7 @@ blk_full(MACRO_PROT_ARGS)
/*
* If there is an open (i.e., unvalidated) sub-block requiring
* explicit close-out, postpone switching the current block from
- * head to body until the rew_sub() call closing out that
+ * head to body until the rew_pending() call closing out that
* sub-block.
*/
for (n = mdoc->last; n && n != head; n = n->parent) {
@@ -1258,12 +1223,12 @@ blk_full(MACRO_PROT_ARGS)
/* Close out scopes to remain in a consistent state. */
- rew_sub(MDOC_HEAD, mdoc, tok, line, ppos);
- mdoc_body_alloc(mdoc, line, ppos, tok);
+ rew_last(mdoc, head);
+ body = mdoc_body_alloc(mdoc, line, ppos, tok);
out:
if (mdoc->flags & MDOC_FREECOL) {
- rew_sub(MDOC_BODY, mdoc, tok, line, ppos);
- rew_sub(MDOC_BLOCK, mdoc, tok, line, ppos);
+ rew_last(mdoc, body);
+ rew_last(mdoc, blk);
mdoc->flags &= ~MDOC_FREECOL;
}
}
@@ -1321,8 +1286,8 @@ blk_part_imp(MACRO_PROT_ARGS)
/*
* If there is an open sub-block requiring explicit close-out,
- * postpone closing out the current block
- * until the rew_sub() call closing out the sub-block.
+ * postpone closing out the current block until the
+ * rew_pending() call closing out the sub-block.
*/
for (n = mdoc->last; n && n != body && n != blk->parent;
@@ -1564,14 +1529,20 @@ ctx_synopsis(MACRO_PROT_ARGS)
static void
phrase_ta(MACRO_PROT_ARGS)
{
- struct mdoc_node *n;
+ struct mdoc_node *body, *n;
/* Make sure we are in a column list or ignore this macro. */
- n = mdoc->last;
- while (n != NULL &&
- (n->tok != MDOC_Bl || n->flags & (MDOC_VALID | MDOC_BREAK)))
- n = n->parent;
+ body = NULL;
+ for (n = mdoc->last; n != NULL; n = n->parent) {
+ if (n->flags & (MDOC_VALID | MDOC_BREAK))
+ continue;
+ if (n->tok == MDOC_It && n->type == MDOC_BODY)
+ body = n;
+ if (n->tok == MDOC_Bl)
+ break;
+ }
+
if (n == NULL || n->norm->Bl.type != LIST_column) {
mandoc_msg(MANDOCERR_TA_STRAY, mdoc->parse,
line, ppos, "Ta");
@@ -1580,7 +1551,7 @@ phrase_ta(MACRO_PROT_ARGS)
/* Advance to the next column. */
- rew_sub(MDOC_BODY, mdoc, MDOC_It, line, ppos);
+ rew_last(mdoc, body);
mdoc_body_alloc(mdoc, line, ppos, MDOC_It);
parse_rest(mdoc, MDOC_MAX, line, pos, buf);
}