source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Delete the redundant "nchild" member of struct roff_node,
@ 2016-01-08 17:48 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2016-01-08 17:48 UTC (permalink / raw)
  To: source

Log Message:
-----------
Delete the redundant "nchild" member of struct roff_node, replacing
most uses by one, a few by two pointer checks, and only one by a
tiny loop - not only making data smaller, but code shorter as well.

This gets rid of an implicit invariant that confused both static
analysis tools and human auditors.  No functional change.

Modified Files:
--------------
    mdocml:
        man_html.c
        man_macro.c
        man_term.c
        man_validate.c
        mandoc.3
        mandocdb.c
        mdoc_html.c
        mdoc_man.c
        mdoc_term.c
        mdoc_validate.c
        roff.c
        roff.h

Revision Data
-------------
Index: man_term.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/man_term.c,v
retrieving revision 1.186
retrieving revision 1.187
diff -Lman_term.c -Lman_term.c -u -p -r1.186 -r1.187
--- man_term.c
+++ man_term.c
@@ -219,7 +219,7 @@ static int
 pre_ll(DECL_ARGS)
 {
 
-	term_setwidth(p, n->nchild ? n->child->string : NULL);
+	term_setwidth(p, n->child != NULL ? n->child->string : NULL);
 	return 0;
 }
 
Index: roff.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/roff.c,v
retrieving revision 1.283
retrieving revision 1.284
diff -Lroff.c -Lroff.c -u -p -r1.283 -r1.284
--- roff.c
+++ roff.c
@@ -1024,7 +1024,6 @@ roff_node_append(struct roff_man *man, s
 	default:
 		abort();
 	}
-	n->parent->nchild++;
 	man->last = n;
 
 	switch (n->type) {
@@ -1169,7 +1168,6 @@ roff_node_unlink(struct roff_man *man, s
 	/* Adjust parent. */
 
 	if (n->parent != NULL) {
-		n->parent->nchild--;
 		if (n->parent->child == n)
 			n->parent->child = n->next;
 		if (n->parent->last == n)
@@ -1211,7 +1209,6 @@ roff_node_delete(struct roff_man *man, s
 
 	while (n->child != NULL)
 		roff_node_delete(man, n->child);
-	assert(n->nchild == 0);
 	roff_node_unlink(man, n);
 	roff_node_free(n);
 }
Index: mdoc_validate.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_validate.c,v
retrieving revision 1.300
retrieving revision 1.301
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.300 -r1.301
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -1,7 +1,7 @@
 /*	$Id$ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010-2016 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -1278,7 +1278,8 @@ post_bl_head(POST_ARGS)
 
 	argv = nbl->args->argv + j;
 	i = argv->sz;
-	argv->sz += nh->nchild;
+	for (nch = nh->child; nch != NULL; nch = nch->next)
+		argv->sz++;
 	argv->value = mandoc_reallocarray(argv->value,
 	    argv->sz, sizeof(char *));
 
@@ -1291,7 +1292,6 @@ post_bl_head(POST_ARGS)
 		nnext = nch->next;
 		roff_node_delete(NULL, nch);
 	}
-	nh->nchild = 0;
 	nh->child = NULL;
 }
 
@@ -1352,14 +1352,11 @@ post_bl(POST_ARGS)
 		 */
 
 		assert(nchild->prev == NULL);
-		if (--nbody->nchild == 0) {
-			nbody->child = NULL;
+		nbody->child = nnext;
+		if (nnext == NULL)
 			nbody->last  = NULL;
-			assert(nnext == NULL);
-		} else {
-			nbody->child = nnext;
+		else
 			nnext->prev = NULL;
-		}
 
 		/*
 		 * Relink this child.
@@ -1370,7 +1367,6 @@ post_bl(POST_ARGS)
 		nchild->next   = nblock;
 
 		nblock->prev = nchild;
-		nparent->nchild++;
 		if (nprev == NULL)
 			nparent->child = nchild;
 		else
@@ -1688,7 +1684,9 @@ post_sh_see_also(POST_ARGS)
 	n = mdoc->last->child;
 	lastname = lastsec = lastpunct = NULL;
 	while (n != NULL) {
-		if (n->tok != MDOC_Xr || n->nchild < 2)
+		if (n->tok != MDOC_Xr ||
+		    n->child == NULL ||
+		    n->child->next == NULL)
 			break;
 
 		/* Process one .Xr node. */
@@ -1744,7 +1742,7 @@ child_an(const struct roff_node *n)
 {
 
 	for (n = n->child; n != NULL; n = n->next)
-		if ((n->tok == MDOC_An && n->nchild) || child_an(n))
+		if ((n->tok == MDOC_An && n->child != NULL) || child_an(n))
 			return 1;
 	return 0;
 }
@@ -1931,7 +1929,7 @@ post_par(POST_ARGS)
 		post_prevpar(mdoc);
 
 	if (np->tok == MDOC_sp) {
-		if (np->nchild > 1)
+		if (np->child != NULL && np->child->next != NULL)
 			mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse,
 			    np->child->next->line, np->child->next->pos,
 			    "sp ... %s", np->child->next->string);
Index: man_html.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/man_html.c,v
retrieving revision 1.119
retrieving revision 1.120
diff -Lman_html.c -Lman_html.c -u -p -r1.119 -r1.120
--- man_html.c
+++ man_html.c
@@ -654,7 +654,7 @@ man_UR_pre(MAN_ARGS)
 
 	n = n->child;
 	assert(n->type == ROFFT_HEAD);
-	if (n->nchild) {
+	if (n->child != NULL) {
 		assert(n->child->type == ROFFT_TEXT);
 		PAIR_CLASS_INIT(&tag[0], "link-ext");
 		PAIR_HREF_INIT(&tag[1], n->child->string);
@@ -662,7 +662,7 @@ man_UR_pre(MAN_ARGS)
 	}
 
 	assert(n->next->type == ROFFT_BODY);
-	if (n->next->nchild)
+	if (n->next->child != NULL)
 		n = n->next;
 
 	print_man_nodelist(man, n->child, mh, h);
Index: mandocdb.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mandocdb.c,v
retrieving revision 1.214
retrieving revision 1.215
diff -Lmandocdb.c -Lmandocdb.c -u -p -r1.214 -r1.215
--- mandocdb.c
+++ mandocdb.c
@@ -1446,7 +1446,7 @@ parse_man(struct mpage *mpage, const str
 	char		 byte;
 	size_t		 sz;
 
-	if (NULL == n)
+	if (n == NULL)
 		return;
 
 	/*
@@ -1458,13 +1458,12 @@ parse_man(struct mpage *mpage, const str
 
 	if (n->type == ROFFT_BODY && n->tok == MAN_SH) {
 		body = n;
-		assert(body->parent);
-		if (NULL != (head = body->parent->head) &&
-		    1 == head->nchild &&
-		    NULL != (head = (head->child)) &&
+		if ((head = body->parent->head) != NULL &&
+		    (head = head->child) != NULL &&
+		    head->next == NULL &&
 		    head->type == ROFFT_TEXT &&
-		    0 == strcmp(head->string, "NAME") &&
-		    NULL != body->child) {
+		    strcmp(head->string, "NAME") == 0 &&
+		    body->child != NULL) {
 
 			/*
 			 * Suck the entire NAME section into memory.
@@ -1697,7 +1696,9 @@ parse_mdoc_Va(struct mpage *mpage, const
 	if (n->type != ROFFT_ELEM && n->type != ROFFT_BODY)
 		return 0;
 
-	if (n->nchild == 1 && n->child->type == ROFFT_TEXT)
+	if (n->child != NULL &&
+	    n->child->next == NULL &&
+	    n->child->type == ROFFT_TEXT)
 		return 1;
 
 	cp = NULL;
Index: mdoc_html.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_html.c,v
retrieving revision 1.239
retrieving revision 1.240
diff -Lmdoc_html.c -Lmdoc_html.c -u -p -r1.239 -r1.240
--- mdoc_html.c
+++ mdoc_html.c
@@ -1,7 +1,7 @@
 /*	$Id$ */
 /*
  * Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014, 2015, 2016 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -602,7 +602,7 @@ mdoc_fl_pre(MDOC_ARGS)
 
 	print_text(h, "\\-");
 
-	if ( ! (n->nchild == 0 &&
+	if (!(n->child == NULL &&
 	    (n->next == NULL ||
 	     n->next->type == ROFFT_TEXT ||
 	     n->next->flags & MDOC_LINE)))
@@ -979,9 +979,9 @@ mdoc_bl_pre(MDOC_ARGS)
 static int
 mdoc_ex_pre(MDOC_ARGS)
 {
-	struct tag	*t;
-	struct htmlpair	 tag;
-	int		 nchild;
+	struct htmlpair	  tag;
+	struct tag	 *t;
+	struct roff_node *nch;
 
 	if (n->prev)
 		print_otag(h, TAG_BR, 0, NULL);
@@ -990,24 +990,26 @@ mdoc_ex_pre(MDOC_ARGS)
 
 	print_text(h, "The");
 
-	nchild = n->nchild;
-	for (n = n->child; n; n = n->next) {
-		assert(n->type == ROFFT_TEXT);
+	for (nch = n->child; nch != NULL; nch = nch->next) {
+		assert(nch->type == ROFFT_TEXT);
 
 		t = print_otag(h, TAG_B, 1, &tag);
-		print_text(h, n->string);
+		print_text(h, nch->string);
 		print_tagq(h, t);
 
-		if (nchild > 2 && n->next) {
+		if (nch->next == NULL)
+			continue;
+
+		if (nch->prev != NULL || nch->next->next != NULL) {
 			h->flags |= HTML_NOSPACE;
 			print_text(h, ",");
 		}
 
-		if (n->next && NULL == n->next->next)
+		if (nch->next->next == NULL)
 			print_text(h, "and");
 	}
 
-	if (nchild > 1)
+	if (n->child != NULL && n->child->next != NULL)
 		print_text(h, "utilities exit\\~0");
 	else
 		print_text(h, "utility exits\\~0");
@@ -1695,37 +1697,36 @@ mdoc_rv_pre(MDOC_ARGS)
 {
 	struct htmlpair	 tag;
 	struct tag	*t;
-	int		 nchild;
+	struct roff_node *nch;
 
 	if (n->prev)
 		print_otag(h, TAG_BR, 0, NULL);
 
 	PAIR_CLASS_INIT(&tag, "fname");
 
-	nchild = n->nchild;
-	if (nchild > 0) {
+	if (n->child != NULL) {
 		print_text(h, "The");
 
-		for (n = n->child; n; n = n->next) {
+		for (nch = n->child; nch != NULL; nch = nch->next) {
 			t = print_otag(h, TAG_B, 1, &tag);
-			print_text(h, n->string);
+			print_text(h, nch->string);
 			print_tagq(h, t);
 
 			h->flags |= HTML_NOSPACE;
 			print_text(h, "()");
 
-			if (n->next == NULL)
+			if (nch->next == NULL)
 				continue;
 
-			if (nchild > 2) {
+			if (nch->prev != NULL || nch->next->next != NULL) {
 				h->flags |= HTML_NOSPACE;
 				print_text(h, ",");
 			}
-			if (n->next->next == NULL)
+			if (nch->next->next == NULL)
 				print_text(h, "and");
 		}
 
-		if (nchild > 1)
+		if (n->child != NULL && n->child->next != NULL)
 			print_text(h, "functions return");
 		else
 			print_text(h, "function returns");
@@ -2001,7 +2002,7 @@ mdoc_bk_pre(MDOC_ARGS)
 	case ROFFT_HEAD:
 		return 0;
 	case ROFFT_BODY:
-		if (n->parent->args || 0 == n->prev->nchild)
+		if (n->parent->args != NULL || n->prev->child == NULL)
 			h->flags |= HTML_PREKEEP;
 		break;
 	default:
@@ -2030,7 +2031,7 @@ mdoc_quote_pre(MDOC_ARGS)
 	switch (n->tok) {
 	case MDOC_Ao:
 	case MDOC_Aq:
-		print_text(h, n->nchild == 1 &&
+		print_text(h, n->child != NULL && n->child->next == NULL &&
 		    n->child->tok == MDOC_Mt ?  "<" : "\\(la");
 		break;
 	case MDOC_Bro:
@@ -2094,7 +2095,7 @@ mdoc_quote_post(MDOC_ARGS)
 	switch (n->tok) {
 	case MDOC_Ao:
 	case MDOC_Aq:
-		print_text(h, n->nchild == 1 &&
+		print_text(h, n->child != NULL && n->child->next == NULL &&
 		    n->child->tok == MDOC_Mt ?  ">" : "\\(ra");
 		break;
 	case MDOC_Bro:
Index: man_validate.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/man_validate.c,v
retrieving revision 1.121
retrieving revision 1.122
diff -Lman_validate.c -Lman_validate.c -u -p -r1.121 -r1.122
--- man_validate.c
+++ man_validate.c
@@ -1,7 +1,7 @@
 /*	$OpenBSD$ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012-2016 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -180,10 +180,10 @@ static void
 post_OP(CHKARGS)
 {
 
-	if (n->nchild == 0)
+	if (n->child == NULL)
 		mandoc_msg(MANDOCERR_OP_EMPTY, man->parse,
 		    n->line, n->pos, "OP");
-	else if (n->nchild > 2) {
+	else if (n->child->next != NULL && n->child->next->next != NULL) {
 		n = n->child->next->next;
 		mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse,
 		    n->line, n->pos, "OP ... %s", n->string);
@@ -206,7 +206,7 @@ post_ft(CHKARGS)
 	char	*cp;
 	int	 ok;
 
-	if (0 == n->nchild)
+	if (n->child == NULL)
 		return;
 
 	ok = 0;
@@ -256,22 +256,22 @@ check_par(CHKARGS)
 
 	switch (n->type) {
 	case ROFFT_BLOCK:
-		if (0 == n->body->nchild)
+		if (n->body->child == NULL)
 			roff_node_delete(man, n);
 		break;
 	case ROFFT_BODY:
-		if (0 == n->nchild)
+		if (n->child == NULL)
 			mandoc_vmsg(MANDOCERR_PAR_SKIP,
 			    man->parse, n->line, n->pos,
 			    "%s empty", man_macronames[n->tok]);
 		break;
 	case ROFFT_HEAD:
-		if (n->nchild)
+		if (n->child != NULL)
 			mandoc_vmsg(MANDOCERR_ARG_SKIP,
 			    man->parse, n->line, n->pos,
 			    "%s %s%s", man_macronames[n->tok],
 			    n->child->string,
-			    n->nchild > 1 ? " ..." : "");
+			    n->child->next != NULL ? " ..." : "");
 		break;
 	default:
 		break;
@@ -284,11 +284,11 @@ post_IP(CHKARGS)
 
 	switch (n->type) {
 	case ROFFT_BLOCK:
-		if (0 == n->head->nchild && 0 == n->body->nchild)
+		if (n->head->child == NULL && n->body->child == NULL)
 			roff_node_delete(man, n);
 		break;
 	case ROFFT_BODY:
-		if (0 == n->parent->head->nchild && 0 == n->nchild)
+		if (n->parent->head->child == NULL && n->child == NULL)
 			mandoc_vmsg(MANDOCERR_PAR_SKIP,
 			    man->parse, n->line, n->pos,
 			    "%s empty", man_macronames[n->tok]);
Index: mandoc.3
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mandoc.3,v
retrieving revision 1.35
retrieving revision 1.36
diff -Lmandoc.3 -Lmandoc.3 -u -p -r1.35 -r1.36
--- mandoc.3
+++ mandoc.3
@@ -1,7 +1,7 @@
 .\"	$Id$
 .\"
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
-.\" Copyright (c) 2010, 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
+.\" Copyright (c) 2010-2016 Ingo Schwarze <schwarze@openbsd.org>
 .\"
 .\" Permission to use, copy, modify, and distribute this software for any
 .\" purpose with or without fee is hereby granted, provided that the above
@@ -557,7 +557,7 @@ and
 fields), its position in the tree (the
 .Va parent ,
 .Va child ,
-.Va nchild ,
+.Va last ,
 .Va next
 and
 .Va prev
Index: roff.h
===================================================================
RCS file: /home/cvs/mdocml/mdocml/roff.h,v
retrieving revision 1.36
retrieving revision 1.37
diff -Lroff.h -Lroff.h -u -p -r1.36 -r1.37
--- roff.h
+++ roff.h
@@ -93,7 +93,6 @@ struct	roff_node {
 	char		 *string;  /* TEXT */
 	const struct tbl_span *span; /* TBL */
 	const struct eqn *eqn;	   /* EQN */
-	int		  nchild;  /* Number of child nodes. */
 	int		  line;    /* Input file line number. */
 	int		  pos;     /* Input file column number. */
 	int		  tok;     /* Request or macro ID. */
Index: mdoc_man.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_man.c,v
retrieving revision 1.95
retrieving revision 1.96
diff -Lmdoc_man.c -Lmdoc_man.c -u -p -r1.95 -r1.96
--- mdoc_man.c
+++ mdoc_man.c
@@ -1,6 +1,6 @@
 /*	$Id$ */
 /*
- * Copyright (c) 2011-2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2016 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -610,7 +610,8 @@ print_node(DECL_ARGS)
 		 */
 		act = manacts + n->tok;
 		cond = act->cond == NULL || (*act->cond)(meta, n);
-		if (cond && act->pre && (n->end == ENDBODY_NOT || n->nchild))
+		if (cond && act->pre != NULL &&
+		    (n->end == ENDBODY_NOT || n->child != NULL))
 			do_sub = (*act->pre)(meta, n);
 	}
 
@@ -681,30 +682,29 @@ post_enc(DECL_ARGS)
 static int
 pre_ex(DECL_ARGS)
 {
-	int	 nchild;
+	struct roff_node *nch;
 
 	outflags |= MMAN_br | MMAN_nl;
 
 	print_word("The");
 
-	nchild = n->nchild;
-	for (n = n->child; n; n = n->next) {
+	for (nch = n->child; nch != NULL; nch = nch->next) {
 		font_push('B');
-		print_word(n->string);
+		print_word(nch->string);
 		font_pop();
 
-		if (n->next == NULL)
+		if (nch->next == NULL)
 			continue;
 
-		if (nchild > 2) {
+		if (nch->prev != NULL || nch->next->next != NULL) {
 			outflags &= ~MMAN_spc;
 			print_word(",");
 		}
-		if (n->next->next == NULL)
+		if (nch->next->next == NULL)
 			print_word("and");
 	}
 
-	if (nchild > 1)
+	if (n->child != NULL && n->child->next != NULL)
 		print_word("utilities exit\\~0");
 	else
 		print_word("utility exits\\~0");
@@ -873,7 +873,7 @@ static int
 pre_aq(DECL_ARGS)
 {
 
-	print_word(n->nchild == 1 &&
+	print_word(n->child != NULL && n->child->next == NULL &&
 	    n->child->tok == MDOC_Mt ?  "<" : "\\(la");
 	outflags &= ~MMAN_spc;
 	return 1;
@@ -884,7 +884,7 @@ post_aq(DECL_ARGS)
 {
 
 	outflags &= ~(MMAN_spc | MMAN_nl);
-	print_word(n->nchild == 1 &&
+	print_word(n->child != NULL && n->child->next == NULL &&
 	    n->child->tok == MDOC_Mt ?  ">" : "\\(ra");
 }
 
@@ -1000,7 +1000,7 @@ pre_bl(DECL_ARGS)
 		return 1;
 	}
 
-	if (n->nchild) {
+	if (n->child != NULL) {
 		print_line(".TS", MMAN_nl);
 		for (icol = 0; icol < n->norm->Bl.ncols; icol++)
 			print_word("l");
@@ -1016,7 +1016,7 @@ post_bl(DECL_ARGS)
 
 	switch (n->norm->Bl.type) {
 	case LIST_column:
-		if (n->nchild)
+		if (n->child != NULL)
 			print_line(".TE", 0);
 		break;
 	case LIST_enum:
@@ -1214,7 +1214,7 @@ pre_fl(DECL_ARGS)
 
 	font_push('B');
 	print_word("\\-");
-	if (n->nchild)
+	if (n->child != NULL)
 		outflags &= ~MMAN_spc;
 	return 1;
 }
@@ -1224,7 +1224,7 @@ post_fl(DECL_ARGS)
 {
 
 	font_pop();
-	if ( ! (n->nchild ||
+	if (!(n->child != NULL ||
 	    n->next == NULL ||
 	    n->next->type == ROFFT_TEXT ||
 	    n->next->flags & MDOC_LINE))
@@ -1645,34 +1645,33 @@ pre_rs(DECL_ARGS)
 static int
 pre_rv(DECL_ARGS)
 {
-	int	 nchild;
+	struct roff_node *nch;
 
 	outflags |= MMAN_br | MMAN_nl;
 
-	nchild = n->nchild;
-	if (nchild > 0) {
+	if (n->child != NULL) {
 		print_word("The");
 
-		for (n = n->child; n; n = n->next) {
+		for (nch = n->child; nch != NULL; nch = nch->next) {
 			font_push('B');
-			print_word(n->string);
+			print_word(nch->string);
 			font_pop();
 
 			outflags &= ~MMAN_spc;
 			print_word("()");
 
-			if (n->next == NULL)
+			if (nch->next == NULL)
 				continue;
 
-			if (nchild > 2) {
+			if (nch->prev != NULL || nch->next->next != NULL) {
 				outflags &= ~MMAN_spc;
 				print_word(",");
 			}
-			if (n->next->next == NULL)
+			if (nch->next->next == NULL)
 				print_word("and");
 		}
 
-		if (nchild > 1)
+		if (n->child != NULL && n->child->next != NULL)
 			print_word("functions return");
 		else
 			print_word("function returns");
Index: mdoc_term.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mdoc_term.c,v
retrieving revision 1.330
retrieving revision 1.331
diff -Lmdoc_term.c -Lmdoc_term.c -u -p -r1.330 -r1.331
--- mdoc_term.c
+++ mdoc_term.c
@@ -1,7 +1,7 @@
 /*	$Id$ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012-2016 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2013 Franco Fichtner <franco@lastsummer.de>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -357,7 +357,7 @@ print_mdoc_node(DECL_ARGS)
 		break;
 	default:
 		if (termacts[n->tok].pre &&
-		    (n->end == ENDBODY_NOT || n->nchild))
+		    (n->end == ENDBODY_NOT || n->child != NULL))
 			chld = (*termacts[n->tok].pre)
 				(p, &npair, meta, n);
 		break;
@@ -598,7 +598,7 @@ static int
 termp_ll_pre(DECL_ARGS)
 {
 
-	term_setwidth(p, n->nchild ? n->child->string : NULL);
+	term_setwidth(p, n->child != NULL ? n->child->string : NULL);
 	return 0;
 }
 
@@ -731,7 +731,7 @@ termp_it_pre(DECL_ARGS)
 			term_word(p, "\\ \\ ");
 		break;
 	case LIST_inset:
-		if (n->type == ROFFT_BODY && n->parent->head->nchild)
+		if (n->type == ROFFT_BODY && n->parent->head->child != NULL)
 			term_word(p, "\\ ");
 		break;
 	default:
@@ -1039,7 +1039,7 @@ termp_fl_pre(DECL_ARGS)
 	term_fontpush(p, TERMFONT_BOLD);
 	term_word(p, "\\-");
 
-	if ( ! (n->nchild == 0 &&
+	if (!(n->child == NULL &&
 	    (n->next == NULL ||
 	     n->next->type == ROFFT_TEXT ||
 	     n->next->flags & MDOC_LINE)))
@@ -1106,34 +1106,33 @@ termp_rs_pre(DECL_ARGS)
 static int
 termp_rv_pre(DECL_ARGS)
 {
-	int		 nchild;
+	struct roff_node *nch;
 
 	term_newln(p);
 
-	nchild = n->nchild;
-	if (nchild > 0) {
+	if (n->child != NULL) {
 		term_word(p, "The");
 
-		for (n = n->child; n; n = n->next) {
+		for (nch = n->child; nch != NULL; nch = nch->next) {
 			term_fontpush(p, TERMFONT_BOLD);
-			term_word(p, n->string);
+			term_word(p, nch->string);
 			term_fontpop(p);
 
 			p->flags |= TERMP_NOSPACE;
 			term_word(p, "()");
 
-			if (n->next == NULL)
+			if (nch->next == NULL)
 				continue;
 
-			if (nchild > 2) {
+			if (nch->prev != NULL || nch->next->next != NULL) {
 				p->flags |= TERMP_NOSPACE;
 				term_word(p, ",");
 			}
-			if (n->next->next == NULL)
+			if (nch->next->next == NULL)
 				term_word(p, "and");
 		}
 
-		if (nchild > 1)
+		if (n->child != NULL && n->child->next != NULL)
 			term_word(p, "functions return");
 		else
 			term_word(p, "function returns");
@@ -1159,27 +1158,29 @@ termp_rv_pre(DECL_ARGS)
 static int
 termp_ex_pre(DECL_ARGS)
 {
-	int		 nchild;
+	struct roff_node *nch;
 
 	term_newln(p);
 	term_word(p, "The");
 
-	nchild = n->nchild;
-	for (n = n->child; n; n = n->next) {
+	for (nch = n->child; nch != NULL; nch = nch->next) {
 		term_fontpush(p, TERMFONT_BOLD);
-		term_word(p, n->string);
+		term_word(p, nch->string);
 		term_fontpop(p);
 
-		if (nchild > 2 && n->next) {
+		if (nch->next == NULL)
+			continue;
+
+		if (nch->prev != NULL || nch->next->next != NULL) {
 			p->flags |= TERMP_NOSPACE;
 			term_word(p, ",");
 		}
 
-		if (n->next && NULL == n->next->next)
+		if (nch->next->next == NULL)
 			term_word(p, "and");
 	}
 
-	if (nchild > 1)
+	if (n->child != NULL && n->child->next != NULL)
 		term_word(p, "utilities exit\\~0");
 	else
 		term_word(p, "utility exits\\~0");
@@ -1838,7 +1839,7 @@ termp_quote_pre(DECL_ARGS)
 	switch (n->tok) {
 	case MDOC_Ao:
 	case MDOC_Aq:
-		term_word(p, n->nchild == 1 &&
+		term_word(p, n->child != NULL && n->child->next == NULL &&
 		    n->child->tok == MDOC_Mt ? "<" : "\\(la");
 		break;
 	case MDOC_Bro:
@@ -1895,7 +1896,7 @@ termp_quote_post(DECL_ARGS)
 	switch (n->tok) {
 	case MDOC_Ao:
 	case MDOC_Aq:
-		term_word(p, n->nchild == 1 &&
+		term_word(p, n->child != NULL && n->child->next == NULL &&
 		    n->child->tok == MDOC_Mt ? ">" : "\\(ra");
 		break;
 	case MDOC_Bro:
@@ -2159,7 +2160,7 @@ termp_bk_pre(DECL_ARGS)
 	case ROFFT_HEAD:
 		return 0;
 	case ROFFT_BODY:
-		if (n->parent->args || 0 == n->prev->nchild)
+		if (n->parent->args != NULL || n->prev->child == NULL)
 			p->flags |= TERMP_PREKEEP;
 		break;
 	default:
Index: man_macro.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/man_macro.c,v
retrieving revision 1.113
retrieving revision 1.114
diff -Lman_macro.c -Lman_macro.c -u -p -r1.113 -r1.114
--- man_macro.c
+++ man_macro.c
@@ -157,7 +157,7 @@ rew_scope(struct roff_man *man, int tok)
 	/* Preserve empty paragraphs before RS. */
 
 	n = man->last;
-	if (tok == MAN_RS && n->nchild == 0 &&
+	if (tok == MAN_RS && n->child == NULL &&
 	    (n->tok == MAN_P || n->tok == MAN_PP || n->tok == MAN_LP))
 		return;
 
--
 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:[~2016-01-08 17:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-08 17:48 mdocml: Delete the redundant "nchild" member of struct roff_node, 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).