source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* docbook2mdoc: Remove some needless output line breaks between text
@ 2019-04-24 18:38 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2019-04-24 18:38 UTC (permalink / raw)
  To: source

Log Message:
-----------
Remove some needless output line breaks between text nodes.
Some of them were incorrect in no-fill mode.

Modified Files:
--------------
    docbook2mdoc:
        docbook2mdoc.1
        docbook2mdoc.c
        macro.c
        node.h
        parse.c
        tree.c

Revision Data
-------------
Index: docbook2mdoc.1
===================================================================
RCS file: /home/cvs/mdocml/docbook2mdoc/docbook2mdoc.1,v
retrieving revision 1.13
retrieving revision 1.14
diff -Ldocbook2mdoc.1 -Ldocbook2mdoc.1 -u -p -r1.13 -r1.14
--- docbook2mdoc.1
+++ docbook2mdoc.1
@@ -58,7 +58,8 @@ Child nodes are indented with respect to
 The columns are:
 .Bl -enum -width 2n
 .It
-A hyphen if the node follows the previous node
+An asterisk if the node starts a new text line,
+or a hyphen if the node follows the previous node
 without intervening whitespace.
 .It
 The node type.
Index: parse.c
===================================================================
RCS file: /home/cvs/mdocml/docbook2mdoc/parse.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -Lparse.c -Lparse.c -u -p -r1.50 -r1.51
--- parse.c
+++ parse.c
@@ -59,9 +59,10 @@ struct	parse {
 	int		 nofill; /* Levels of open no-fill displays. */
 	int		 flags;
 #define	PFLAG_WARN	 (1 << 0)  /* Print warning messages. */
-#define	PFLAG_SPC	 (1 << 1)  /* Whitespace before the next element. */
-#define	PFLAG_ATTR	 (1 << 2)  /* The most recent attribute is valid. */
-#define	PFLAG_EEND	 (1 << 3)  /* This element is self-closing. */
+#define	PFLAG_LINE	 (1 << 1)  /* New line before the next element. */
+#define	PFLAG_SPC	 (1 << 2)  /* Whitespace before the next element. */
+#define	PFLAG_ATTR	 (1 << 3)  /* The most recent attribute is valid. */
+#define	PFLAG_EEND	 (1 << 4)  /* This element is self-closing. */
 };
 
 struct	alias {
@@ -261,7 +262,7 @@ xml_text(struct parse *p, const char *wo
 			n->b[oldsz++] = ' ';
 		memcpy(n->b + oldsz, word, sz);
 		n->b[newsz] = '\0';
-		p->flags &= ~PFLAG_SPC;
+		p->flags &= ~(PFLAG_LINE | PFLAG_SPC);
 		return;
 	}
 
@@ -273,8 +274,9 @@ xml_text(struct parse *p, const char *wo
 	if ((n = pnode_alloc(p->cur)) == NULL)
 		fatal(p);
 	n->node = NODE_TEXT;
-	n->spc = (p->flags & PFLAG_SPC) != 0;
-	p->flags &= ~PFLAG_SPC;
+	n->flags = ((p->flags & PFLAG_LINE) ? NFLAG_LINE : 0) |
+	    ((p->flags & PFLAG_SPC) ? NFLAG_SPC : 0);
+	p->flags &= ~(PFLAG_LINE | PFLAG_SPC);
 
 	/*
 	 * If this node follows an in-line macro without intervening
@@ -282,7 +284,7 @@ xml_text(struct parse *p, const char *wo
 	 * and do not keep it open.
 	 */
 
-	np = n->spc ? NULL : TAILQ_PREV(n, pnodeq, child);
+	np = n->flags & NFLAG_SPC ? NULL : TAILQ_PREV(n, pnodeq, child);
 	while (np != NULL) {
 		switch (pnode_class(np->node)) {
 		case CLASS_VOID:
@@ -320,7 +322,7 @@ xml_text(struct parse *p, const char *wo
 		if ((n = pnode_alloc(p->cur)) == NULL)
 			fatal(p);
 		n->node = NODE_TEXT;
-		n->spc = 1;
+		n->flags |= NFLAG_SPC;
 		word += i;
 		sz -= i;
 	}
@@ -371,7 +373,7 @@ pnode_closetext(struct parse *p, int che
 	if ((n = pnode_alloc(p->cur)) == NULL)
 		fatal(p);
 	n->node = NODE_TEXT;
-	n->spc = 1;
+	n->flags |= NFLAG_SPC;
 	if ((n->b = strdup(last_word)) == NULL)
 		fatal(p);
 }
@@ -413,7 +415,7 @@ xml_entity(struct parse *p, const char *
 				if ((ccp = pnode_getattr_raw(n,
 				    ATTRKEY_SYSTEM, NULL)) != NULL) {
 					parse_file(p, -1, ccp);
-					p->flags &= ~PFLAG_SPC;
+					p->flags &= ~(PFLAG_LINE | PFLAG_SPC);
 					return;
 				}
 				if ((ccp = pnode_getattr_raw(n,
@@ -423,7 +425,7 @@ xml_entity(struct parse *p, const char *
 					fatal(p);
 				pstate = PARSE_ELEM;
 				parse_string(p, cp, strlen(cp), &pstate, 0);
-				p->flags &= ~PFLAG_SPC;
+				p->flags &= ~(PFLAG_LINE | PFLAG_SPC);
 				free(cp);
 				return;
 			}
@@ -448,8 +450,9 @@ xml_entity(struct parse *p, const char *
 		fatal(p);
 done:
 	n->node = NODE_ESCAPE;
-	n->spc = (p->flags & PFLAG_SPC) != 0;
-	p->flags &= ~PFLAG_SPC;
+	n->flags = ((p->flags & PFLAG_LINE) ? NFLAG_LINE : 0) |
+	    ((p->flags & PFLAG_SPC) ? NFLAG_SPC : 0);
+	p->flags &= ~(PFLAG_LINE | PFLAG_SPC);
 }
 
 /*
@@ -541,13 +544,14 @@ xml_elem_start(struct parse *p, const ch
 	switch (pnode_class(p->ncur)) {
 	case CLASS_LINE:
 	case CLASS_ENCL:
-		n->spc = (p->flags & PFLAG_SPC) != 0;
+		n->flags = ((p->flags & PFLAG_LINE) ? NFLAG_LINE : 0) |
+		    ((p->flags & PFLAG_SPC) ? NFLAG_SPC : 0);
 		break;
 	case CLASS_NOFILL:
 		p->nofill++;
 		/* FALLTHROUGH */
 	default:
-		n->spc = 1;
+		n->flags |= NFLAG_SPC;
 		break;
 	}
 	p->cur = n;
@@ -659,7 +663,7 @@ xml_elem_end(struct parse *p, const char
 		else
 			parse_file(p, -1, cp);
 		pnode_unlink(n);
-		p->flags &= ~PFLAG_SPC;
+		p->flags &= ~(PFLAG_LINE | PFLAG_SPC);
 		break;
 	case NODE_DOCTYPE:
 	case NODE_SBR:
@@ -687,7 +691,7 @@ xml_elem_end(struct parse *p, const char
 				p->ncur = p->cur->node;
 		} else
 			p->tree->flags |= TREE_CLOSED;
-		p->flags &= ~PFLAG_SPC;
+		p->flags &= ~(PFLAG_LINE | PFLAG_SPC);
 
 		/* Include a file containing entity declarations. */
 
@@ -806,8 +810,10 @@ parse_string(struct parse *p, char *b, s
 			break;
 		if (isspace((unsigned char)b[pend])) {
 			p->flags |= PFLAG_SPC;
-			if (b[pend] == '\n')
+			if (b[pend] == '\n') {
+				p->flags |= PFLAG_LINE;
 				pws = pend + 1;
+			}
 			increment(p, b, &pend, refill);
 			continue;
 		}
Index: docbook2mdoc.c
===================================================================
RCS file: /home/cvs/mdocml/docbook2mdoc/docbook2mdoc.c,v
retrieving revision 1.137
retrieving revision 1.138
diff -Ldocbook2mdoc.c -Ldocbook2mdoc.c -u -p -r1.137 -r1.138
--- docbook2mdoc.c
+++ docbook2mdoc.c
@@ -42,7 +42,8 @@ pnode_printtext(struct format *f, struct
 
 	cp = n->b;
 	accept_arg = f->flags & FMT_ARG;
-	if (f->linestate == LINE_MACRO && !n->spc && !accept_arg) {
+	if (f->linestate == LINE_MACRO && !accept_arg &&
+	    (n->flags & NFLAG_SPC) == 0) {
 		for (;;) {
 			if (*cp == '\0')
 				return;
@@ -71,14 +72,15 @@ pnode_printtext(struct format *f, struct
 	 */
 
 	if (f->linestate != LINE_MACRO &&
-	    (nn = TAILQ_NEXT(n, child)) != NULL && nn->spc == 0) {
+	    (nn = TAILQ_NEXT(n, child)) != NULL &&
+	     (nn->flags & NFLAG_SPC) == 0) {
 		switch (pnode_class(nn->node)) {
 		case CLASS_LINE:
 		case CLASS_ENCL:
 			macro_open(f, "Pf");
 			accept_arg = 1;
 			f->flags |= FMT_CHILD;
-			nn->spc = 1;
+			nn->flags |= NFLAG_SPC;
 			break;
 		default:
 			break;
@@ -89,8 +91,9 @@ pnode_printtext(struct format *f, struct
 	case LINE_NEW:
 		break;
 	case LINE_TEXT:
-		if (n->spc) {
-			if (pnode_class(n->node) == CLASS_TEXT)
+		if (n->flags & NFLAG_SPC) {
+			if (n->flags & NFLAG_LINE &&
+			    pnode_class(n->node) == CLASS_TEXT)
 				macro_close(f);
 			else
 				putchar(' ');
@@ -99,7 +102,8 @@ pnode_printtext(struct format *f, struct
 	case LINE_MACRO:
 		if (accept_arg == 0)
 			macro_close(f);
-		else if (n->spc || (f->flags & FMT_ARG) == 0 ||
+		else if (n->flags & NFLAG_SPC ||
+		    (f->flags & FMT_ARG) == 0 ||
 		    (nn = TAILQ_PREV(n, pnodeq, child)) == NULL ||
 		    pnode_class(nn->node) != CLASS_TEXT)
 			putchar(' ');
@@ -889,7 +893,7 @@ pnode_printrefentry(struct format *f, st
 			exit(1);
 		}
 		match->node = NODE_SECTION;
-		match->spc = 1;
+		match->flags |= NFLAG_SPC;
 		match->parent = n;
 		TAILQ_INIT(&match->childq);
 		TAILQ_INIT(&match->attrq);
@@ -898,7 +902,7 @@ pnode_printrefentry(struct format *f, st
 			exit(1);
 		}
 		nc->node = NODE_TITLE;
-		nc->spc = 1;
+		nc->flags |= NFLAG_SPC;
 		if ((nc = pnode_alloc(nc)) == NULL) {
 			perror(NULL);
 			exit(1);
@@ -908,7 +912,7 @@ pnode_printrefentry(struct format *f, st
 			perror(NULL);
 			exit(1);
 		}
-		nc->spc = 1;
+		nc->flags |= NFLAG_SPC;
 		if (later == NULL)
 			TAILQ_INSERT_TAIL(&n->childq, match, child);
 		else
@@ -1125,7 +1129,7 @@ pnode_print(struct format *f, struct pno
 		return;
 
 	was_impl = f->flags & FMT_IMPL;
-	if (n->spc)
+	if (n->flags & NFLAG_SPC)
 		f->flags &= ~FMT_NOSPC;
 	else
 		f->flags |= FMT_NOSPC;
@@ -1290,8 +1294,8 @@ pnode_print(struct format *f, struct pno
 		if ((nc = TAILQ_FIRST(&n->childq)) != NULL &&
 		    nc->node == NODE_FILENAME &&
 		    TAILQ_NEXT(nc, child) == NULL) {
-			if (n->spc)
-				nc->spc = 1;
+			if (n->flags & NFLAG_SPC)
+				nc->flags |= NFLAG_SPC;
 		} else if (was_impl)
 			macro_open(f, "Do");
 		else {
@@ -1349,12 +1353,12 @@ pnode_print(struct format *f, struct pno
 		else
 			print_text(f, "_", 0);
 		if ((nc = TAILQ_FIRST(&n->childq)) != NULL)
-			nc->spc = 0;
+			nc->flags &= ~(NFLAG_LINE | NFLAG_SPC);
 		break;
 	case NODE_SUPERSCRIPT:
 		fputs("\\(ha", stdout);
 		if ((nc = TAILQ_FIRST(&n->childq)) != NULL)
-			nc->spc = 0;
+			nc->flags &= ~(NFLAG_LINE | NFLAG_SPC);
 		break;
 	case NODE_TEXT:
 	case NODE_ESCAPE:
Index: macro.c
===================================================================
RCS file: /home/cvs/mdocml/docbook2mdoc/macro.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -Lmacro.c -Lmacro.c -u -p -r1.15 -r1.16
--- macro.c
+++ macro.c
@@ -213,7 +213,7 @@ macro_addnode(struct format *f, struct p
 		nc = TAILQ_NEXT(nc, child);
 		if (nc == NULL || pnode_class(nc->node) != CLASS_TEXT)
 			is_text = 0;
-		if (is_text && !nc->spc)
+		if (is_text && (nc->flags & NFLAG_SPC) == 0)
 			flags &= ~ARG_SPACE;
 		else
 			flags |= ARG_SPACE;
Index: tree.c
===================================================================
RCS file: /home/cvs/mdocml/docbook2mdoc/tree.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -Ltree.c -Ltree.c -u -p -r1.2 -r1.3
--- tree.c
+++ tree.c
@@ -29,7 +29,9 @@ print_node(struct pnode *n, int indent)
 	struct pnode	*nc;
 	struct pattr	*a;
 
-	printf("%*s%c%s", indent, "", n->spc ? ' ' : '-',
+	printf("%*s%c%s", indent, "",
+	    (n->flags & NFLAG_LINE) ? '*' :
+	    (n->flags & NFLAG_SPC) ? ' ' : '-',
 	    pnode_name(n->node));
 	if (n->b != NULL) {
 		putchar(' ');
Index: node.h
===================================================================
RCS file: /home/cvs/mdocml/docbook2mdoc/node.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -Lnode.h -Lnode.h -u -p -r1.32 -r1.33
--- node.h
+++ node.h
@@ -231,8 +231,10 @@ struct	pattr {
 struct	pnode {
 	enum nodeid	 node;     /* Node type. */
 	char		*b;        /* String value. */
-	int		 spc;      /* Whitespace before this node. */
 	struct pnode	*parent;   /* Parent node or NULL. */
+	int		 flags;
+#define	NFLAG_LINE	 (1 << 0)  /* New line before this node. */
+#define	NFLAG_SPC	 (1 << 1)  /* Whitespace before this node. */
 	struct pnodeq	 childq;   /* Queue of children. */
 	struct pattrq	 attrq;    /* Attributes of the node. */
 	TAILQ_ENTRY(pnode) child;
--
 To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv

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

only message in thread, other threads:[~2019-04-24 18:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-24 18:38 docbook2mdoc: Remove some needless output line breaks between text 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).