summaryrefslogtreecommitdiffstatshomepage
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
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.
-rw-r--r--man_term.c80
-rw-r--r--mdoc_term.c82
-rw-r--r--term.c28
-rw-r--r--term.h11
-rw-r--r--term_ascii.c15
-rw-r--r--term_ps.c14
6 files changed, 139 insertions, 91 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;
diff --git a/mdoc_term.c b/mdoc_term.c
index c3dc634a..b9e7823d 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_term.c,v 1.156 2010/06/19 20:46:28 kristaps Exp $ */
+/* $Id: mdoc_term.c,v 1.157 2010/06/25 18:53:14 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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 1801ef93..bd557395 100644
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/* $Id: term.c,v 1.148 2010/06/19 20:46:28 kristaps Exp $ */
+/* $Id: term.c,v 1.149 2010/06/25 18:53:14 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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 12928da6..a9493a1b 100644
--- a/term.h
+++ b/term.h
@@ -1,4 +1,4 @@
-/* $Id: term.h,v 1.64 2010/06/19 20:46:28 kristaps Exp $ */
+/* $Id: term.h,v 1.65 2010/06/25 18:53:14 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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 84d94648..5dbb196c 100644
--- a/term_ascii.c
+++ b/term_ascii.c
@@ -1,4 +1,4 @@
-/* $Id: term_ascii.c,v 1.4 2010/06/19 20:46:28 kristaps Exp $ */
+/* $Id: term_ascii.c,v 1.5 2010/06/25 18:53:14 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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 56d1be24..7d6891d9 100644
--- a/term_ps.c
+++ b/term_ps.c
@@ -1,4 +1,4 @@
-/* $Id: term_ps.c,v 1.10 2010/06/19 20:46:28 kristaps Exp $ */
+/* $Id: term_ps.c,v 1.11 2010/06/25 18:53:14 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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);
+}