summaryrefslogtreecommitdiff
path: root/usr.bin/mandoc/mdoc_term.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2010-06-26 17:56:44 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2010-06-26 17:56:44 +0000
commitb8356f8ddb7db759bb2d0127e1d696abbc40a6b7 (patch)
treec6440ef0074ad1cb8ade3e95a121ba58e421aa40 /usr.bin/mandoc/mdoc_term.c
parent3d32c5d68dc8f6ddc0ced4e6c6b8148e0c22c1cb (diff)
merge release 1.10.2
* bug fixes: - interaction of ASCII_HYPH with special chars (found by Ulrich Spoerlein) - handling of roff conditionals (found by Ulrich Spoerlein) - .Bd -offset will no more default to 6n * maintenance: - more caching of .Bd and .Bl arguments for efficiency - deconstify man(7) validation routines - add FreeBSD library names (provided by Ulrich Spoerlein) * start PostScript font-switching
Diffstat (limited to 'usr.bin/mandoc/mdoc_term.c')
-rw-r--r--usr.bin/mandoc/mdoc_term.c161
1 files changed, 49 insertions, 112 deletions
diff --git a/usr.bin/mandoc/mdoc_term.c b/usr.bin/mandoc/mdoc_term.c
index bbdae2807e0..00d8d9ab19d 100644
--- a/usr.bin/mandoc/mdoc_term.c
+++ b/usr.bin/mandoc/mdoc_term.c
@@ -1,6 +1,6 @@
-/* $Id: mdoc_term.c,v 1.87 2010/06/10 22:50:10 schwarze Exp $ */
+/* $Id: mdoc_term.c,v 1.88 2010/06/26 17:56:43 schwarze Exp $ */
/*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
+ * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -48,15 +48,12 @@ struct termact {
void (*post)(DECL_ARGS);
};
-static size_t a2width(const struct mdoc_argv *, int);
+static size_t a2width(const char *);
static size_t a2height(const struct mdoc_node *);
-static size_t a2offs(const struct mdoc_argv *);
+static size_t a2offs(const char *);
static int arg_hasattr(int, const struct mdoc_node *);
-static int arg_getattrs(const int *, int *, size_t,
- const struct mdoc_node *);
static int arg_getattr(int, const struct mdoc_node *);
-static int arg_disptype(const struct mdoc_node *);
static void print_bvspace(struct termp *,
const struct mdoc_node *,
const struct mdoc_node *);
@@ -473,62 +470,33 @@ a2height(const struct mdoc_node *n)
static size_t
-a2width(const struct mdoc_argv *arg, int pos)
+a2width(const char *v)
{
struct roffsu su;
- assert(arg->value[pos]);
- if ( ! a2roffsu(arg->value[pos], &su, SCALE_MAX))
- SCALE_HS_INIT(&su, strlen(arg->value[pos]));
+ assert(v);
+ if ( ! a2roffsu(v, &su, SCALE_MAX))
+ SCALE_HS_INIT(&su, strlen(v));
return(term_hspan(&su));
}
-static int
-arg_disptype(const struct mdoc_node *n)
-{
- int i, len;
-
- assert(MDOC_BLOCK == n->type);
-
- len = (int)(n->args ? n->args->argc : 0);
-
- for (i = 0; i < len; i++)
- switch (n->args->argv[i].arg) {
- case (MDOC_Centred):
- /* FALLTHROUGH */
- case (MDOC_Ragged):
- /* FALLTHROUGH */
- case (MDOC_Filled):
- /* FALLTHROUGH */
- case (MDOC_Unfilled):
- /* FALLTHROUGH */
- case (MDOC_Literal):
- return(n->args->argv[i].arg);
- default:
- break;
- }
-
- return(-1);
-}
-
-
static size_t
-a2offs(const struct mdoc_argv *arg)
+a2offs(const char *v)
{
struct roffsu su;
- if ('\0' == arg->value[0][0])
+ if ('\0' == *v)
return(0);
- else if (0 == strcmp(arg->value[0], "left"))
+ else if (0 == strcmp(v, "left"))
return(0);
- else if (0 == strcmp(arg->value[0], "indent"))
+ else if (0 == strcmp(v, "indent"))
return(INDENT + 1);
- else if (0 == strcmp(arg->value[0], "indent-two"))
+ else if (0 == strcmp(v, "indent-two"))
return((INDENT + 1) * 2);
- else if ( ! a2roffsu(arg->value[0], &su, SCALE_MAX))
- SCALE_HS_INIT(&su, strlen(arg->value[0]));
+ else if ( ! a2roffsu(v, &su, SCALE_MAX))
+ SCALE_HS_INIT(&su, strlen(v));
return(term_hspan(&su));
}
@@ -548,39 +516,21 @@ arg_hasattr(int arg, const struct mdoc_node *n)
/*
* Get the index of an argument in a node's argument list or -1 if it
- * does not exist. See arg_getattrs().
+ * does not exist.
*/
static int
arg_getattr(int v, const struct mdoc_node *n)
{
- int val;
-
- return(arg_getattrs(&v, &val, 1, n) ? val : -1);
-}
-
-
-/*
- * Walk through the argument list for a node and fill an array "vals"
- * with the positions of the argument structures listed in "keys".
- * Return the number of elements that were written into "vals", which
- * can be zero.
- */
-static int
-arg_getattrs(const int *keys, int *vals,
- size_t sz, const struct mdoc_node *n)
-{
- int i, j, k;
+ int i;
if (NULL == n->args)
return(0);
- for (k = i = 0; i < (int)n->args->argc; i++)
- for (j = 0; j < (int)sz; j++)
- if (n->args->argv[i].arg == keys[j]) {
- vals[j] = i;
- k++;
- }
- return(k);
+ for (i = 0; i < (int)n->args->argc; i++)
+ if (n->args->argv[i].arg == v)
+ return(i);
+
+ return(-1);
}
@@ -597,7 +547,10 @@ print_bvspace(struct termp *p,
const struct mdoc_node *nn;
term_newln(p);
- if (arg_hasattr(MDOC_Compact, bl))
+
+ if (MDOC_Bd == bl->tok && bl->data.Bd.comp)
+ return;
+ if (MDOC_Bl == bl->tok && bl->data.Bl.comp)
return;
/* Do not vspace directly after Ss/Sh. */
@@ -616,13 +569,13 @@ print_bvspace(struct termp *p,
/* A `-column' does not assert vspace within the list. */
- if (MDOC_Bl == bl->tok && LIST_column == bl->data.list)
+ if (MDOC_Bl == bl->tok && LIST_column == bl->data.Bl.type)
if (n->prev && MDOC_It == n->prev->tok)
return;
/* A `-diag' without body does not vspace. */
- if (MDOC_Bl == bl->tok && LIST_diag == bl->data.list)
+ if (MDOC_Bl == bl->tok && LIST_diag == bl->data.Bl.type)
if (n->prev && MDOC_It == n->prev->tok) {
assert(n->prev->body);
if (NULL == n->prev->body->child)
@@ -666,7 +619,7 @@ termp_it_pre(DECL_ARGS)
{
const struct mdoc_node *bl, *nn;
char buf[7];
- int i, keys[3], vals[3];
+ int i, col;
size_t width, offset, ncols, dcol;
enum mdoc_list type;
@@ -676,18 +629,7 @@ termp_it_pre(DECL_ARGS)
}
bl = n->parent->parent->parent;
-
- /* Get list width, offset, and list type from argument list. */
-
- keys[0] = MDOC_Width;
- keys[1] = MDOC_Offset;
- keys[2] = MDOC_Column;
-
- vals[0] = vals[1] = vals[2] = -1;
-
- arg_getattrs(keys, vals, 3, bl);
-
- type = bl->data.list;
+ type = bl->data.Bl.type;
/*
* First calculate width and offset. This is pretty easy unless
@@ -697,13 +639,16 @@ termp_it_pre(DECL_ARGS)
width = offset = 0;
- if (vals[1] >= 0)
- offset = a2offs(&bl->args->argv[vals[1]]);
+ if (bl->data.Bl.offs)
+ offset = a2offs(bl->data.Bl.offs);
switch (type) {
case (LIST_column):
if (MDOC_HEAD == n->type)
break;
+
+ col = arg_getattr(MDOC_Column, bl);
+
/*
* Imitate groff's column handling:
* - For each earlier column, add its width.
@@ -713,7 +658,7 @@ termp_it_pre(DECL_ARGS)
* column.
* - For more than 5 columns, add only one column.
*/
- ncols = bl->args->argv[vals[2]].sz;
+ ncols = bl->args->argv[col].sz;
/* LINTED */
dcol = ncols < 5 ? 4 : ncols == 5 ? 3 : 1;
@@ -726,8 +671,7 @@ termp_it_pre(DECL_ARGS)
nn->prev && i < (int)ncols;
nn = nn->prev, i++)
offset += dcol + a2width
- (&bl->args->argv[vals[2]], i);
-
+ (bl->args->argv[col].value[i]);
/*
* When exceeding the declared number of columns, leave
@@ -742,10 +686,10 @@ termp_it_pre(DECL_ARGS)
* Use the declared column widths, extended as explained
* in the preceding paragraph.
*/
- width = a2width(&bl->args->argv[vals[2]], i) + dcol;
+ width = a2width(bl->args->argv[col].value[i]) + dcol;
break;
default:
- if (vals[0] < 0)
+ if (NULL == bl->data.Bl.width)
break;
/*
@@ -753,7 +697,8 @@ termp_it_pre(DECL_ARGS)
* number for buffering single arguments. See the above
* handling for column for how this changes.
*/
- width = a2width(&bl->args->argv[vals[0]], 0) + 2;
+ assert(bl->data.Bl.width);
+ width = a2width(bl->data.Bl.width) + 2;
break;
}
@@ -1015,7 +960,7 @@ termp_it_post(DECL_ARGS)
if (MDOC_BLOCK == n->type)
return;
- type = n->parent->parent->parent->data.list;
+ type = n->parent->parent->parent->data.Bl.type;
switch (type) {
case (LIST_item):
@@ -1628,7 +1573,6 @@ static int
termp_bd_pre(DECL_ARGS)
{
size_t tabwidth;
- int i, type;
size_t rm, rmax;
const struct mdoc_node *nn;
@@ -1638,13 +1582,8 @@ termp_bd_pre(DECL_ARGS)
} else if (MDOC_HEAD == n->type)
return(0);
- nn = n->parent;
-
- type = arg_disptype(nn);
- assert(-1 != type);
-
- if (-1 != (i = arg_getattr(MDOC_Offset, nn)))
- p->offset += a2offs(&nn->args->argv[i]);
+ if (n->data.Bd.offs)
+ p->offset += a2offs(n->data.Bd.offs);
/*
* If -ragged or -filled are specified, the block does nothing
@@ -1654,7 +1593,8 @@ termp_bd_pre(DECL_ARGS)
* lines are allowed.
*/
- if (MDOC_Literal != type && MDOC_Unfilled != type)
+ if (DISP_literal != n->data.Bd.type &&
+ DISP_unfilled != n->data.Bd.type)
return(1);
tabwidth = p->tabwidth;
@@ -1671,8 +1611,8 @@ termp_bd_pre(DECL_ARGS)
NULL == nn->next)
term_flushln(p);
}
- p->tabwidth = tabwidth;
+ p->tabwidth = tabwidth;
p->rmargin = rm;
p->maxrmargin = rmax;
return(0);
@@ -1683,19 +1623,16 @@ termp_bd_pre(DECL_ARGS)
static void
termp_bd_post(DECL_ARGS)
{
- int type;
size_t rm, rmax;
if (MDOC_BODY != n->type)
return;
- type = arg_disptype(n->parent);
- assert(-1 != type);
-
rm = p->rmargin;
rmax = p->maxrmargin;
- if (MDOC_Literal == type || MDOC_Unfilled == type)
+ if (DISP_literal == n->data.Bd.type ||
+ DISP_unfilled == n->data.Bd.type)
p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
p->flags |= TERMP_NOSPACE;