summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-06-13 21:02:48 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-06-13 21:02:48 +0000
commitc01761ea13fdd499eb96561ff3f510d953048911 (patch)
treed6d307d88b265b4bdb1ddc2ce735fe04fd271da4
parentf2a3c128d35104b347ccd97db111a8d2670a3806 (diff)
downloadmandoc-c01761ea13fdd499eb96561ff3f510d953048911.tar.gz
mandoc-c01761ea13fdd499eb96561ff3f510d953048911.tar.zst
mandoc-c01761ea13fdd499eb96561ff3f510d953048911.zip
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.
-rw-r--r--mdoc.h3
-rw-r--r--mdoc_action.c95
-rw-r--r--mdoc_term.c3
-rw-r--r--mdoc_validate.c26
4 files changed, 71 insertions, 56 deletions
diff --git a/mdoc.h b/mdoc.h
index aaa81129..b9f4ab73 100644
--- a/mdoc.h
+++ b/mdoc.h
@@ -1,4 +1,4 @@
-/* $Id: mdoc.h,v 1.88 2010/06/12 12:38:01 kristaps Exp $ */
+/* $Id: mdoc.h,v 1.89 2010/06/13 21:02:48 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -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 */
diff --git a/mdoc_action.c b/mdoc_action.c
index 10de8a14..9cdeeb62 100644
--- a/mdoc_action.c
+++ b/mdoc_action.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_action.c,v 1.69 2010/06/13 20:05:12 kristaps Exp $ */
+/* $Id: mdoc_action.c,v 1.70 2010/06/13 21:02:48 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -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)++;
-
- nn->args->argv = mandoc_realloc(nn->args->argv,
- nn->args->argc * sizeof(struct mdoc_argv));
-
- 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);
+ 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);
}
@@ -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;
diff --git a/mdoc_term.c b/mdoc_term.c
index 49771eaa..4261a732 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_term.c,v 1.152 2010/06/12 12:38:01 kristaps Exp $ */
+/* $Id: mdoc_term.c,v 1.153 2010/06/13 21:02:49 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -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;
}
diff --git a/mdoc_validate.c b/mdoc_validate.c
index 843b45db..de1a7cc1 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_validate.c,v 1.98 2010/06/12 12:38:01 kristaps Exp $ */
+/* $Id: mdoc_validate.c,v 1.99 2010/06/13 21:02:49 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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;