]> git.cameronkatri.com Git - mandoc.git/commitdiff
Initial chunks for variable-width fonts. Pushes all width calculations
authorKristaps Dzonsons <kristaps@bsd.lv>
Fri, 25 Jun 2010 18:53:14 +0000 (18:53 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Fri, 25 Jun 2010 18:53:14 +0000 (18:53 +0000)
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.

man_term.c
mdoc_term.c
term.c
term.h
term_ascii.c
term_ps.c

index db2e9cc4a970e31c70f8448cf6eb016ade56a2eb..5b59968b3f549c3498109ebc86da13f0139560fe 100644 (file)
@@ -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;
 
index c3dc634a3236aa5aa103105fc7d0e16c275ff4a1..b9e7823dab291fc378c08ef20d07be74336fc580 100644 (file)
@@ -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 1801ef936d7ecbef8648bb3019d1bbf1f7fd1d8a..bd5573953a5fe74b149794ffadd100a53911dc71 100644 (file)
--- 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 12928da61812b116b74e15b9ba9a80310305f73a..a9493a1b14e67bafe5544db6c7a92acbe1a66769 100644 (file)
--- 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 *);
index 84d946486dbbc27e44fde7980b0f724ac48742b0..5dbb196c08ae49aeac07d14e52ce7d448eaf7d64 100644 (file)
@@ -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)
 {
index 56d1be2400880cd705e3f402ee91410cb7490c69..7d6891d9a4ea1627cc936c97c169afb622e2809f 100644 (file)
--- 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);
+}