-/* $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 <kristaps@bsd.lv>
* Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
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
*/
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);
rsz = ssz;
break;
default:
- rhs = NULL;
break;
}
cp++;
break;
default:
- sz += (*p->width)(p, *cp++);
break;
}
+ }
return(sz);
}
-
/* ARGSUSED */
size_t
term_vspan(const struct termp *p, const struct roffsu *su)
r);
}
-
size_t
term_hspan(const struct termp *p, const struct roffsu *su)
{