1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
--- mbyte.c.orig 2016-10-09 03:35:50.000000000 +0800
+++ mbyte.c 2016-12-02 11:18:42.600658000 +0800
@@ -24,6 +24,9 @@
# include "config.h"
#endif
+/*
+ * Trad. Chinese (Big5) support by yjchou@linux.cis.nctu.edu.tw
+ */
#include "mutt.h"
#include "mbyte.h"
#include "charset.h"
@@ -39,6 +42,7 @@
int Charset_is_utf8 = 0;
#ifndef HAVE_WC_FUNCS
static int charset_is_ja = 0;
+static int charset_is_big5 = 0;
static iconv_t charset_to_utf8 = (iconv_t)(-1);
static iconv_t charset_from_utf8 = (iconv_t)(-1);
#endif
@@ -52,6 +56,7 @@ void mutt_set_charset (char *charset)
Charset_is_utf8 = 0;
#ifndef HAVE_WC_FUNCS
charset_is_ja = 0;
+ charset_is_big5 = 0;
if (charset_to_utf8 != (iconv_t)(-1))
{
iconv_close (charset_to_utf8);
@@ -82,6 +87,14 @@ void mutt_set_charset (char *charset)
charset_from_utf8 = mutt_iconv_open (charset, "utf-8", 0);
}
#endif
+#ifndef HAVE_WC_FUNCS
+ else if (!strcmp(buffer, "big5"))
+ {
+ charset_is_big5 = 1;
+ charset_to_utf8 = iconv_open ("UTF-8", charset);
+ charset_from_utf8 = iconv_open (charset, "UTF-8");
+ }
+#endif
#if defined(HAVE_BIND_TEXTDOMAIN_CODESET) && defined(ENABLE_NLS)
bind_textdomain_codeset(PACKAGE, buffer);
@@ -256,7 +269,7 @@ size_t mbrtowc (wchar_t *pwc, const char
int iswprint (wint_t wc)
{
- if (Charset_is_utf8 || charset_is_ja)
+ if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
return ((0x20 <= wc && wc < 0x7f) || 0xa0 <= wc);
else
return (0 <= wc && wc < 256) ? IsPrint (wc) : 0;
@@ -264,7 +277,7 @@ int iswprint (wint_t wc)
int iswspace (wint_t wc)
{
- if (Charset_is_utf8 || charset_is_ja)
+ if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
return (9 <= wc && wc <= 13) || wc == 32;
else
return (0 <= wc && wc < 256) ? isspace (wc) : 0;
@@ -347,7 +360,7 @@ static int iswalpha_ucs (wint_t wc)
wint_t towupper (wint_t wc)
{
- if (Charset_is_utf8 || charset_is_ja)
+ if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
return towupper_ucs (wc);
else
return (0 <= wc && wc < 256) ? toupper (wc) : wc;
@@ -355,7 +368,7 @@ wint_t towupper (wint_t wc)
wint_t towlower (wint_t wc)
{
- if (Charset_is_utf8 || charset_is_ja)
+ if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
return towlower_ucs (wc);
else
return (0 <= wc && wc < 256) ? tolower (wc) : wc;
@@ -363,7 +376,7 @@ wint_t towlower (wint_t wc)
int iswalnum (wint_t wc)
{
- if (Charset_is_utf8 || charset_is_ja)
+ if (Charset_is_utf8 || charset_is_ja || charset_is_big5)
return iswalnum_ucs (wc);
else
return (0 <= wc && wc < 256) ? isalnum (wc) : 0;
@@ -404,13 +417,31 @@ int wcwidth_ja (wchar_t ucs)
return -1;
}
+int wcwidth_big5(wchar_t ucs)
+{
+ return wcwidth_ja (ucs);
+}
+
int wcwidth_ucs(wchar_t ucs);
int wcwidth (wchar_t wc)
{
if (!Charset_is_utf8)
{
- if (!charset_is_ja)
+ if (charset_is_ja)
+ {
+ /* Japanese */
+ int k = wcwidth_ja (wc);
+ if (k != -1)
+ return k;
+ }
+ else if (charset_is_big5)
+ {
+ int k = wcwidth_big5 (wc);
+ if (k != -1)
+ return k;
+ }
+ else
{
/* 8-bit case */
if (!wc)
@@ -420,13 +451,6 @@ int wcwidth (wchar_t wc)
else
return -1;
}
- else
- {
- /* Japanese */
- int k = wcwidth_ja (wc);
- if (k != -1)
- return k;
- }
}
return wcwidth_ucs (wc);
}
|