diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2008-12-04 19:31:57 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2008-12-04 19:31:57 +0000 |
commit | 72085fe330b4fb696a4b9f1e6cc4e63af6d3690b (patch) | |
tree | 32d519be8d329befba0e823db56c1c3562ccbb34 /ml.c | |
parent | a705f91ffa6329b5fc3e6c09ce337b0972c19e2e (diff) | |
download | mandoc-72085fe330b4fb696a4b9f1e6cc4e63af6d3690b.tar.gz mandoc-72085fe330b4fb696a4b9f1e6cc4e63af6d3690b.tar.zst mandoc-72085fe330b4fb696a4b9f1e6cc4e63af6d3690b.zip |
Moved charset recognition into the filter.
Diffstat (limited to 'ml.c')
-rw-r--r-- | ml.c | 141 |
1 files changed, 138 insertions, 3 deletions
@@ -1,4 +1,4 @@ -/* $Id: ml.c,v 1.4 2008/12/04 16:19:52 kristaps Exp $ */ +/* $Id: ml.c,v 1.5 2008/12/04 19:31:57 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se> * @@ -16,6 +16,7 @@ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ +#include <assert.h> #include <stdlib.h> #include <string.h> @@ -33,13 +34,147 @@ int ml_nputstring(struct md_mbuf *p, const char *buf, size_t sz, size_t *pos) { - int i; + int i, v; const char *seq; size_t ssz; for (i = 0; i < (int)sz; i++) { switch (buf[i]) { + /* Escaped value. */ + case ('\\'): + if (-1 == (v = rofftok_scan(buf, &i))) { + /* TODO: error. */ + return(0); + } + + switch (v) { + case (ROFFTok_Sp_A): + seq = "\\a"; + ssz = 2; + break; + case (ROFFTok_Sp_B): + seq = "\\b"; + ssz = 2; + break; + case (ROFFTok_Sp_F): + seq = "\\f"; + ssz = 2; + break; + case (ROFFTok_Sp_N): + seq = "\\n"; + ssz = 2; + break; + case (ROFFTok_Sp_R): + seq = "\\r"; + ssz = 2; + break; + case (ROFFTok_Sp_T): + seq = "\\t"; + ssz = 2; + break; + case (ROFFTok_Sp_V): + seq = "\\v"; + ssz = 2; + break; + case (ROFFTok_Sp_0): + seq = "\\0"; + ssz = 2; + break; + case (ROFFTok_Space): + seq = " "; + ssz = 6; + break; + case (ROFFTok_Hyphen): + seq = "‐"; + ssz = 7; + break; + case (ROFFTok_Em): + seq = "—"; + ssz = 7; + break; + case (ROFFTok_En): + seq = "–"; + ssz = 7; + break; + case (ROFFTok_Ge): + seq = "≥"; + ssz = 7; + break; + case (ROFFTok_Le): + seq = "≤"; + ssz = 7; + break; + case (ROFFTok_Rquote): + seq = "”"; + ssz = 7; + break; + case (ROFFTok_Lquote): + seq = "“"; + ssz = 7; + break; + case (ROFFTok_Uparrow): + seq = "↑"; + ssz = 7; + break; + case (ROFFTok_Acute): + seq = "´"; + ssz = 6; + break; + case (ROFFTok_Grave): + seq = "`"; + ssz = 5; + break; + case (ROFFTok_Pi): + seq = "π"; + ssz = 6; + break; + case (ROFFTok_Ne): + seq = "≠"; + ssz = 7; + break; + case (ROFFTok_Lt): + seq = "<"; + ssz = 4; + break; + case (ROFFTok_Gt): + seq = ">"; + ssz = 4; + break; + case (ROFFTok_Plusmin): + seq = "±"; + ssz = 6; + break; + case (ROFFTok_Infty): + seq = "∞"; + ssz = 7; + break; + case (ROFFTok_Bar): + seq = "|"; + ssz = 6; + break; + case (ROFFTok_Nan): + seq = "Nan"; + ssz = 3; + break; + case (ROFFTok_Quote): + seq = """; + ssz = 6; + break; + case (ROFFTok_Slash): + seq = "\\"; + ssz = 1; + break; + case (ROFFTok_Null): + seq = ""; + ssz = 0; + break; + default: + /* TODO: print error. */ + return(-1); + } + break; + /* Ampersand ml-escape. */ case ('&'): seq = "&"; @@ -70,7 +205,7 @@ ml_nputstring(struct md_mbuf *p, break; } - if ( ! ml_nputs(p, seq, ssz, pos)) + if (ssz > 0 && ! ml_nputs(p, seq, ssz, pos)) return(-1); } return(1); |