Return to koi8.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / mbstring / oniguruma / enc |
1.1 misho 1: /********************************************************************** 2: koi8.c - Oniguruma (regular expression library) 3: **********************************************************************/ 4: /*- 5: * Copyright (c) 2002-2004 K.Kosako <sndgk393 AT ybb DOT ne DOT jp> 6: * All rights reserved. 7: * 8: * Redistribution and use in source and binary forms, with or without 9: * modification, are permitted provided that the following conditions 10: * are met: 11: * 1. Redistributions of source code must retain the above copyright 12: * notice, this list of conditions and the following disclaimer. 13: * 2. Redistributions in binary form must reproduce the above copyright 14: * notice, this list of conditions and the following disclaimer in the 15: * documentation and/or other materials provided with the distribution. 16: * 17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27: * SUCH DAMAGE. 28: */ 29: 30: #include "regenc.h" 31: 32: #define ENC_KOI8_TO_LOWER_CASE(c) EncKOI8_ToLowerCaseTable[c] 33: #define ENC_IS_KOI8_CTYPE(code,ctype) \ 34: ((EncKOI8_CtypeTable[code] & ctype) != 0) 35: 36: static const UChar EncKOI8_ToLowerCaseTable[256] = { 37: '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', 38: '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', 39: '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', 40: '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', 41: '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', 42: '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', 43: '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', 44: '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', 45: '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', 46: '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', 47: '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', 48: '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', 49: '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', 50: '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', 51: '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', 52: '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', 53: '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', 54: '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', 55: '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', 56: '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', 57: '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', 58: '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', 59: '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', 60: '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', 61: '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307', 62: '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317', 63: '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327', 64: '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337', 65: '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307', 66: '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317', 67: '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327', 68: '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337' 69: }; 70: 71: static const unsigned short EncKOI8_CtypeTable[256] = { 72: 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 73: 0x2008, 0x220c, 0x2209, 0x2208, 0x2208, 0x2208, 0x2008, 0x2008, 74: 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 75: 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 76: 0x2284, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 77: 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 78: 0x38b0, 0x38b0, 0x38b0, 0x38b0, 0x38b0, 0x38b0, 0x38b0, 0x38b0, 79: 0x38b0, 0x38b0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 80: 0x21a0, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x34a2, 81: 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 82: 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 83: 0x34a2, 0x34a2, 0x34a2, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x31a0, 84: 0x21a0, 0x38e2, 0x38e2, 0x38e2, 0x38e2, 0x38e2, 0x38e2, 0x30e2, 85: 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 86: 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 87: 0x30e2, 0x30e2, 0x30e2, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x2008, 88: 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 89: 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 90: 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 91: 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 92: 0x0284, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 93: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 94: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 95: 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 96: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 97: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 98: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 99: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 100: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 101: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 102: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 103: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2 104: }; 105: 106: static int 107: koi8_mbc_to_normalize(OnigAmbigType flag, 108: const OnigUChar** pp, const OnigUChar* end, OnigUChar* lower) 109: { 110: const OnigUChar* p = *pp; 111: 112: if (((flag & ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) != 0 && 113: ONIGENC_IS_MBC_ASCII(p)) || 114: ((flag & ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) != 0 && 115: !ONIGENC_IS_MBC_ASCII(p))) { 116: *lower = ENC_KOI8_TO_LOWER_CASE(*p); 117: } 118: else { 119: *lower = *p; 120: } 121: (*pp)++; 122: return 1; /* return byte length of converted char to lower */ 123: } 124: 125: static int 126: koi8_is_mbc_ambiguous(OnigAmbigType flag, const OnigUChar** pp, const OnigUChar* end) 127: { 128: const OnigUChar* p = *pp; 129: 130: (*pp)++; 131: if (((flag & ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) != 0 && 132: ONIGENC_IS_MBC_ASCII(p)) || 133: ((flag & ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) != 0 && 134: !ONIGENC_IS_MBC_ASCII(p))) { 135: int v = (EncKOI8_CtypeTable[*p] & 136: (ONIGENC_CTYPE_UPPER | ONIGENC_CTYPE_LOWER)); 137: return (v != 0 ? TRUE : FALSE); 138: } 139: return FALSE; 140: } 141: 142: 143: static int 144: koi8_is_code_ctype(OnigCodePoint code, unsigned int ctype) 145: { 146: if (code < 256) 147: return ENC_IS_KOI8_CTYPE(code, ctype); 148: else 149: return FALSE; 150: } 151: 152: static int 153: koi8_get_all_pair_ambig_codes(OnigAmbigType flag, 154: const OnigPairAmbigCodes** ccs) 155: { 156: static const OnigPairAmbigCodes cc[] = { 157: { 0xc0, 0xe0 }, 158: { 0xc1, 0xe1 }, 159: { 0xc2, 0xe2 }, 160: { 0xc3, 0xe3 }, 161: { 0xc4, 0xe4 }, 162: { 0xc5, 0xe5 }, 163: { 0xc6, 0xe6 }, 164: { 0xc7, 0xe7 }, 165: { 0xc8, 0xe8 }, 166: { 0xc9, 0xe9 }, 167: { 0xca, 0xea }, 168: { 0xcb, 0xeb }, 169: { 0xcc, 0xec }, 170: { 0xcd, 0xed }, 171: { 0xce, 0xee }, 172: { 0xcf, 0xef }, 173: 174: { 0xd0, 0xf0 }, 175: { 0xd1, 0xf1 }, 176: { 0xd2, 0xf2 }, 177: { 0xd3, 0xf3 }, 178: { 0xd4, 0xf4 }, 179: { 0xd5, 0xf5 }, 180: { 0xd6, 0xf6 }, 181: { 0xd7, 0xf7 }, 182: { 0xd8, 0xf8 }, 183: { 0xd9, 0xf9 }, 184: { 0xda, 0xfa }, 185: { 0xdb, 0xfb }, 186: { 0xdc, 0xfc }, 187: { 0xdd, 0xfd }, 188: { 0xde, 0xfe }, 189: { 0xdf, 0xff }, 190: 191: { 0xe0, 0xc0 }, 192: { 0xe1, 0xc1 }, 193: { 0xe2, 0xc2 }, 194: { 0xe3, 0xc3 }, 195: { 0xe4, 0xc4 }, 196: { 0xe5, 0xc5 }, 197: { 0xe6, 0xc6 }, 198: { 0xe7, 0xc7 }, 199: { 0xe8, 0xc8 }, 200: { 0xe9, 0xc9 }, 201: { 0xea, 0xca }, 202: { 0xeb, 0xcb }, 203: { 0xec, 0xcc }, 204: { 0xed, 0xcd }, 205: { 0xee, 0xce }, 206: { 0xef, 0xcf }, 207: 208: { 0xf0, 0xd0 }, 209: { 0xf1, 0xd1 }, 210: { 0xf2, 0xd2 }, 211: { 0xf3, 0xd3 }, 212: { 0xf4, 0xd4 }, 213: { 0xf5, 0xd5 }, 214: { 0xf6, 0xd6 }, 215: { 0xf7, 0xd7 }, 216: { 0xf8, 0xd8 }, 217: { 0xf9, 0xd9 }, 218: { 0xfa, 0xda }, 219: { 0xfb, 0xdb }, 220: { 0xfc, 0xdc }, 221: { 0xfe, 0xde }, 222: { 0xff, 0xdf } 223: }; 224: 225: if (flag == ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) { 226: *ccs = OnigAsciiPairAmbigCodes; 227: return 52; 228: } 229: if (flag == ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) { 230: *ccs = cc; 231: return sizeof(cc) / sizeof(OnigPairAmbigCodes); 232: } 233: else 234: return 0; 235: } 236: 237: OnigEncodingType OnigEncodingKOI8 = { 238: onigenc_single_byte_mbc_enc_len, 239: "KOI8", /* name */ 240: 1, /* max enc length */ 241: 1, /* min enc length */ 242: (ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE | 243: ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE ), 244: { 245: (OnigCodePoint )'\\' /* esc */ 246: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */ 247: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */ 248: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */ 249: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */ 250: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */ 251: }, 252: onigenc_is_mbc_newline_0x0a, 253: onigenc_single_byte_mbc_to_code, 254: onigenc_single_byte_code_to_mbclen, 255: onigenc_single_byte_code_to_mbc, 256: koi8_mbc_to_normalize, 257: koi8_is_mbc_ambiguous, 258: koi8_get_all_pair_ambig_codes, 259: onigenc_nothing_get_all_comp_ambig_codes, 260: koi8_is_code_ctype, 261: onigenc_not_support_get_ctype_code_range, 262: onigenc_single_byte_left_adjust_char_head, 263: onigenc_always_true_is_allowed_reverse_match 264: };