summaryrefslogtreecommitdiffstats
path: root/mdocterm.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdocterm.c')
-rw-r--r--mdocterm.c198
1 files changed, 92 insertions, 106 deletions
diff --git a/mdocterm.c b/mdocterm.c
index f9c89230..e34ab4f2 100644
--- a/mdocterm.c
+++ b/mdocterm.c
@@ -32,6 +32,11 @@
#include "mmain.h"
#include "term.h"
+struct termenc {
+ const char *enc;
+ int sym;
+};
+
static void body(struct termp *,
struct termpair *,
const struct mdoc_meta *,
@@ -57,6 +62,67 @@ extern size_t strlcat(char *, const char *, size_t);
extern size_t strlcpy(char *, const char *, size_t);
#endif
+static struct termenc termenc1[] = {
+ { "\\", TERMSYM_SLASH },
+ { "\'", TERMSYM_RSQUOTE },
+ { "`", TERMSYM_LSQUOTE },
+ { "-", TERMSYM_HYPHEN },
+ { " ", TERMSYM_SPACE },
+ { ".", TERMSYM_PERIOD },
+ { "&", TERMSYM_BREAK },
+ { "e", TERMSYM_SLASH },
+ { "q", TERMSYM_DQUOTE },
+ { NULL, 0 }
+};
+
+static struct termenc termenc2[] = {
+ { "rB", TERMSYM_RBRACK },
+ { "lB", TERMSYM_LBRACK },
+ { "Lq", TERMSYM_LDQUOTE },
+ { "lq", TERMSYM_LDQUOTE },
+ { "Rq", TERMSYM_RDQUOTE },
+ { "rq", TERMSYM_RDQUOTE },
+ { "oq", TERMSYM_LSQUOTE },
+ { "aq", TERMSYM_RSQUOTE },
+
+ { "<-", TERMSYM_LARROW },
+ { "->", TERMSYM_RARROW },
+ { "ua", TERMSYM_UARROW },
+ { "da", TERMSYM_DARROW },
+
+ { "bu", TERMSYM_BULLET },
+ { "Ba", TERMSYM_BAR },
+ { "ba", TERMSYM_BAR },
+ { "co", TERMSYM_COPY },
+ { "Am", TERMSYM_AMP },
+
+ { "Le", TERMSYM_LE },
+ { "<=", TERMSYM_LE },
+ { "Ge", TERMSYM_GE },
+ { "=>", TERMSYM_GE },
+ { "==", TERMSYM_EQ },
+ { "Ne", TERMSYM_NEQ },
+ { "!=", TERMSYM_NEQ },
+ { "Pm", TERMSYM_PLUSMINUS },
+ { "+-", TERMSYM_PLUSMINUS },
+ { "If", TERMSYM_INF2 },
+ { "if", TERMSYM_INF },
+ { "Na", TERMSYM_NAN },
+ { "na", TERMSYM_NAN },
+ { "**", TERMSYM_ASTERISK },
+ { "Gt", TERMSYM_GT },
+ { "Lt", TERMSYM_LT },
+
+ { "aa", TERMSYM_ACUTE },
+ { "ga", TERMSYM_GRAVE },
+
+ { "en", TERMSYM_EN },
+ { "em", TERMSYM_EM },
+
+ { "Pi", TERMSYM_PI },
+ { NULL, 0 }
+};
+
static struct termsym termsym_ansi[] = {
{ "]", 1 }, /* TERMSYM_RBRACK */
{ "[", 1 }, /* TERMSYM_LBRACK */
@@ -85,8 +151,16 @@ static struct termsym termsym_ansi[] = {
{ "NaN", 3 }, /* TERMSYM_NAN */
{ "|", 1 }, /* TERMSYM_BAR */
{ "o", 1 }, /* TERMSYM_BULLET */
- { "&", 1 }, /* TERMSYM_AND */
- { "|", 1 }, /* TERMSYM_OR */
+ { "&", 1 }, /* TERMSYM_AMP */
+ { "--", 2 }, /* TERMSYM_EM */
+ { "-", 1 }, /* TERMSYM_EN */
+ { "(C)", 3 }, /* TERMSYM_COPY */
+ { "*", 1 }, /* TERMSYM_ASTERISK */
+ { "\\", 1 }, /* TERMSYM_SLASH */
+ { "-", 1 }, /* TERMSYM_HYPHEN */
+ { " ", 1 }, /* TERMSYM_SPACE */
+ { ".", 1 }, /* TERMSYM_PERIOD */
+ { "", 0 }, /* TERMSYM_BREAK */
};
static const char ansi_clear[] = { 27, '[', '0', 'm' };
@@ -614,118 +688,27 @@ header(struct termp *p, const struct mdoc_meta *meta)
static void
nescape(struct termp *p, const char *word, size_t len)
{
+ struct termenc *enc;
switch (len) {
case (1):
- switch (word[0]) {
- case ('\\'):
- /* FALLTHROUGH */
- case ('\''):
- /* FALLTHROUGH */
- case ('`'):
- /* FALLTHROUGH */
- case ('-'):
- /* FALLTHROUGH */
- case (' '):
- /* FALLTHROUGH */
- case ('.'):
- chara(p, word[0]); /* FIXME */
- break;
- case ('&'):
- break;
- case ('e'):
- chara(p, '\\'); /* FIXME */
- break;
- case ('q'):
- symbola(p, TERMSYM_DQUOTE);
- break;
- default:
- warnx("escape sequence not supported: %c",
- word[0]);
- break;
- }
+ enc = termenc1;
break;
-
case (2):
- if ('r' == word[0] && 'B' == word[1])
- symbola(p, TERMSYM_RBRACK);
- else if ('l' == word[0] && 'B' == word[1])
- symbola(p, TERMSYM_LBRACK);
- else if ('l' == word[0] && 'q' == word[1])
- symbola(p, TERMSYM_LDQUOTE);
- else if ('r' == word[0] && 'q' == word[1])
- symbola(p, TERMSYM_RDQUOTE);
- else if ('o' == word[0] && 'q' == word[1])
- symbola(p, TERMSYM_LSQUOTE);
- else if ('a' == word[0] && 'q' == word[1])
- symbola(p, TERMSYM_RSQUOTE);
- else if ('<' == word[0] && '-' == word[1])
- symbola(p, TERMSYM_LARROW);
- else if ('-' == word[0] && '>' == word[1])
- symbola(p, TERMSYM_RARROW);
- else if ('b' == word[0] && 'u' == word[1])
- symbola(p, TERMSYM_BULLET);
- else if ('<' == word[0] && '=' == word[1])
- symbola(p, TERMSYM_LE);
- else if ('>' == word[0] && '=' == word[1])
- symbola(p, TERMSYM_GE);
- else if ('=' == word[0] && '=' == word[1])
- symbola(p, TERMSYM_EQ);
- else if ('+' == word[0] && '-' == word[1])
- symbola(p, TERMSYM_PLUSMINUS);
- else if ('u' == word[0] && 'a' == word[1])
- symbola(p, TERMSYM_UARROW);
- else if ('d' == word[0] && 'a' == word[1])
- symbola(p, TERMSYM_DARROW);
- else if ('a' == word[0] && 'a' == word[1])
- symbola(p, TERMSYM_ACUTE);
- else if ('g' == word[0] && 'a' == word[1])
- symbola(p, TERMSYM_GRAVE);
- else if ('!' == word[0] && '=' == word[1])
- symbola(p, TERMSYM_NEQ);
- else if ('i' == word[0] && 'f' == word[1])
- symbola(p, TERMSYM_INF);
- else if ('n' == word[0] && 'a' == word[1])
- symbola(p, TERMSYM_NAN);
- else if ('b' == word[0] && 'a' == word[1])
- symbola(p, TERMSYM_BAR);
-
- /* Deprecated forms. */
- else if ('A' == word[0] && 'm' == word[1])
- symbola(p, TERMSYM_AMP);
- else if ('B' == word[0] && 'a' == word[1])
- symbola(p, TERMSYM_BAR);
- else if ('I' == word[0] && 'f' == word[1])
- symbola(p, TERMSYM_INF2);
- else if ('G' == word[0] && 'e' == word[1])
- symbola(p, TERMSYM_GE);
- else if ('G' == word[0] && 't' == word[1])
- symbola(p, TERMSYM_GT);
- else if ('L' == word[0] && 'e' == word[1])
- symbola(p, TERMSYM_LE);
- else if ('L' == word[0] && 'q' == word[1])
- symbola(p, TERMSYM_LDQUOTE);
- else if ('L' == word[0] && 't' == word[1])
- symbola(p, TERMSYM_LT);
- else if ('N' == word[0] && 'a' == word[1])
- symbola(p, TERMSYM_NAN);
- else if ('N' == word[0] && 'e' == word[1])
- symbola(p, TERMSYM_NEQ);
- else if ('P' == word[0] && 'i' == word[1])
- symbola(p, TERMSYM_PI);
- else if ('P' == word[0] && 'm' == word[1])
- symbola(p, TERMSYM_PLUSMINUS);
- else if ('R' == word[0] && 'q' == word[1])
- symbola(p, TERMSYM_RDQUOTE);
- else
- warnx("escape sequence not supported: %c%c",
- word[0], word[1]);
+ enc = termenc2;
break;
-
default:
- warnx("escape sequence not supported");
- break;
+ warnx("unsupported %zu-byte escape sequence", len);
+ return;
}
+
+ for ( ; enc->enc; enc++)
+ if (0 == memcmp(enc->enc, word, len)) {
+ symbola(p, enc->sym);
+ return;
+ }
+
+ warnx("unsupported %zu-byte escape sequence", len);
}
@@ -856,6 +839,9 @@ stringa(struct termp *p, const char *c, size_t sz)
{
size_t s;
+ if (0 == sz)
+ return;
+
s = sz > p->maxcols * 2 ? sz : p->maxcols * 2;
assert(c);