X-Git-Url: https://git.cameronkatri.com/mandoc.git/blobdiff_plain/ab8ed7f1e6b3e475e881e9a508b988327c06ac76..d60df528affe8e1fa6467b843167b9697cb433ad:/term.c diff --git a/term.c b/term.c index 92a67377..110bbc46 100644 --- a/term.c +++ b/term.c @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.188 2011/05/14 18:15:20 kristaps Exp $ */ +/* $Id: term.c,v 1.190 2011/05/15 15:47:46 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -605,9 +605,9 @@ size_t term_strlen(const struct termp *p, const char *cp) { size_t sz, rsz, i; - int ssz; - enum mandoc_esc esc; + int ssz, c; const char *seq, *rhs; + static const char rej[] = { '\\', ASCII_HYPH, ASCII_NBRSP, '\0' }; /* * Account for escaped sequences within string length @@ -616,15 +616,23 @@ term_strlen(const struct termp *p, const char *cp) */ sz = 0; - while ('\0' != *cp) + while ('\0' != *cp) { + rsz = strcspn(cp, rej); + for (i = 0; i < rsz; i++) + sz += (*p->width)(p, *cp++); + switch (*cp) { case ('\\'): - ++cp; - esc = mandoc_escape(&cp, &seq, &ssz); - if (ESCAPE_ERROR == esc) + cp++; + rhs = NULL; + switch (mandoc_escape(&cp, &seq, &ssz)) { + case (ESCAPE_ERROR): return(sz); - - switch (esc) { + case (ESCAPE_NUMBERED): + c = mchars_num2char(seq, ssz); + if ('\0' != c) + sz += (*p->width)(p, c); + break; case (ESCAPE_PREDEF): rhs = mchars_res2str (p->symtab, seq, ssz, &rsz); @@ -640,7 +648,6 @@ term_strlen(const struct termp *p, const char *cp) rsz = ssz; break; default: - rhs = NULL; break; } @@ -659,14 +666,13 @@ term_strlen(const struct termp *p, const char *cp) cp++; break; default: - sz += (*p->width)(p, *cp++); break; } + } return(sz); } - /* ARGSUSED */ size_t term_vspan(const struct termp *p, const struct roffsu *su) @@ -703,7 +709,6 @@ term_vspan(const struct termp *p, const struct roffsu *su) r); } - size_t term_hspan(const struct termp *p, const struct roffsu *su) {