source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Move post_bl() and subfunctions from mdoc_action.c into
@ 2010-11-30 12:35 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2010-11-30 12:35 UTC (permalink / raw)
  To: source

Log Message:
-----------
Move post_bl() and subfunctions from mdoc_action.c into mdoc_validate.c.

Modified Files:
--------------
    mdocml:
        mdoc_action.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.130
retrieving revision 1.131
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.130 -r1.131
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -36,6 +36,9 @@
 #define	PRE_ARGS  struct mdoc *mdoc, struct mdoc_node *n
 #define	POST_ARGS struct mdoc *mdoc
 
+#define	NUMSIZ	  32
+#define	DATESIZ	  32
+
 enum	check_ineq {
 	CHECK_LT,
 	CHECK_GT,
@@ -84,6 +87,9 @@ static	int	 post_an(POST_ARGS);
 static	int	 post_at(POST_ARGS);
 static	int	 post_bf(POST_ARGS);
 static	int	 post_bl(POST_ARGS);
+static	int	 post_bl_block(POST_ARGS);
+static	int	 post_bl_block_width(POST_ARGS);
+static	int	 post_bl_block_tag(POST_ARGS);
 static	int	 post_bl_head(POST_ARGS);
 static	int	 post_defaults(POST_ARGS);
 static	int	 post_literal(POST_ARGS);
@@ -1398,6 +1404,153 @@ post_it(POST_ARGS)
 	return(1);
 }
 
+static int
+post_bl_block(POST_ARGS) 
+{
+	struct mdoc_node *n;
+
+	/*
+	 * These are fairly complicated, so we've broken them into two
+	 * functions.  post_bl_block_tag() is called when a -tag is
+	 * specified, but no -width (it must be guessed).  The second
+	 * when a -width is specified (macro indicators must be
+	 * rewritten into real lengths).
+	 */
+
+	n = mdoc->last;
+
+	if (LIST_tag == n->data.Bl->type && 
+			NULL == n->data.Bl->width) {
+		if ( ! post_bl_block_tag(mdoc))
+			return(0);
+	} else if (NULL != n->data.Bl->width) {
+		if ( ! post_bl_block_width(mdoc))
+			return(0);
+	} else 
+		return(1);
+
+	assert(n->data.Bl->width);
+	return(1);
+}
+
+static int
+post_bl_block_width(POST_ARGS)
+{
+	size_t		  width;
+	int		  i;
+	enum mdoct	  tok;
+	struct mdoc_node *n;
+	char		  buf[NUMSIZ];
+
+	n = mdoc->last;
+
+	/*
+	 * Calculate the real width of a list from the -width string,
+	 * which may contain a macro (with a known default width), a
+	 * literal string, or a scaling width.
+	 *
+	 * 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(n->data.Bl->width, "Ds"))
+		width = 6;
+	else if (MDOC_MAX == (tok = mdoc_hash_find(n->data.Bl->width)))
+		return(1);
+	else if (0 == (width = mdoc_macro2len(tok))) 
+		return(mdoc_nmsg(mdoc, 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[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);
+}
+
+static int
+post_bl_block_tag(POST_ARGS)
+{
+	struct mdoc_node *n, *nn;
+	size_t		  sz, ssz;
+	int		  i;
+	char		  buf[NUMSIZ];
+
+	/*
+	 * Calculate the -width for a `Bl -tag' list if it hasn't been
+	 * provided.  Uses the first head macro.  NOTE AGAIN: this is
+	 * ONLY if the -width argument has NOT been provided.  See
+	 * post_bl_block_width() for converting the -width string.
+	 */
+
+	sz = 10;
+	n = mdoc->last;
+
+	for (nn = n->body->child; nn; nn = nn->next) {
+		if (MDOC_It != nn->tok)
+			continue;
+
+		assert(MDOC_BLOCK == nn->type);
+		nn = nn->head->child;
+
+		if (nn == NULL) {
+			/* No -width for .Bl and first .It is emtpy */
+			if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG))
+				return(0);
+			break;
+		}
+
+		if (MDOC_TEXT == nn->type) {
+			sz = strlen(nn->string) + 1;
+			break;
+		}
+
+		if (0 != (ssz = mdoc_macro2len(nn->tok)))
+			sz = ssz;
+		else if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG))
+			return(0);
+
+		break;
+	} 
+
+	/* Defaults to ten ens. */
+
+	snprintf(buf, NUMSIZ, "%zun", sz);
+
+	/*
+	 * We have to dynamically add this to the macro's argument list.
+	 * We're guaranteed that a MDOC_Width doesn't already exist.
+	 */
+
+	assert(n->args);
+	i = (int)(n->args->argc)++;
+
+	n->args->argv = mandoc_realloc(n->args->argv, 
+			n->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);
+
+	/* Set our width! */
+	n->data.Bl->width = n->args->argv[i].value[0];
+	return(1);
+}
+
 
 static int
 post_bl_head(POST_ARGS) 
@@ -1472,6 +1625,8 @@ post_bl(POST_ARGS)
 
 	if (MDOC_HEAD == mdoc->last->type) 
 		return(post_bl_head(mdoc));
+	if (MDOC_BLOCK == mdoc->last->type)
+		return(post_bl_block(mdoc));
 	if (MDOC_BODY != mdoc->last->type)
 		return(1);
 	if (NULL == mdoc->last->child)
Index: mdoc_action.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_action.c,v
retrieving revision 1.86
retrieving revision 1.87
diff -Lmdoc_action.c -Lmdoc_action.c -u -p -r1.86 -r1.87
--- mdoc_action.c
+++ mdoc_action.c
@@ -32,6 +32,7 @@
 #include "libmdoc.h"
 #include "libmandoc.h"
 
+#define	DATESIZ	  32
 /* 
  * FIXME: this file is deprecated.  All future "actions" should be
  * pushed into mdoc_validate.c.
@@ -40,9 +41,6 @@
 #define	POST_ARGS struct mdoc *m, struct mdoc_node *n
 #define	PRE_ARGS  struct mdoc *m, struct mdoc_node *n
 
-#define	NUMSIZ	  32
-#define	DATESIZ	  32
-
 struct	actions {
 	int	(*pre)(PRE_ARGS);
 	int	(*post)(POST_ARGS);
@@ -51,9 +49,6 @@ struct	actions {
 static	int	  concat(struct mdoc *, char *,
 			const struct mdoc_node *, size_t);
 
-static	int	  post_bl(POST_ARGS);
-static	int	  post_bl_tagwidth(POST_ARGS);
-static	int	  post_bl_width(POST_ARGS);
 static	int	  post_dd(POST_ARGS);
 static	int	  post_dt(POST_ARGS);
 static	int	  post_os(POST_ARGS);
@@ -72,7 +67,7 @@ static	const struct actions mdoc_actions
 	{ NULL, NULL }, /* Dl */
 	{ NULL, NULL }, /* Bd */ 
 	{ NULL, NULL }, /* Ed */
-	{ NULL, post_bl }, /* Bl */ 
+	{ NULL, NULL }, /* Bl */ 
 	{ NULL, NULL }, /* El */
 	{ NULL, NULL }, /* It */
 	{ NULL, NULL }, /* Ad */ 
@@ -430,151 +425,6 @@ post_os(POST_ARGS)
 
 	m->meta.os = mandoc_strdup(buf);
 	return(post_prol(m, n));
-}
-
-
-/*
- * Calculate the -width for a `Bl -tag' list if it hasn't been provided.
- * Uses the first head macro.  NOTE AGAIN: this is ONLY if the -width
- * argument has NOT been provided.  See post_bl_width() for converting
- * the -width string.
- */
-static int
-post_bl_tagwidth(POST_ARGS)
-{
-	struct mdoc_node *nn;
-	size_t		  sz, ssz;
-	int		  i;
-	char		  buf[NUMSIZ];
-
-	sz = 10;
-
-	for (nn = n->body->child; nn; nn = nn->next) {
-		if (MDOC_It != nn->tok)
-			continue;
-
-		assert(MDOC_BLOCK == nn->type);
-		nn = nn->head->child;
-
-		if (nn == NULL) {
-			/* No -width for .Bl and first .It is emtpy */
-			if ( ! mdoc_nmsg(m, n, MANDOCERR_NOWIDTHARG))
-				return(0);
-			break;
-		}
-
-		if (MDOC_TEXT == nn->type) {
-			sz = strlen(nn->string) + 1;
-			break;
-		}
-
-		if (0 != (ssz = mdoc_macro2len(nn->tok)))
-			sz = ssz;
-		else if ( ! mdoc_nmsg(m, n, MANDOCERR_NOWIDTHARG))
-			return(0);
-
-		break;
-	} 
-
-	/* Defaults to ten ens. */
-
-	snprintf(buf, NUMSIZ, "%zun", sz);
-
-	/*
-	 * We have to dynamically add this to the macro's argument list.
-	 * We're guaranteed that a MDOC_Width doesn't already exist.
-	 */
-
-	assert(n->args);
-	i = (int)(n->args->argc)++;
-
-	n->args->argv = mandoc_realloc(n->args->argv, 
-			n->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);
-
-	/* Set our width! */
-	n->data.Bl->width = n->args->argv[i].value[0];
-	return(1);
-}
-
-
-/*
- * Calculate the real width of a list from the -width string, which may
- * contain a macro (with a known default width), a literal string, or a
- * scaling width.
- */
-static int
-post_bl_width(POST_ARGS)
-{
-	size_t		  width;
-	int		  i;
-	enum mdoct	  tok;
-	char		  buf[NUMSIZ];
-
-	/*
-	 * 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(n->data.Bl->width, "Ds"))
-		width = 6;
-	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[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);
-}
-
-
-static int
-post_bl(POST_ARGS)
-{
-
-	if (MDOC_BLOCK != n->type)
-		return(1);
-
-	/*
-	 * These are fairly complicated, so we've broken them into two
-	 * functions.  post_bl_tagwidth() is called when a -tag is
-	 * specified, but no -width (it must be guessed).  The second
-	 * when a -width is specified (macro indicators must be
-	 * rewritten into real lengths).
-	 */
-
-	if (LIST_tag == n->data.Bl->type && NULL == n->data.Bl->width) {
-		if ( ! post_bl_tagwidth(m, n))
-			return(0);
-	} else if (NULL != n->data.Bl->width) {
-		if ( ! post_bl_width(m, n))
-			return(0);
-	} else 
-		return(1);
-
-	assert(n->data.Bl->width);
-	return(1);
 }
 
 /*
--
 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-11-30 12:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-11-30 12:35 mdocml: Move post_bl() and subfunctions from mdoc_action.c into 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).