aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/term.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-07-26 21:58:41 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-07-26 21:58:41 +0000
commit24ce22505f53c465459aae9ef86b0d767b2d69e7 (patch)
tree8d231d4ee2a58f3132b8c5c337d5eac5df1ef762 /term.c
parentfa0db51378801e484a880d49db185a8b85861474 (diff)
downloadmandoc-24ce22505f53c465459aae9ef86b0d767b2d69e7.tar.gz
mandoc-24ce22505f53c465459aae9ef86b0d767b2d69e7.tar.zst
mandoc-24ce22505f53c465459aae9ef86b0d767b2d69e7.zip
Clean up some tight spots in mandoc's default mode: pessimistically
pre-allocate the output buffer for words and in-line the buffera() function, which was only called in one place anyway.
Diffstat (limited to 'term.c')
-rw-r--r--term.c35
1 files changed, 15 insertions, 20 deletions
diff --git a/term.c b/term.c
index d212c004..603a6a34 100644
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/* $Id: term.c,v 1.164 2010/07/25 22:56:47 kristaps Exp $ */
+/* $Id: term.c,v 1.165 2010/07/26 21:58:41 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -37,7 +37,6 @@
static void spec(struct termp *, enum roffdeco,
const char *, size_t);
static void res(struct termp *, const char *, size_t);
-static void buffera(struct termp *, const char *, size_t);
static void bufferc(struct termp *, char);
static void adjbuf(struct termp *p, size_t);
static void encode(struct termp *, const char *, size_t);
@@ -582,18 +581,6 @@ adjbuf(struct termp *p, size_t sz)
static void
-buffera(struct termp *p, const char *word, size_t sz)
-{
-
- if (p->col + sz >= p->maxcols)
- adjbuf(p, p->col + sz);
-
- memcpy(&p->buf[(int)p->col], word, sz);
- p->col += sz;
-}
-
-
-static void
bufferc(struct termp *p, char c)
{
@@ -617,23 +604,31 @@ encode(struct termp *p, const char *word, size_t sz)
*/
if (TERMFONT_NONE == (f = term_fonttop(p))) {
- buffera(p, word, sz);
+ if (p->col + sz >= p->maxcols)
+ adjbuf(p, p->col + sz);
+ memcpy(&p->buf[(int)p->col], word, sz);
+ p->col += sz;
return;
}
+ /* Pre-buffer, assuming worst-case. */
+
+ if (p->col + 1 + (sz * 3) >= p->maxcols)
+ adjbuf(p, p->col + 1 + (sz * 3));
+
for (i = 0; i < (int)sz; i++) {
if ( ! isgraph((u_char)word[i])) {
- bufferc(p, word[i]);
+ p->buf[(int)p->col++] = word[i];
continue;
}
if (TERMFONT_UNDER == f)
- bufferc(p, '_');
+ p->buf[(int)p->col++] = '_';
else
- bufferc(p, word[i]);
+ p->buf[(int)p->col++] = word[i];
- bufferc(p, 8);
- bufferc(p, word[i]);
+ p->buf[(int)p->col++] = 8;
+ p->buf[(int)p->col++] = word[i];
}
}