summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-07-04 21:59:30 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-07-04 21:59:30 +0000
commitb8b9e11a867466342dc730ff378f7456de5a4680 (patch)
tree99282f4ab9682a6ac1b301cf328097398b20d5f8
parent5dbcea4594d8b16bf100320bc68f4bc0892bda30 (diff)
downloadmandoc-b8b9e11a867466342dc730ff378f7456de5a4680.tar.gz
Cache column sizes and char pointer into mdoc_bl. Finally get rid of
the loops here and there to track down the MDOC_Column arguments.
-rw-r--r--mdoc.h2
-rw-r--r--mdoc_action.c3
-rw-r--r--mdoc_html.c16
-rw-r--r--mdoc_term.c32
-rw-r--r--mdoc_validate.c25
5 files changed, 24 insertions, 54 deletions
diff --git a/mdoc.h b/mdoc.h
index 50864bcd..b698273b 100644
--- a/mdoc.h
+++ b/mdoc.h
@@ -303,6 +303,8 @@ struct mdoc_bl {
const char *offs; /* -offset */
enum mdoc_list type; /* -tag, -enum, etc. */
int comp; /* -compact */
+ size_t ncols; /* -column arg count */
+ const char **cols; /* -column val ptr */
};
struct mdoc_bf {
diff --git a/mdoc_action.c b/mdoc_action.c
index 48a248cd..21fa4ee3 100644
--- a/mdoc_action.c
+++ b/mdoc_action.c
@@ -782,6 +782,9 @@ post_bl_head(POST_ARGS)
np->args->argv[c].value = mandoc_malloc
((size_t)n->nchild * sizeof(char *));
+ n->data.Bl->ncols = np->args->argv[c].sz;
+ n->data.Bl->cols = (const char **)np->args->argv[c].value;
+
for (i = 0, nn = n->child; nn; i++) {
np->args->argv[c].value[i] = nn->string;
nn->string = NULL;
diff --git a/mdoc_html.c b/mdoc_html.c
index e88f202e..5de0f230 100644
--- a/mdoc_html.c
+++ b/mdoc_html.c
@@ -1074,7 +1074,7 @@ mdoc_it_head_pre(MDOC_ARGS, enum mdoc_list type, struct roffsu *width)
static int
mdoc_it_pre(MDOC_ARGS)
{
- int i, wp, comp;
+ int i, comp;
const struct mdoc_node *bl, *nn;
struct roffsu width, offs;
enum mdoc_list type;
@@ -1116,16 +1116,6 @@ mdoc_it_pre(MDOC_ARGS)
if (bl->data.Bl->width)
a2width(bl->data.Bl->width, &width);
- wp = -1;
- for (i = 0; bl->args && i < (int)bl->args->argc; i++)
- switch (bl->args->argv[i].arg) {
- case (MDOC_Column):
- wp = i; /* Save for later. */
- break;
- default:
- break;
- }
-
/* Override width in some cases. */
switch (type) {
@@ -1149,8 +1139,8 @@ mdoc_it_pre(MDOC_ARGS)
for (i = 0; nn && nn != n; nn = nn->next)
if (MDOC_BODY == nn->type)
i++;
- if (i < (int)bl->args->argv[wp].sz)
- a2width(bl->args->argv[wp].value[i], &width);
+ if (i < (int)bl->data.Bl->ncols)
+ a2width(bl->data.Bl->cols[i], &width);
}
if (MDOC_HEAD == n->type)
diff --git a/mdoc_term.c b/mdoc_term.c
index 557095e9..78122ff9 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -57,7 +57,6 @@ static size_t a2width(const struct termp *, const char *);
static size_t a2height(const struct termp *, const char *);
static size_t a2offs(const struct termp *, const char *);
-static int arg_getattr(int, const struct mdoc_node *);
static void print_bvspace(struct termp *,
const struct mdoc_node *,
const struct mdoc_node *);
@@ -527,26 +526,6 @@ a2offs(const struct termp *p, const char *v)
/*
- * Get the index of an argument in a node's argument list or -1 if it
- * does not exist.
- */
-static int
-arg_getattr(int v, const struct mdoc_node *n)
-{
- int i;
-
- if (NULL == n->args)
- return(0);
-
- for (i = 0; i < (int)n->args->argc; i++)
- if (n->args->argv[i].arg == v)
- return(i);
-
- return(-1);
-}
-
-
-/*
* Determine how much space to print out before block elements of `It'
* (and thus `Bl') and `Bd'. And then go ahead and print that space,
* too.
@@ -631,7 +610,7 @@ termp_it_pre(DECL_ARGS)
{
const struct mdoc_node *bl, *nn;
char buf[7];
- int i, col;
+ int i;
size_t width, offset, ncols, dcol;
enum mdoc_list type;
@@ -660,8 +639,6 @@ termp_it_pre(DECL_ARGS)
if (MDOC_HEAD == n->type)
break;
- col = arg_getattr(MDOC_Column, bl);
-
/*
* Imitate groff's column handling:
* - For each earlier column, add its width.
@@ -671,7 +648,8 @@ termp_it_pre(DECL_ARGS)
* column.
* - For more than 5 columns, add only one column.
*/
- ncols = bl->args->argv[col].sz;
+ ncols = bl->data.Bl->ncols;
+
/* LINTED */
dcol = ncols < 5 ? term_len(p, 4) :
ncols == 5 ? term_len(p, 3) : term_len(p, 1);
@@ -685,7 +663,7 @@ termp_it_pre(DECL_ARGS)
nn->prev && i < (int)ncols;
nn = nn->prev, i++)
offset += dcol + a2width
- (p, bl->args->argv[col].value[i]);
+ (p, bl->data.Bl->cols[i]);
/*
* When exceeding the declared number of columns, leave
@@ -700,7 +678,7 @@ termp_it_pre(DECL_ARGS)
* Use the declared column widths, extended as explained
* in the preceding paragraph.
*/
- width = a2width(p, bl->args->argv[col].value[i]) + dcol;
+ width = a2width(p, bl->data.Bl->cols[i]) + dcol;
break;
default:
if (NULL == bl->data.Bl->width)
diff --git a/mdoc_validate.c b/mdoc_validate.c
index dce10ed0..bb0f58e8 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -647,8 +647,16 @@ pre_bl(PRE_ARGS)
/* Assign list type. */
- if (LIST__NONE != lt && n->data.Bl->type == LIST__NONE)
+ if (LIST__NONE != lt && n->data.Bl->type == LIST__NONE) {
n->data.Bl->type = lt;
+ /* Set column information, too. */
+ if (LIST_column == lt) {
+ n->data.Bl->ncols =
+ n->args->argv[i].sz;
+ n->data.Bl->cols = (const char **)
+ n->args->argv[i].value;
+ }
+ }
/* The list type should come first. */
@@ -1150,14 +1158,8 @@ post_it(POST_ARGS)
return(0);
break;
case (LIST_column):
- cols = -1;
- for (i = 0; i < (int)n->args->argc; i++)
- if (MDOC_Column == n->args->argv[i].arg) {
- cols = (int)n->args->argv[i].sz;
- break;
- }
+ cols = (int)n->data.Bl->ncols;
- assert(-1 != cols);
assert(NULL == mdoc->last->head->child);
if (NULL == mdoc->last->body->child)
@@ -1197,12 +1199,7 @@ post_bl_head(POST_ARGS)
n = mdoc->last->parent;
if (LIST_column == n->data.Bl->type) {
- for (i = 0; i < (int)n->args->argc; i++)
- if (MDOC_Column == n->args->argv[i].arg)
- break;
- assert(i < (int)n->args->argc);
-
- if (n->args->argv[i].sz && mdoc->last->nchild) {
+ if (n->data.Bl->ncols && mdoc->last->nchild) {
mdoc_nmsg(mdoc, n, MANDOCERR_COLUMNS);
return(0);
}