source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Allow -width for lists to be cached in mdoc_bl.
@ 2010-06-13 21:02 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2010-06-13 21:02 UTC (permalink / raw)
  To: source

Log Message:
-----------
Allow -width for lists to be cached in mdoc_bl.  This requires some
trickery because widths may be on-the-fly recalculated.  I don't like
how these are split between mdoc_action.c and mdoc_validate.c, but for
the time being, it'll do.

Modified Files:
--------------
    mdocml:
        mdoc.h
        mdoc_action.c
        mdoc_term.c
        mdoc_validate.c

Revision Data
-------------
Index: mdoc_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v
retrieving revision 1.98
retrieving revision 1.99
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.98 -r1.99
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -532,8 +532,8 @@ pre_display(PRE_ARGS)
 static int
 pre_bl(PRE_ARGS)
 {
-	int		 i, width, comp, dup;
-	const char	*offs;
+	int		 i, comp, dup;
+	const char	*offs, *width;
 	enum mdoc_list	 lt;
 
 	if (MDOC_BLOCK != n->type) {
@@ -553,13 +553,12 @@ pre_bl(PRE_ARGS)
 	 */
 
 	assert(LIST__NONE == n->data.Bl.type);
-	width = -1;
 
 	/* LINTED */
 	for (i = 0; n->args && i < (int)n->args->argc; i++) {
 		lt = LIST__NONE;
 		dup = comp = 0;
-		offs = NULL;
+		width = offs = NULL;
 		switch (n->args->argv[i].arg) {
 		/* Set list types. */
 		case (MDOC_Bullet):
@@ -601,15 +600,14 @@ pre_bl(PRE_ARGS)
 			comp = 1;
 			break;
 		case (MDOC_Width):
-			if (width >= 0)
-				dup++;
-			width = i;
+			dup = (NULL != n->data.Bl.width);
+			width = n->args->argv[i].value[0];
 			break;
 		case (MDOC_Offset):
 			/* NB: this can be empty! */
 			if (n->args->argv[i].sz) {
 				offs = n->args->argv[i].value[0];
-				dup = (NULL != n->data.Bd.offs);
+				dup = (NULL != n->data.Bl.offs);
 				break;
 			}
 			if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV))
@@ -626,6 +624,8 @@ pre_bl(PRE_ARGS)
 			n->data.Bl.comp = comp;
 		if (offs && ! dup)
 			n->data.Bl.offs = offs;
+		if (width && ! dup)
+			n->data.Bl.width = width;
 
 		/* Check: multiple list types. */
 
@@ -641,7 +641,9 @@ pre_bl(PRE_ARGS)
 		/* The list type should come first. */
 
 		if (n->data.Bl.type == LIST__NONE)
-			if (width >= 0 || n->data.Bl.offs || n->data.Bl.comp)
+			if (n->data.Bl.width || 
+					n->data.Bl.offs || 
+					n->data.Bl.comp)
 				if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_LISTFIRST))
 					return(0);
 
@@ -664,7 +666,7 @@ pre_bl(PRE_ARGS)
 
 	switch (n->data.Bl.type) {
 	case (LIST_tag):
-		if (width >= 0)
+		if (n->data.Bl.width)
 			break;
 		if (mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG))
 			break;
@@ -678,7 +680,7 @@ pre_bl(PRE_ARGS)
 	case (LIST_inset):
 		/* FALLTHROUGH */
 	case (LIST_item):
-		if (width < 0)
+		if (NULL == n->data.Bl.width)
 			break;
 		if (mdoc_nmsg(mdoc, n, MANDOCERR_WIDTHARG))
 			break;
Index: mdoc_action.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_action.c,v
retrieving revision 1.69
retrieving revision 1.70
diff -Lmdoc_action.c -Lmdoc_action.c -u -p -r1.69 -r1.70
--- mdoc_action.c
+++ mdoc_action.c
@@ -52,8 +52,7 @@ static	int	  post_at(POST_ARGS);
 static	int	  post_bl(POST_ARGS);
 static	int	  post_bl_head(POST_ARGS);
 static	int	  post_bl_tagwidth(POST_ARGS);
-static	int	  post_bl_width(struct mdoc *, 
-			struct mdoc_node *, int);
+static	int	  post_bl_width(POST_ARGS);
 static	int	  post_dd(POST_ARGS);
 static	int	  post_display(POST_ARGS);
 static	int	  post_dt(POST_ARGS);
@@ -667,19 +666,21 @@ post_bl_tagwidth(POST_ARGS)
 	 * We're guaranteed that a MDOC_Width doesn't already exist.
 	 */
 
-	nn = n;
-	assert(nn->args);
-	i = (int)(nn->args->argc)++;
+	assert(n->args);
+	i = (int)(n->args->argc)++;
+
+	n->args->argv = mandoc_realloc(n->args->argv, 
+			n->args->argc * sizeof(struct mdoc_argv));
 
-	nn->args->argv = mandoc_realloc(nn->args->argv, 
-			nn->args->argc * sizeof(struct mdoc_argv));
+	n->args->argv[i].arg = MDOC_Width;
+	n->args->argv[i].line = n->line;
+	n->args->argv[i].pos = n->pos;
+	n->args->argv[i].sz = 1;
+	n->args->argv[i].value = mandoc_malloc(sizeof(char *));
+	n->args->argv[i].value[0] = mandoc_strdup(buf);
 
-	nn->args->argv[i].arg = MDOC_Width;
-	nn->args->argv[i].line = n->line;
-	nn->args->argv[i].pos = n->pos;
-	nn->args->argv[i].sz = 1;
-	nn->args->argv[i].value = mandoc_malloc(sizeof(char *));
-	nn->args->argv[i].value[0] = mandoc_strdup(buf);
+	/* Set our width! */
+	n->data.Bl.width = n->args->argv[i].value[0];
 	return(1);
 }
 
@@ -690,33 +691,41 @@ post_bl_tagwidth(POST_ARGS)
  * scaling width.
  */
 static int
-post_bl_width(struct mdoc *m, struct mdoc_node *n, int pos)
+post_bl_width(POST_ARGS)
 {
 	size_t		  width;
+	int		  i;
 	enum mdoct	  tok;
 	char		  buf[NUMSIZ];
-	char		 *p;
-
-	assert(n->args);
-	p = n->args->argv[pos].value[0];
 
 	/*
 	 * If the value to -width is a macro, then we re-write it to be
 	 * the macro's width as set in share/tmac/mdoc/doc-common.
 	 */
 
-	if (0 == strcmp(p, "Ds"))
+	if (0 == strcmp(n->data.Bl.width, "Ds"))
 		width = 6;
-	else if (MDOC_MAX == (tok = mdoc_hash_find(p)))
+	else if (MDOC_MAX == (tok = mdoc_hash_find(n->data.Bl.width)))
 		return(1);
 	else if (0 == (width = mdoc_macro2len(tok))) 
 		return(mdoc_nmsg(m, n, MANDOCERR_BADWIDTH));
 
 	/* The value already exists: free and reallocate it. */
 
+	assert(n->args);
+
+	for (i = 0; i < (int)n->args->argc; i++) 
+		if (MDOC_Width == n->args->argv[i].arg)
+			break;
+
+	assert(i < (int)n->args->argc);
+
 	snprintf(buf, NUMSIZ, "%zun", width);
-	free(n->args->argv[pos].value[0]);
-	n->args->argv[pos].value[0] = mandoc_strdup(buf);
+	free(n->args->argv[i].value[0]);
+	n->args->argv[i].value[0] = mandoc_strdup(buf);
+
+	/* Set our width! */
+	n->data.Bl.width = n->args->argv[i].value[0];
 	return(1);
 }
 
@@ -774,7 +783,8 @@ post_bl_head(POST_ARGS)
 static int
 post_bl(POST_ARGS)
 {
-	int		  i, r, len, width;
+	struct mdoc_node *nn;
+	const char	 *ww;
 
 	if (MDOC_HEAD == n->type)
 		return(post_bl_head(m, n));
@@ -789,25 +799,27 @@ post_bl(POST_ARGS)
 	 * rewritten into real lengths).
 	 */
 
-	len = (int)(n->args ? n->args->argc : 0);
-
-	width = -1;
-
-	for (r = i = 0; i < len; i++) {
-		if (MDOC_Tag == n->args->argv[i].arg)
-			r |= 1 << 0;
-		if (MDOC_Width == n->args->argv[i].arg) {
-			width = i;
-			r |= 1 << 1;
-		}
-	}
+	ww = n->data.Bl.width;
 
-	if (r & (1 << 0) && ! (r & (1 << 1))) {
+	if (LIST_tag == n->data.Bl.type && NULL == n->data.Bl.width) {
 		if ( ! post_bl_tagwidth(m, n))
 			return(0);
-	} else if (r & (1 << 1))
-		if ( ! post_bl_width(m, n, width))
+	} else if (NULL != n->data.Bl.width) {
+		if ( ! post_bl_width(m, n))
 			return(0);
+	} else 
+		return(1);
+
+	assert(n->data.Bl.width);
+
+	/* If it has changed, propogate new width to children. */
+
+	if (ww == n->data.Bl.width)
+		return(1);
+
+	for (nn = n->child; nn; nn = nn->next)
+		if (MDOC_Bl == nn->tok)
+			nn->data.Bl.width = n->data.Bl.width;
 
 	return(1);
 }
@@ -827,7 +839,6 @@ post_pa(POST_ARGS)
 	
 	np = n;
 	m->next = MDOC_NEXT_CHILD;
-	/* XXX: make into macro value. */
 	if ( ! mdoc_word_alloc(m, n->line, n->pos, "~"))
 		return(0);
 	m->last = np;
Index: mdoc_term.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_term.c,v
retrieving revision 1.152
retrieving revision 1.153
diff -Lmdoc_term.c -Lmdoc_term.c -u -p -r1.152 -r1.153
--- mdoc_term.c
+++ mdoc_term.c
@@ -731,6 +731,7 @@ termp_it_pre(DECL_ARGS)
 		 * handling for column for how this changes.
 		 */
 		width = a2width(&bl->args->argv[vals[0]], 0) + 2;
+		assert(bl->data.Bl.width);
 		break;
 	}
 
Index: mdoc.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.h,v
retrieving revision 1.88
retrieving revision 1.89
diff -Lmdoc.h -Lmdoc.h -u -p -r1.88 -r1.89
--- mdoc.h
+++ mdoc.h
@@ -279,6 +279,7 @@ struct	mdoc_bd {
 };
 
 struct	mdoc_bl {
+	const char	 *width; /* -width */
 	const char	 *offs; /* -offset */
 	enum mdoc_list	  type; /* -tag, -enum, etc. */
 	int		  comp; /* -compact */
--
 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:[~2010-06-13 21:02 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-06-13 21:02 mdocml: Allow -width for lists to be cached in mdoc_bl kristaps

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).