aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/man_term.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-06-25 18:53:14 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-06-25 18:53:14 +0000
commitd7293bc22cd91ff63e04800adfed0982252d8574 (patch)
tree74bc47d73e12087b65abc5914862898a9dc96a12 /man_term.c
parenteb93fb04842bea580dd14f70d9688486882b69fe (diff)
downloadmandoc-d7293bc22cd91ff63e04800adfed0982252d8574.tar.gz
mandoc-d7293bc22cd91ff63e04800adfed0982252d8574.tar.zst
mandoc-d7293bc22cd91ff63e04800adfed0982252d8574.zip
Initial chunks for variable-width fonts. Pushes all width calculations
in mdoc_term.c and man_term.c down into term.c. This is still not implemented in term.c, although stubs for width calculations are in place. From now on, offset, rmargin, and other layout variables are abstract screen widths. They will resolve to the the familiar values for -Tascii but -Tps will eventually use points instead of chars.
Diffstat (limited to 'man_term.c')
-rw-r--r--man_term.c80
1 files changed, 39 insertions, 41 deletions
diff --git a/man_term.c b/man_term.c
index db2e9cc4..5b59968b 100644
--- a/man_term.c
+++ b/man_term.c
@@ -1,4 +1,4 @@
-/* $Id: man_term.c,v 1.76 2010/06/19 20:46:28 kristaps Exp $ */
+/* $Id: man_term.c,v 1.77 2010/06/25 18:53:14 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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;