=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.90 retrieving revision 1.93 diff -u -p -r1.90 -r1.93 --- mandoc/mdoc_term.c 2009/10/15 01:33:12 1.90 +++ mandoc/mdoc_term.c 2009/10/19 15:18:30 1.93 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.90 2009/10/15 01:33:12 kristaps Exp $ */ +/* $Id: mdoc_term.c,v 1.93 2009/10/19 15:18:30 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -23,6 +23,7 @@ #include #include +#include "out.h" #include "term.h" #include "mdoc.h" #include "chars.h" @@ -242,14 +243,16 @@ extern size_t strlcpy(char *, const char *, size_t); extern size_t strlcat(char *, const char *, size_t); #endif +static size_t arg2width(const struct mdoc_argv *, int); +static size_t arg2height(const struct mdoc_node *); +static size_t arg2offs(const struct mdoc_argv *); + 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 size_t arg_offset(const struct mdoc_argv *); -static size_t arg_width(const struct mdoc_argv *, int); static int arg_listtype(const struct mdoc_node *); -static void fmt_block_vspace(struct termp *, +static void print_bvspace(struct termp *, const struct mdoc_node *, const struct mdoc_node *); static void print_node(DECL_ARGS); @@ -470,34 +473,34 @@ print_head(DECL_ARGS) } -/* FIXME: put in utility file for front-ends. */ static size_t -arg_width(const struct mdoc_argv *arg, int pos) +arg2height(const struct mdoc_node *n) { - int i, len; - const char *p; + struct roffsu su; - assert(pos < (int)arg->sz && pos >= 0); - assert(arg->value[pos]); + assert(MDOC_TEXT == n->type); + assert(n->string); + if ( ! a2roffsu(n->string, &su, SCALE_VS)) + SCALE_VS_INIT(&su, strlen(n->string)); - p = arg->value[pos]; + return(term_vspan(&su)); +} - if (0 == (len = (int)strlen(p))) - return(0); - for (i = 0; i < len - 1; i++) - if ( ! isdigit((u_char)p[i])) - break; +static size_t +arg2width(const struct mdoc_argv *arg, int pos) +{ + struct roffsu su; - if (i == len - 1) - if ('n' == p[len - 1] || 'm' == p[len - 1]) - return((size_t)atoi(p) + 2); + assert(arg->value[pos]); + if ( ! a2roffsu(arg->value[pos], &su, SCALE_MAX)) + SCALE_HS_INIT(&su, strlen(arg->value[pos])); - return((size_t)len + 2); + /* XXX: pachemu? */ + return(term_hspan(&su) + 2); } -/* FIXME: put in utility file for front-ends. */ static int arg_listtype(const struct mdoc_node *n) { @@ -539,35 +542,23 @@ arg_listtype(const struct mdoc_node *n) } -/* FIXME: put in utility file for front-ends. */ static size_t -arg_offset(const struct mdoc_argv *arg) +arg2offs(const struct mdoc_argv *arg) { - int len, i; - const char *p; + struct roffsu su; - assert(*arg->value); - p = *arg->value; - - if (0 == strcmp(p, "left")) + if ('\0' == arg->value[0][0]) return(0); - if (0 == strcmp(p, "indent")) + else if (0 == strcmp(arg->value[0], "left")) + return(0); + else if (0 == strcmp(arg->value[0], "indent")) return(INDENT + 1); - if (0 == strcmp(p, "indent-two")) + else if (0 == strcmp(arg->value[0], "indent-two")) return((INDENT + 1) * 2); + else if ( ! a2roffsu(arg->value[0], &su, SCALE_MAX)) + SCALE_HS_INIT(&su, strlen(arg->value[0])); - if (0 == (len = (int)strlen(p))) - return(0); - - for (i = 0; i < len - 1; i++) - if ( ! isdigit((u_char)p[i])) - break; - - if (i == len - 1) - if ('n' == p[len - 1] || 'm' == p[len - 1]) - return((size_t)atoi(p)); - - return((size_t)len); + return(term_hspan(&su)); } @@ -607,9 +598,8 @@ arg_getattrs(const int *keys, int *vals, } -/* ARGSUSED */ static void -fmt_block_vspace(struct termp *p, +print_bvspace(struct termp *p, const struct mdoc_node *bl, const struct mdoc_node *n) { @@ -689,7 +679,7 @@ termp_it_pre(DECL_ARGS) size_t width, offset; if (MDOC_BLOCK == n->type) { - fmt_block_vspace(p, n->parent->parent, n); + print_bvspace(p, n->parent->parent, n); return(1); } @@ -732,23 +722,23 @@ termp_it_pre(DECL_ARGS) for (i = 0, nn = n->prev; nn && i < (int)bl->args->argv[vals[2]].sz; nn = nn->prev, i++) - offset += arg_width + offset += arg2width (&bl->args->argv[vals[2]], i); /* Whether exceeds maximum column. */ if (i < (int)bl->args->argv[vals[2]].sz) - width = arg_width(&bl->args->argv[vals[2]], i); + width = arg2width(&bl->args->argv[vals[2]], i); else width = 0; if (vals[1] >= 0) - offset += arg_offset(&bl->args->argv[vals[1]]); + offset += arg2offs(&bl->args->argv[vals[1]]); break; default: if (vals[0] >= 0) - width = arg_width(&bl->args->argv[vals[0]], 0); + width = arg2width(&bl->args->argv[vals[0]], 0); if (vals[1] >= 0) - offset += arg_offset(&bl->args->argv[vals[1]]); + offset += arg2offs(&bl->args->argv[vals[1]]); break; } @@ -1550,7 +1540,7 @@ termp_bd_pre(DECL_ARGS) const struct mdoc_node *nn; if (MDOC_BLOCK == n->type) { - fmt_block_vspace(p, n, n); + print_bvspace(p, n, n); return(1); } else if (MDOC_BODY != n->type) return(1); @@ -1571,7 +1561,7 @@ termp_bd_pre(DECL_ARGS) type = nn->args->argv[i].arg; break; case (MDOC_Offset): - p->offset += arg_offset(&nn->args->argv[i]); + p->offset += arg2offs(&nn->args->argv[i]); break; default: break; @@ -1822,11 +1812,11 @@ termp_in_post(DECL_ARGS) static int termp_sp_pre(DECL_ARGS) { - int i, len; + size_t i, len; switch (n->tok) { case (MDOC_sp): - len = n->child ? atoi(n->child->string) : 1; + len = n->child ? arg2height(n->child) : 1; break; case (MDOC_br): len = 0;