source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Simplify and reindent make_pending().
@ 2015-02-02 19:23 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2015-02-02 19:23 UTC (permalink / raw)
  To: source

Log Message:
-----------
Simplify and reindent make_pending().  No functional change 
except that some error messages become less confusing.
Now the function is almost readable (but still requires 
nineteen lines of comments for fourteen lines of code).

Modified Files:
--------------
    mdocml:
        mdoc_macro.c

Revision Data
-------------
Index: mdoc_macro.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_macro.c,v
retrieving revision 1.168
retrieving revision 1.169
diff -Lmdoc_macro.c -Lmdoc_macro.c -u -p -r1.168 -r1.169
--- mdoc_macro.c
+++ mdoc_macro.c
@@ -471,71 +471,64 @@ make_pending(struct mdoc *mdoc, struct m
 {
 	struct mdoc_node *n;
 
-	/* Iterate backwards, searching for the breaker. */
+	mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, line, ppos,
+	    "%s breaks %s", mdoc_macronames[breaker->tok],
+	    mdoc_macronames[broken->tok]);
+
+	/*
+	 * If the *broken block (Z) is already broken by a block (B)
+	 * contained in the breaker (A), make the breaker pending
+	 * on that inner breaker (B).  Graphically,
+	 *
+	 * breaker=[A! broken=n=[B!->A (old broken=)[Z->B B] A] Z]
+	 *
+	 * In these graphics, "->" indicates the "pending" pointer and
+	 * "!" indicates the MDOC_BREAK flag.  Each of the cases gets
+	 * one additional pointer (B->A) and one additional flag (A!).
+	 */
 
-	for (n = broken->parent; ; n = n->parent) {
-
-		/*
-		 * If the *broken block (Z) is already broken and we
-		 * encounter its breaker (B), make the tok block (A)
-		 * pending on that inner breaker (B).
-		 * Graphically, [A n=[B! broken=[Z->B B] tok=A] Z]
-		 * becomes [A broken=[B! [Z->B B] tok=A] Z]
-		 * and finally [A! [B!->A [Z->B B] A] Z].
-		 * In these graphics, "->" indicates the "pending"
-		 * pointer and "!" indicates the MDOC_BREAK flag.
-		 * Each of the cases gets one additional pointer (B->A)
-		 * and one additional flag (A!).
-		 */
-		if (n == broken->pending) {
+	for (n = broken->parent; ; n = n->parent)
+		if (n == broken->pending)
 			broken = n;
-			continue;
-		}
-
-		if (n != breaker)
-			continue;
+		else if (n == breaker)
+			break;
 
-		/*
-		 * Found the breaker.
-		 * If another, outer breaker (X) is already pending on
-		 * the *broken block (B), we must not clobber the link
-		 * to the outer breaker, but make it pending on the
-		 * new, now inner breaker (A).
-		 * Graphically, [X! breaker=[A broken=[B->X X] tok=A] B]
-		 * becomes [X! breaker=[A->X broken=[B X] tok=A] B]
-		 * and finally [X! [A!->X [B->A X] A] B].
-		 */
-		if (broken->pending) {
-			struct mdoc_node *taker;
+	/*
+	 * Found the breaker.
+	 *
+	 * If another, outer breaker (X) is already pending on
+	 * the *broken block (B), we must not clobber the link
+	 * to the outer breaker, but make it pending on the new,
+	 * now inner breaker (A).  Graphically,
+	 *
+	 * [X! n=breaker=[A!->X broken=[B(->X)->A X] A] B].
+	 */
 
-			/*
-			 * If the inner breaker (A) is already broken,
-			 * too, it cannot take on the outer breaker (X)
-			 * but must hand it on to its own breakers (Y):
-			 * [X! [Y! breaker=[A->Y Y] broken=[B->X X] tok=A] B]
-			 * [X! take=[Y!->X brea=[A->Y Y] brok=[B X] tok=A] B]
-			 * and finally [X! [Y!->X [A!->Y Y] [B->A X] A] B].
-			 */
-			taker = breaker;
-			while (taker->pending)
-				taker = taker->pending;
-			taker->pending = broken->pending;
-		}
+	if (broken->pending != NULL) {
+		n = breaker;
 
 		/*
-		 * Now we have reduced the situation to the simplest
-		 * case, which is just breaker=[A broken=[B tok=A] B]
-		 * and becomes [A! [B->A A] B].
+		 * If the inner breaker (A) is already broken, too,
+		 * it cannot take on the outer breaker (X) but must
+		 * hand it on to its own breakers (Y).  Graphically,
+		 *
+		 * [X! n=[Y!->X breaker=[A!->Y Y] broken=[B(->X)->A X] A] B]
 		 */
-		broken->pending = breaker;
-		breaker->flags |= MDOC_BREAK;
-		if (breaker->body != NULL)
-			breaker->body->flags |= MDOC_BREAK;
-		mandoc_vmsg(MANDOCERR_BLK_NEST, mdoc->parse, line, ppos,
-		    "%s breaks %s", mdoc_macronames[breaker->tok],
-		    mdoc_macronames[broken->tok]);
-		return;
+
+		while (n->pending)
+			n = n->pending;
+		n->pending = broken->pending;
 	}
+
+	/*
+	 * Now we have reduced the situation to the simplest case:
+	 * breaker=[A! broken=[B->A A] B].
+	 */
+
+	broken->pending = breaker;
+	breaker->flags |= MDOC_BREAK;
+	if (breaker->body != NULL)
+		breaker->body->flags |= MDOC_BREAK;
 }
 
 static void
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2015-02-02 19:23 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-02 19:23 mdocml: Simplify and reindent make_pending() schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).