summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-11-30 12:35:10 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-11-30 12:35:10 +0000
commit5f6810639ce80dbb325aa84b14193a5b7dbecb34 (patch)
tree6fda98679364d6b95583047f7b9e1091eadd5449
parent5a4db07f872a1be0b0918f8cebbb9f3928e39850 (diff)
downloadmandoc-5f6810639ce80dbb325aa84b14193a5b7dbecb34.tar.gz
Move post_bl() and subfunctions from mdoc_action.c into mdoc_validate.c.
-rw-r--r--mdoc_action.c154
-rw-r--r--mdoc_validate.c155
2 files changed, 157 insertions, 152 deletions
diff --git a/mdoc_action.c b/mdoc_action.c
index 5a7f655e..f458217f 100644
--- a/mdoc_action.c
+++ b/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[MDOC_MAX] = {
{ 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 */
@@ -432,151 +427,6 @@ post_os(POST_ARGS)
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);
-}
-
/*
* Parse the date field in `Dd'.
*/
diff --git a/mdoc_validate.c b/mdoc_validate.c
index d06e28bf..382df54f 100644
--- a/mdoc_validate.c
+++ b/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)