summaryrefslogtreecommitdiff
path: root/enc/windows_1253.c
diff options
context:
space:
mode:
authorduerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-26 06:54:18 +0000
committerduerst <duerst@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-26 06:54:18 +0000
commitaec1ac6e5127c19d8db89f464e42cca439333974 (patch)
treeb32d1e64465761fe625d7dc297b3013898493b45 /enc/windows_1253.c
parentc8a1d8b33bc612e6c58e3fbeb3226375bc4f4184 (diff)
* enc/windows_1251.c, test/ruby/enc/test_case_comprehensive.rb:
Implement non-ASCII case conversion for Windows-1251, by Shunsuke Sato. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55750 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'enc/windows_1253.c')
-rw-r--r--enc/windows_1253.c74
1 files changed, 67 insertions, 7 deletions
diff --git a/enc/windows_1253.c b/enc/windows_1253.c
index cd2987f588..9be59430b4 100644
--- a/enc/windows_1253.c
+++ b/enc/windows_1253.c
@@ -62,9 +62,9 @@ static const UChar EncCP1253_ToLowerCaseTable[256] = {
'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
- '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+ '\240', '\241', '\334', '\243', '\244', '\245', '\246', '\247',
'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
- '\260', '\261', '\262', '\263', '\264', '\265', '\334', '\267',
+ '\260', '\261', '\262', '\263', '\264', '\354', '\334', '\267',
'\335', '\336', '\337', '\273', '\374', '\275', '\375', '\376',
'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
@@ -97,9 +97,9 @@ static const unsigned short EncCP1253_CtypeTable[256] = {
0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,
- 0x0284, 0x01a0, 0x01a0, 0x00a0, 0x0000, 0x0000, 0x00a0, 0x00a0,
+ 0x0284, 0x01a0, 0x34a2, 0x00a0, 0x0000, 0x0000, 0x00a0, 0x00a0,
0x00a0, 0x00a0, 0x0000, 0x01a0, 0x00a0, 0x01a0, 0x0000, 0x01a0,
- 0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x00a0, 0x00a0, 0x34a2, 0x01a0,
+ 0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x00a0, 0x30e2, 0x34a2, 0x01a0,
0x34a2, 0x34a2, 0x34a2, 0x01a0, 0x34a2, 0x10a0, 0x34a2, 0x34a2,
0x30e2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,
0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,
@@ -198,8 +198,8 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- numberof(CaseFoldMap), CaseFoldMap, 0,
- flag, f, arg);
+ numberof(CaseFoldMap), CaseFoldMap, 0,
+ flag, f, arg);
}
static int
@@ -213,6 +213,66 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
flag, p, end, items);
}
+static int
+case_map (OnigCaseFoldType* flagP, const OnigUChar** pp,
+ const OnigUChar* end, OnigUChar* to, OnigUChar* to_end,
+ const struct OnigEncodingTypeST* enc)
+{
+ OnigCodePoint code;
+ OnigUChar *to_start = to;
+ OnigCaseFoldType flags = *flagP;
+
+ while (*pp<end && to<to_end) {
+ code = *(*pp)++;
+ if (code==0xF2) {
+ if (flags&ONIGENC_CASE_UPCASE) {
+ flags |= ONIGENC_CASE_MODIFIED;
+ code = 0xD3;
+ }
+ else if (flags&ONIGENC_CASE_FOLD) {
+ flags |= ONIGENC_CASE_MODIFIED;
+ code = 0xF3;
+ }
+ }
+ else if (code==0xB5) {
+ if (flags&ONIGENC_CASE_UPCASE) {
+ flags |= ONIGENC_CASE_MODIFIED;
+ code = 0xCC;
+ }
+ else if (flags&ONIGENC_CASE_FOLD) {
+ flags |= ONIGENC_CASE_MODIFIED;
+ code = 0xEC;
+ }
+ }
+ else if (code==0xC0 || code==0xE0 || code==0xB6) ;
+ else if ((EncCP1253_CtypeTable[code] & BIT_CTYPE_UPPER)
+ && (flags & (ONIGENC_CASE_DOWNCASE|ONIGENC_CASE_FOLD))) {
+ flags |= ONIGENC_CASE_MODIFIED;
+ code = ENC_CP1253_TO_LOWER_CASE(code);
+ }
+ else if ((EncCP1253_CtypeTable[code] & BIT_CTYPE_LOWER)
+ && (flags&ONIGENC_CASE_UPCASE)) {
+ flags |= ONIGENC_CASE_MODIFIED;
+ if (code==0xB5)
+ code = 0xCC;
+ else if (code==0xDC)
+ code = 0xA2;
+ else if (code>=0xDD && code<=0xDF)
+ code -= 0x25;
+ else if (code==0xFC)
+ code = 0xBC;
+ else if (code==0xFD || code==0xFE)
+ code -= 0x3F;
+ else
+ code -= 0x20;
+ }
+ *to++ = code;
+ if (flags&ONIGENC_CASE_TITLECASE) /* switch from titlecase to lowercase for capitalize */
+ flags ^= (ONIGENC_CASE_UPCASE|ONIGENC_CASE_DOWNCASE|ONIGENC_CASE_TITLECASE);
+ }
+ *flagP = flags;
+ return (int)(to-to_start);
+}
OnigEncodingDefine(windows_1253, Windows_1253) = {
onigenc_single_byte_mbc_enc_len,
@@ -233,6 +293,6 @@ OnigEncodingDefine(windows_1253, Windows_1253) = {
onigenc_always_true_is_allowed_reverse_match,
0,
ONIGENC_FLAG_NONE,
- onigenc_single_byte_ascii_only_case_map,
+ case_map,
};
ENC_ALIAS("CP1253", "Windows-1253")