summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-11-07 14:14:15 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-11-07 14:14:15 +0000
commitb01b4dbd0137ad522cd297b8995201927cd7842c (patch)
tree4c405754219fa978703ccc9d03f726250eb2dedf
parent65f8ae861f5855669ce4473e9c89a5a2003a89ac (diff)
downloadmandoc-b01b4dbd0137ad522cd297b8995201927cd7842c.tar.gz
mandoc-b01b4dbd0137ad522cd297b8995201927cd7842c.tar.zst
mandoc-b01b4dbd0137ad522cd297b8995201927cd7842c.zip
Hooked up -Tascii to a2roffdeco backend.
-rw-r--r--out.c5
-rw-r--r--term.c252
2 files changed, 52 insertions, 205 deletions
diff --git a/out.c b/out.c
index 307af614..e217327c 100644
--- a/out.c
+++ b/out.c
@@ -1,4 +1,4 @@
-/* $Id: out.c,v 1.8 2009/11/07 08:26:45 kristaps Exp $ */
+/* $Id: out.c,v 1.9 2009/11/07 14:14:15 kristaps Exp $ */
/*
* Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -176,7 +176,6 @@ a2roffdeco(enum roffdeco *d,
const char *wp;
*d = DECO_NONE;
-
wp = *word;
type = 1;
@@ -223,7 +222,7 @@ a2roffdeco(enum roffdeco *d,
*d = DECO_RESERVED;
*sz = 1;
*word = wp;
- return(3);
+ return(2);
}
break;
diff --git a/term.c b/term.c
index 937d2526..620f0b1e 100644
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/* $Id: term.c,v 1.123 2009/11/06 10:31:32 kristaps Exp $ */
+/* $Id: term.c,v 1.124 2009/11/07 14:14:16 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -34,7 +34,6 @@
static struct termp *term_alloc(enum termenc);
static void term_free(struct termp *);
-static void do_escaped(struct termp *, const char **);
static void do_special(struct termp *,
const char *, size_t);
static void do_reserved(struct termp *,
@@ -367,201 +366,6 @@ do_reserved(struct termp *p, const char *word, size_t len)
/*
- * Handle an escape sequence: determine its length and pass it to the
- * escape-symbol look table. Note that we assume mdoc(3) has validated
- * the escape sequence (we assert upon badly-formed escape sequences).
- */
-static void
-do_escaped(struct termp *p, const char **word)
-{
- int j, type, sv, t, lim;
- const char *wp;
-
- wp = *word;
- type = 1;
-
- if ('\0' == *(++wp)) {
- *word = wp;
- return;
- }
-
- if ('(' == *wp) {
- wp++;
- if ('\0' == *wp || '\0' == *(wp + 1)) {
- *word = '\0' == *wp ? wp : wp + 1;
- return;
- }
-
- do_special(p, wp, 2);
- *word = ++wp;
- return;
-
- } else if ('*' == *wp) {
- if ('\0' == *(++wp)) {
- *word = wp;
- return;
- }
-
- switch (*wp) {
- case ('('):
- wp++;
- if ('\0' == *wp || '\0' == *(wp + 1)) {
- *word = '\0' == *wp ? wp : wp + 1;
- return;
- }
-
- do_reserved(p, wp, 2);
- *word = ++wp;
- return;
- case ('['):
- type = 0;
- break;
- default:
- do_reserved(p, wp, 1);
- *word = wp;
- return;
- }
-
- } else if ('s' == *wp) {
- /* This closely follows mandoc_special(). */
- if ('\0' == *(++wp)) {
- *word = wp;
- return;
- }
-
- t = 0;
- lim = 1;
-
- if (*wp == '\'') {
- lim = 0;
- t = 1;
- ++wp;
- } else if (*wp == '[') {
- lim = 0;
- t = 2;
- ++wp;
- } else if (*wp == '(') {
- lim = 2;
- t = 3;
- ++wp;
- }
-
- if (*wp == '+' || *wp == '-')
- ++wp;
-
- if (*wp == '\'') {
- if (t) {
- *word = wp;
- return;
- }
- lim = 0;
- t = 1;
- ++wp;
- } else if (*wp == '[') {
- if (t) {
- *word = wp;
- return;
- }
- lim = 0;
- t = 2;
- ++wp;
- } else if (*wp == '(') {
- if (t) {
- *word = wp;
- return;
- }
- lim = 2;
- t = 3;
- ++wp;
- }
-
- if ( ! isdigit((u_char)*wp)) {
- *word = --wp;
- return;
- }
-
- for (j = 0; isdigit((u_char)*wp); j++) {
- if (lim && j >= lim)
- break;
- ++wp;
- }
-
- if (t && t < 3) {
- if (1 == t && *wp != '\'') {
- *word = --wp;
- return;
- }
- if (2 == t && *wp != ']') {
- *word = --wp;
- return;
- }
- ++wp;
- }
- *word = --wp;
- return;
-
- } else if ('f' == *wp) {
- if ('\0' == *(++wp)) {
- *word = wp;
- return;
- }
-
- switch (*wp) {
- case ('3'):
- /* FALLTHROUGH */
- case ('B'):
- p->metamask = p->metafont;
- p->metafont |= METAF_BOLD;
- break;
- case ('2'):
- /* FALLTHROUGH */
- case ('I'):
- p->metamask = p->metafont;
- p->metafont |= METAF_UNDER;
- break;
- case ('P'):
- sv = p->metamask;
- p->metamask = p->metafont;
- p->metafont = sv;
- break;
- case ('1'):
- /* FALLTHROUGH */
- case ('R'):
- p->metamask = p->metafont;
- p->metafont &= ~METAF_UNDER;
- p->metafont &= ~METAF_BOLD;
- break;
- default:
- break;
- }
-
- *word = wp;
- return;
-
- } else if ('[' != *wp) {
- do_special(p, wp, 1);
- *word = wp;
- return;
- }
-
- wp++;
- for (j = 0; *wp && ']' != *wp; wp++, j++)
- /* Loop... */ ;
-
- if ('\0' == *wp) {
- *word = wp;
- return;
- }
-
- if (type)
- do_special(p, wp - j, (size_t)j);
- else
- do_reserved(p, wp - j, (size_t)j);
- *word = wp;
-}
-
-
-/*
* Handle pwords, partial words, which may be either a single word or a
* phrase that cannot be broken down (such as a literal string). This
* handles word styling.
@@ -569,7 +373,10 @@ do_escaped(struct termp *p, const char **word)
void
term_word(struct termp *p, const char *word)
{
- const char *sv;
+ const char *sv, *seq;
+ int sz, meta;
+ size_t ssz;
+ enum roffdeco deco;
sv = word;
@@ -605,11 +412,52 @@ term_word(struct termp *p, const char *word)
if ( ! (p->flags & TERMP_NONOSPACE))
p->flags &= ~TERMP_NOSPACE;
- for ( ; *word; word++)
- if ('\\' != *word)
+ /*
+ * FIXME: it's faster to put the metafont conditional here,
+ * because most of the time we're not a metafont and can use
+ * strcspn and fwrite.
+ */
+
+ while (*word) {
+ if ('\\' != *word) {
encode(p, *word);
- else
- do_escaped(p, &word);
+ word++;
+ continue;
+ }
+
+ seq = ++word;
+ sz = a2roffdeco(&deco, &seq, &ssz);
+
+ switch (deco) {
+ case (DECO_RESERVED):
+ do_reserved(p, seq, ssz);
+ break;
+ case (DECO_SPECIAL):
+ do_special(p, seq, ssz);
+ break;
+ case (DECO_BOLD):
+ p->metamask = p->metafont;
+ p->metafont |= METAF_BOLD;
+ break;
+ case (DECO_ITALIC):
+ p->metamask = p->metafont;
+ p->metafont |= METAF_UNDER;
+ break;
+ case (DECO_ROMAN):
+ p->metamask = p->metafont;
+ p->metafont &= ~METAF_UNDER;
+ p->metafont &= ~METAF_BOLD;
+ break;
+ case (DECO_PREVIOUS):
+ meta = p->metamask;
+ p->metamask = p->metafont;
+ p->metafont = meta;
+ break;
+ default:
+ break;
+ }
+ word += sz;
+ }
if (sv[0] && 0 == sv[1])
switch (sv[0]) {