aboutsummaryrefslogtreecommitdiffstats
path: root/symbol.c
diff options
context:
space:
mode:
authorTatsuya Kinoshita <tats@vega.ocn.ne.jp>2011-05-04 07:18:09 +0000
committerTatsuya Kinoshita <tats@vega.ocn.ne.jp>2011-05-04 07:18:09 +0000
commit5f8e0f8ef9a422691dd72e8a953a42a41478fcb4 (patch)
tree4b2df4796a534793648b3c4fc532fc36bd0cd525 /symbol.c
parentReleasing debian version 0.3-2.4 (diff)
downloadw3m-debian/0.5.1-1.tar.gz
w3m-debian/0.5.1-1.zip
Releasing debian version 0.5.1-1debian/0.5.1-1
Diffstat (limited to '')
-rw-r--r--symbol.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/symbol.c b/symbol.c
new file mode 100644
index 0000000..9a482b3
--- /dev/null
+++ b/symbol.c
@@ -0,0 +1,168 @@
+
+#include "fm.h"
+
+#include "Symbols/alt.sym"
+#include "Symbols/graph.sym"
+#ifdef USE_M17N
+#include "Symbols/eucjp.sym"
+#include "Symbols/euckr.sym"
+#include "Symbols/euccn.sym"
+#include "Symbols/euctw.sym"
+#include "Symbols/big5.sym"
+#ifdef USE_UNICODE
+#include "Symbols/utf8.sym"
+#endif
+#include "Symbols/cp850.sym"
+
+typedef struct {
+ wc_ces ces;
+ char width;
+ char **item;
+ char encode;
+} symbol_set;
+
+typedef struct {
+ wc_ces charset;
+ symbol_set *symbol;
+} charset_symbol_set;
+
+/* *INDENT-OFF* */
+static symbol_set alt_symbol_set = { WC_CES_US_ASCII, 1, alt_symbol, 1 };
+static symbol_set alt2_symbol_set = { WC_CES_US_ASCII, 2, alt2_symbol, 1 };
+static symbol_set eucjp_symbol_set = { WC_CES_EUC_JP, 2, eucjp_symbol, 0 };
+static symbol_set euckr_symbol_set = { WC_CES_EUC_KR, 2, euckr_symbol, 0 };
+static symbol_set euccn_symbol_set = { WC_CES_EUC_CN, 2, euccn_symbol, 0 };
+static symbol_set euctw_symbol_set = { WC_CES_EUC_TW, 2, euctw_symbol, 0 };
+static symbol_set big5_symbol_set = { WC_CES_BIG5, 2, big5_symbol, 0 };
+#ifdef USE_UNICODE
+static symbol_set utf8_symbol_set = { WC_CES_UTF_8, 1, utf8_symbol, 0 };
+#endif
+static symbol_set cp850_symbol_set = { WC_CES_CP850, 1, cp850_symbol, 0 };
+
+static charset_symbol_set charset_symbol_list[] = {
+ { WC_CES_EUC_JP, &eucjp_symbol_set },
+ { WC_CES_SHIFT_JIS, &eucjp_symbol_set },
+ { WC_CES_ISO_2022_JP, &eucjp_symbol_set },
+ { WC_CES_ISO_2022_JP_2, &eucjp_symbol_set },
+ { WC_CES_ISO_2022_JP_3, &eucjp_symbol_set },
+ { WC_CES_EUC_KR, &euckr_symbol_set },
+ { WC_CES_ISO_2022_KR, &euckr_symbol_set },
+ { WC_CES_JOHAB, &euckr_symbol_set },
+ { WC_CES_UHC, &euckr_symbol_set },
+ { WC_CES_EUC_CN, &euccn_symbol_set },
+ { WC_CES_GBK, &euccn_symbol_set },
+ { WC_CES_GB18030, &euccn_symbol_set },
+ { WC_CES_HZ_GB_2312, &euccn_symbol_set },
+ { WC_CES_ISO_2022_CN, &euccn_symbol_set },
+ { WC_CES_EUC_TW, &euctw_symbol_set },
+ { WC_CES_BIG5, &big5_symbol_set },
+ { WC_CES_HKSCS, &big5_symbol_set },
+#ifdef USE_UNICODE
+ { WC_CES_UTF_8, &utf8_symbol_set },
+#endif
+ { WC_CES_CP850, &cp850_symbol_set },
+ { 0, NULL },
+};
+/* *INDENT-ON* */
+
+static wc_ces save_charset = 0;
+static symbol_set *save_symbol = NULL;
+
+static void
+encode_symbol(symbol_set * s)
+{
+ int i;
+
+ for (i = 0; s->item[i]; i++) {
+ if (*(s->item[i]))
+ s->item[i] = wc_conv(s->item[i], s->ces, InnerCharset)->ptr;
+ }
+ s->encode = 1;
+}
+
+char **
+get_symbol(wc_ces charset, int *width)
+{
+ charset_symbol_set *p;
+ symbol_set *s = NULL;
+
+ if (charset == save_charset && save_symbol != NULL &&
+ *width == save_symbol->width) {
+ *width = save_symbol->width;
+ return save_symbol->item;
+ }
+ save_charset = charset;
+ for (p = charset_symbol_list; p->charset; p++) {
+ if (charset == p->charset &&
+ (*width == 0 || *width == p->symbol->width)) {
+ s = p->symbol;
+ break;
+ }
+ }
+ if (s == NULL)
+ s = (*width == 2) ? &alt2_symbol_set : &alt_symbol_set;
+ if (s != save_symbol) {
+ if (!s->encode)
+ encode_symbol(s);
+ save_symbol = s;
+ }
+ *width = s->width;
+ return s->item;
+}
+
+char **
+set_symbol(int width)
+{
+ static char **symbol_buf = NULL;
+ static int save_width = -1;
+ symbol_set *s = &alt_symbol_set;
+ int i;
+ Str tmp;
+
+ if (width == save_width)
+ return symbol_buf;
+ if (symbol_buf == NULL) {
+ for (i = 0; s->item[i]; i++) ;
+ symbol_buf = New_N(char *, i);
+ }
+ for (i = 0; s->item[i]; i++) {
+ tmp = Strnew_size(4);
+ if (width == 2)
+ wtf_push(tmp, WC_CCS_SPECIAL_W, (wc_uint32) (SYMBOL_BASE + i));
+ else
+ wtf_push(tmp, WC_CCS_SPECIAL, (wc_uint32) (SYMBOL_BASE + i));
+ symbol_buf[i] = tmp->ptr;
+ }
+ save_width = width;
+ return symbol_buf;
+}
+
+#else
+
+char **
+get_symbol(void)
+{
+ return alt_symbol;
+}
+#endif
+
+void
+push_symbol(Str str, char symbol, int width, int n)
+{
+ char buf[2], *p;
+ int i;
+
+#ifdef USE_M17N
+ if (width == 2)
+ p = alt2_symbol[(int)symbol];
+ else
+#endif
+ p = alt_symbol[(int)symbol];
+ for (i = 0; i < 2 && *p; i++, p++)
+ buf[i] = (*p == ' ') ? NBSP_CODE : *p;
+
+ Strcat(str, Sprintf("<_SYMBOL TYPE=%d>", symbol));
+ for (; n > 0; n--)
+ Strcat_charp_n(str, buf, i);
+ Strcat_charp(str, "</_SYMBOL>");
+}