summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man_term.c78
-rw-r--r--mdoc_term.c80
-rw-r--r--term.c26
-rw-r--r--term.h9
-rw-r--r--term_ascii.c13
-rw-r--r--term_ps.c12
6 files changed, 133 insertions, 85 deletions
diff --git a/man_term.c b/man_term.c
index 80d82efb..0f09ec01 100644
--- a/man_term.c
+++ b/man_term.c
@@ -70,8 +70,8 @@ struct termact {
#define MAN_NOTEXT (1 << 0) /* Never has text children. */
};
-static int a2width(const struct man_node *);
-static int a2height(const struct man_node *);
+static int a2width(const struct termp *, const char *);
+static size_t a2height(const struct termp *, const char *);
static void print_man_nodelist(DECL_ARGS);
static void print_man_node(DECL_ARGS);
@@ -158,7 +158,7 @@ terminal_man(void *arg, const struct man *man)
p->overstep = 0;
p->maxrmargin = p->defrmargin;
- p->tabwidth = 5;
+ p->tabwidth = term_len(p, 5);
if (NULL == p->symtab)
switch (p->enc) {
@@ -177,8 +177,8 @@ terminal_man(void *arg, const struct man *man)
p->flags |= TERMP_NOSPACE;
mt.fl = 0;
- mt.lmargin = INDENT;
- mt.offset = INDENT;
+ mt.lmargin = term_len(p, INDENT);
+ mt.offset = term_len(p, INDENT);
if (n->child)
print_man_nodelist(p, &mt, n->child, m);
@@ -187,31 +187,27 @@ terminal_man(void *arg, const struct man *man)
}
-static int
-a2height(const struct man_node *n)
+static size_t
+a2height(const struct termp *p, const char *cp)
{
struct roffsu su;
- assert(MAN_TEXT == n->type);
- assert(n->string);
- if ( ! a2roffsu(n->string, &su, SCALE_VS))
- SCALE_VS_INIT(&su, strlen(n->string));
+ if ( ! a2roffsu(cp, &su, SCALE_VS))
+ SCALE_VS_INIT(&su, term_strlen(p, cp));
- return((int)term_vspan(&su));
+ return(term_vspan(p, &su));
}
static int
-a2width(const struct man_node *n)
+a2width(const struct termp *p, const char *cp)
{
struct roffsu su;
- assert(MAN_TEXT == n->type);
- assert(n->string);
- if ( ! a2roffsu(n->string, &su, SCALE_BU))
+ if ( ! a2roffsu(cp, &su, SCALE_BU))
return(-1);
- return((int)term_hspan(&su));
+ return((int)term_hspan(p, &su));
}
@@ -359,9 +355,10 @@ pre_B(DECL_ARGS)
static int
pre_sp(DECL_ARGS)
{
- int i, len;
+ size_t i, len;
- len = n->child ? a2height(n->child) : 1;
+ len = n->child ?
+ a2height(p, n->child->string) : term_len(p, 1);
if (0 == len)
term_newln(p);
@@ -408,11 +405,11 @@ pre_HP(DECL_ARGS)
/* Calculate offset. */
if (NULL != (nn = n->parent->head->child))
- if ((ival = a2width(nn)) >= 0)
+ if ((ival = a2width(p, nn->string)) >= 0)
len = (size_t)ival;
if (0 == len)
- len = 1;
+ len = term_len(p, 1);
p->offset = mt->offset;
p->rmargin = mt->offset + len;
@@ -453,7 +450,7 @@ pre_PP(DECL_ARGS)
switch (n->type) {
case (MAN_BLOCK):
- mt->lmargin = INDENT;
+ mt->lmargin = term_len(p, INDENT);
print_bvspace(p, n);
break;
default:
@@ -497,7 +494,7 @@ pre_IP(DECL_ARGS)
if (NULL != (nn = nn->next)) {
for ( ; nn->next; nn = nn->next)
/* Do nothing. */ ;
- if ((ival = a2width(nn)) >= 0)
+ if ((ival = a2width(p, nn->string)) >= 0)
len = (size_t)ival;
}
@@ -505,7 +502,7 @@ pre_IP(DECL_ARGS)
case (MAN_HEAD):
/* Handle zero-width lengths. */
if (0 == len)
- len = 1;
+ len = term_len(p, 1);
p->offset = mt->offset;
p->rmargin = mt->offset + len;
@@ -585,7 +582,7 @@ pre_TP(DECL_ARGS)
while (nn && MAN_TEXT != nn->type)
nn = nn->next;
if (nn && nn->next)
- if ((ival = a2width(nn)) >= 0)
+ if ((ival = a2width(p, nn->string)) >= 0)
len = (size_t)ival;
}
@@ -593,7 +590,7 @@ pre_TP(DECL_ARGS)
case (MAN_HEAD):
/* Handle zero-length properly. */
if (0 == len)
- len = 1;
+ len = term_len(p, 1);
p->offset = mt->offset;
p->rmargin = mt->offset + len;
@@ -648,8 +645,8 @@ pre_SS(DECL_ARGS)
switch (n->type) {
case (MAN_BLOCK):
- mt->lmargin = INDENT;
- mt->offset = INDENT;
+ mt->lmargin = term_len(p, INDENT);
+ mt->offset = term_len(p, INDENT);
/* If following a prior empty `SS', no vspace. */
if (n->prev && MAN_SS == n->prev->tok)
if (NULL == n->prev->body->child)
@@ -660,7 +657,7 @@ pre_SS(DECL_ARGS)
break;
case (MAN_HEAD):
term_fontrepl(p, TERMFONT_BOLD);
- p->offset = HALFINDENT;
+ p->offset = term_len(p, HALFINDENT);
break;
case (MAN_BODY):
p->offset = mt->offset;
@@ -698,8 +695,8 @@ pre_SH(DECL_ARGS)
switch (n->type) {
case (MAN_BLOCK):
- mt->lmargin = INDENT;
- mt->offset = INDENT;
+ mt->lmargin = term_len(p, INDENT);
+ mt->offset = term_len(p, INDENT);
/* If following a prior empty `SH', no vspace. */
if (n->prev && MAN_SH == n->prev->tok)
if (NULL == n->prev->body->child)
@@ -760,15 +757,15 @@ pre_RS(DECL_ARGS)
}
if (NULL == (nn = n->parent->head->child)) {
- mt->offset = mt->lmargin + INDENT;
+ mt->offset = mt->lmargin + term_len(p, INDENT);
p->offset = mt->offset;
return(1);
}
- if ((ival = a2width(nn)) < 0)
+ if ((ival = a2width(p, nn->string)) < 0)
return(1);
- mt->offset = INDENT + (size_t)ival;
+ mt->offset = term_len(p, INDENT) + (size_t)ival;
p->offset = mt->offset;
return(1);
@@ -782,13 +779,13 @@ post_RS(DECL_ARGS)
switch (n->type) {
case (MAN_BLOCK):
- mt->offset = mt->lmargin = INDENT;
+ mt->offset = mt->lmargin = term_len(p, INDENT);
break;
case (MAN_HEAD):
break;
default:
term_newln(p);
- p->offset = INDENT;
+ p->offset = term_len(p, INDENT);
break;
}
}
@@ -877,7 +874,7 @@ print_man_foot(struct termp *p, const void *arg)
term_vspace(p);
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
- p->rmargin = p->maxrmargin - strlen(buf);
+ p->rmargin = p->maxrmargin - term_strlen(p, buf);
p->offset = 0;
if (meta->source)
@@ -918,14 +915,15 @@ print_man_head(struct termp *p, const void *arg)
if (m->vol)
strlcpy(buf, m->vol, BUFSIZ);
- buflen = strlen(buf);
+ buflen = term_strlen(p, buf);
snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec);
- titlen = strlen(title);
+ titlen = term_strlen(p, title);
p->offset = 0;
p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ?
- (p->maxrmargin - strlen(buf) + 1) / 2 :
+ (p->maxrmargin -
+ term_strlen(p, buf) + term_len(p, 1)) / 2 :
p->maxrmargin - buflen;
p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;
diff --git a/mdoc_term.c b/mdoc_term.c
index 1f502029..2ca83630 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -52,9 +52,9 @@ struct termact {
void (*post)(DECL_ARGS);
};
-static size_t a2width(const char *);
-static size_t a2height(const struct mdoc_node *);
-static size_t a2offs(const char *);
+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_hasattr(int, const struct mdoc_node *);
static int arg_getattr(int, const struct mdoc_node *);
@@ -271,7 +271,7 @@ terminal_mdoc(void *arg, const struct mdoc *mdoc)
p->overstep = 0;
p->maxrmargin = p->defrmargin;
- p->tabwidth = 5;
+ p->tabwidth = term_len(p, 5);
if (NULL == p->symtab)
switch (p->enc) {
@@ -369,14 +369,15 @@ print_mdoc_foot(struct termp *p, const void *arg)
term_vspace(p);
p->offset = 0;
- p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2;
+ p->rmargin = (p->maxrmargin -
+ term_strlen(p, buf) + term_len(p, 1)) / 2;
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
term_word(p, os);
term_flushln(p);
p->offset = p->rmargin;
- p->rmargin = p->maxrmargin - strlen(os);
+ p->rmargin = p->maxrmargin - term_strlen(p, os);
p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
term_word(p, buf);
@@ -432,14 +433,15 @@ print_mdoc_head(struct termp *p, const void *arg)
snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec);
p->offset = 0;
- p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2;
+ p->rmargin = (p->maxrmargin -
+ term_strlen(p, buf) + term_len(p, 1)) / 2;
p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;
term_word(p, title);
term_flushln(p);
p->offset = p->rmargin;
- p->rmargin = p->maxrmargin - strlen(title);
+ p->rmargin = p->maxrmargin - term_strlen(p, title);
p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
term_word(p, buf);
@@ -460,34 +462,33 @@ print_mdoc_head(struct termp *p, const void *arg)
static size_t
-a2height(const struct mdoc_node *n)
+a2height(const struct termp *p, const char *v)
{
struct roffsu su;
- assert(MDOC_TEXT == n->type);
- assert(n->string);
- if ( ! a2roffsu(n->string, &su, SCALE_VS))
- SCALE_VS_INIT(&su, strlen(n->string));
+ assert(v);
+ if ( ! a2roffsu(v, &su, SCALE_VS))
+ SCALE_VS_INIT(&su, term_len(p, 1));
- return(term_vspan(&su));
+ return(term_vspan(p, &su));
}
static size_t
-a2width(const char *v)
+a2width(const struct termp *p, const char *v)
{
struct roffsu su;
assert(v);
if ( ! a2roffsu(v, &su, SCALE_MAX))
- SCALE_HS_INIT(&su, strlen(v));
+ SCALE_HS_INIT(&su, term_strlen(p, v));
- return(term_hspan(&su));
+ return(term_hspan(p, &su));
}
static size_t
-a2offs(const char *v)
+a2offs(const struct termp *p, const char *v)
{
struct roffsu su;
@@ -496,13 +497,13 @@ a2offs(const char *v)
else if (0 == strcmp(v, "left"))
return(0);
else if (0 == strcmp(v, "indent"))
- return(INDENT + 1);
+ return(term_len(p, INDENT + 1));
else if (0 == strcmp(v, "indent-two"))
- return((INDENT + 1) * 2);
+ return(term_len(p, (INDENT + 1) * 2));
else if ( ! a2roffsu(v, &su, SCALE_MAX))
- SCALE_HS_INIT(&su, strlen(v));
+ SCALE_HS_INIT(&su, term_strlen(p, v));
- return(term_hspan(&su));
+ return(term_hspan(p, &su));
}
@@ -644,7 +645,7 @@ termp_it_pre(DECL_ARGS)
width = offset = 0;
if (bl->data.Bl.offs)
- offset = a2offs(bl->data.Bl.offs);
+ offset = a2offs(p, bl->data.Bl.offs);
switch (type) {
case (LIST_column):
@@ -664,7 +665,8 @@ termp_it_pre(DECL_ARGS)
*/
ncols = bl->args->argv[col].sz;
/* LINTED */
- dcol = ncols < 5 ? 4 : ncols == 5 ? 3 : 1;
+ dcol = ncols < 5 ? term_len(p, 4) :
+ ncols == 5 ? term_len(p, 3) : term_len(p, 1);
/*
* Calculate the offset by applying all prior MDOC_BODY,
@@ -675,7 +677,7 @@ termp_it_pre(DECL_ARGS)
nn->prev && i < (int)ncols;
nn = nn->prev, i++)
offset += dcol + a2width
- (bl->args->argv[col].value[i]);
+ (p, bl->args->argv[col].value[i]);
/*
* When exceeding the declared number of columns, leave
@@ -690,7 +692,7 @@ termp_it_pre(DECL_ARGS)
* Use the declared column widths, extended as explained
* in the preceding paragraph.
*/
- width = a2width(bl->args->argv[col].value[i]) + dcol;
+ width = a2width(p, bl->args->argv[col].value[i]) + dcol;
break;
default:
if (NULL == bl->data.Bl.width)
@@ -702,7 +704,7 @@ termp_it_pre(DECL_ARGS)
* handling for column for how this changes.
*/
assert(bl->data.Bl.width);
- width = a2width(bl->data.Bl.width) + 2;
+ width = a2width(p, bl->data.Bl.width) + term_len(p, 2);
break;
}
@@ -718,22 +720,22 @@ termp_it_pre(DECL_ARGS)
case (LIST_dash):
/* FALLTHROUGH */
case (LIST_hyphen):
- if (width < 4)
- width = 4;
+ if (width < term_len(p, 4))
+ width = term_len(p, 4);
break;
case (LIST_enum):
- if (width < 5)
- width = 5;
+ if (width < term_len(p, 5))
+ width = term_len(p, 5);
break;
case (LIST_hang):
if (0 == width)
- width = 8;
+ width = term_len(p, 8);
break;
case (LIST_column):
/* FALLTHROUGH */
case (LIST_tag):
if (0 == width)
- width = 10;
+ width = term_len(p, 10);
break;
default:
break;
@@ -1374,7 +1376,7 @@ termp_sh_pre(DECL_ARGS)
term_fontpush(p, TERMFONT_BOLD);
break;
case (MDOC_BODY):
- p->offset = INDENT;
+ p->offset = term_len(p, INDENT);
break;
default:
break;
@@ -1459,7 +1461,7 @@ termp_d1_pre(DECL_ARGS)
if (MDOC_BLOCK != n->type)
return(1);
term_newln(p);
- p->offset += (INDENT + 1);
+ p->offset += term_len(p, (INDENT + 1));
return(1);
}
@@ -1587,7 +1589,7 @@ termp_bd_pre(DECL_ARGS)
return(0);
if (n->data.Bd.offs)
- p->offset += a2offs(n->data.Bd.offs);
+ p->offset += a2offs(p, n->data.Bd.offs);
/*
* If -ragged or -filled are specified, the block does nothing
@@ -1602,7 +1604,7 @@ termp_bd_pre(DECL_ARGS)
return(1);
tabwidth = p->tabwidth;
- p->tabwidth = 8;
+ p->tabwidth = term_len(p, 8);
rm = p->rmargin;
rmax = p->maxrmargin;
p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
@@ -1777,7 +1779,7 @@ termp_ss_pre(DECL_ARGS)
break;
case (MDOC_HEAD):
term_fontpush(p, TERMFONT_BOLD);
- p->offset = HALFINDENT;
+ p->offset = term_len(p, HALFINDENT);
break;
default:
break;
@@ -1853,7 +1855,7 @@ termp_sp_pre(DECL_ARGS)
switch (n->tok) {
case (MDOC_sp):
- len = n->child ? a2height(n->child) : 1;
+ len = n->child ? a2height(p, n->child->string) : 1;
break;
case (MDOC_br):
len = 0;
diff --git a/term.c b/term.c
index c92b4131..854c6050 100644
--- a/term.c
+++ b/term.c
@@ -87,9 +87,7 @@ term_alloc(enum termenc enc)
exit(EXIT_FAILURE);
}
- p->tabwidth = 5;
p->enc = enc;
- p->defrmargin = 78;
return(p);
}
@@ -626,7 +624,27 @@ encode(struct termp *p, const char *word, size_t sz)
size_t
-term_vspan(const struct roffsu *su)
+term_len(const struct termp *p, size_t sz)
+{
+
+ return((*p->width)(p, ' ') * sz);
+}
+
+
+size_t
+term_strlen(const struct termp *p, const char *cp)
+{
+ size_t sz;
+
+ for (sz = 0; *cp; cp++)
+ sz += (*p->width)(p, *cp);
+
+ return(sz);
+}
+
+
+size_t
+term_vspan(const struct termp *p, const struct roffsu *su)
{
double r;
@@ -662,7 +680,7 @@ term_vspan(const struct roffsu *su)
size_t
-term_hspan(const struct roffsu *su)
+term_hspan(const struct termp *p, const struct roffsu *su)
{
double r;
diff --git a/term.h b/term.h
index 421d909a..41acd5df 100644
--- a/term.h
+++ b/term.h
@@ -91,6 +91,7 @@ struct termp {
void (*end)(struct termp *);
void (*endline)(struct termp *);
void (*advance)(struct termp *, size_t);
+ size_t (*width)(const struct termp *, char);
const void *argf; /* arg for headf/footf */
union {
struct termp_ps ps;
@@ -107,8 +108,12 @@ void term_begin(struct termp *, term_margin,
term_margin, const void *);
void term_end(struct termp *);
-size_t term_hspan(const struct roffsu *);
-size_t term_vspan(const struct roffsu *);
+size_t term_hspan(const struct termp *,
+ const struct roffsu *);
+size_t term_vspan(const struct termp *,
+ const struct roffsu *);
+size_t term_strlen(const struct termp *, const char *);
+size_t term_len(const struct termp *, size_t);
enum termfont term_fonttop(struct termp *);
const void *term_fontq(struct termp *);
diff --git a/term_ascii.c b/term_ascii.c
index ade99da3..1b0ed345 100644
--- a/term_ascii.c
+++ b/term_ascii.c
@@ -35,6 +35,7 @@ static void ascii_letter(struct termp *, char);
static void ascii_begin(struct termp *);
static void ascii_advance(struct termp *, size_t);
static void ascii_end(struct termp *);
+static size_t ascii_width(const struct termp *, char);
void *
@@ -47,12 +48,16 @@ ascii_alloc(char *outopts)
if (NULL == (p = term_alloc(TERMENC_ASCII)))
return(NULL);
+ p->tabwidth = 5;
+ p->defrmargin = 78;
+
p->type = TERMTYPE_CHAR;
p->letter = ascii_letter;
p->begin = ascii_begin;
p->end = ascii_end;
p->endline = ascii_endline;
p->advance = ascii_advance;
+ p->width = ascii_width;
toks[0] = "width";
toks[1] = NULL;
@@ -74,6 +79,14 @@ ascii_alloc(char *outopts)
}
+static size_t
+ascii_width(const struct termp *p, char c)
+{
+
+ return(1);
+}
+
+
void
ascii_free(void *arg)
{
diff --git a/term_ps.c b/term_ps.c
index 96b8fb9a..8d843806 100644
--- a/term_ps.c
+++ b/term_ps.c
@@ -60,6 +60,7 @@ static void ps_end(struct termp *);
static void ps_advance(struct termp *, size_t);
static void ps_endline(struct termp *);
static void ps_fclose(struct termp *);
+static size_t ps_width(const struct termp *, char);
static void ps_pclose(struct termp *);
static void ps_pletter(struct termp *, char);
static void ps_printf(struct termp *, const char *, ...);
@@ -75,12 +76,16 @@ ps_alloc(void)
if (NULL == (p = term_alloc(TERMENC_ASCII)))
return(NULL);
+ p->defrmargin = 78;
+ p->tabwidth = 5;
+
p->type = TERMTYPE_PS;
p->letter = ps_letter;
p->begin = ps_begin;
p->end = ps_end;
p->advance = ps_advance;
p->endline = ps_endline;
+ p->width = ps_width;
return(p);
}
@@ -425,3 +430,10 @@ ps_setfont(struct termp *p, enum termfont f)
p->engine.ps.lastf = f;
}
+
+static size_t
+ps_width(const struct termp *p, char c)
+{
+
+ return(1);
+}