Return to iso8859_2.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / mbstring / oniguruma / enc |
1.1 misho 1: /********************************************************************** 2: iso8859_2.c - Oniguruma (regular expression library) 3: **********************************************************************/ 4: /*- 5: * Copyright (c) 2002-2006 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_ISO_8859_2_TO_LOWER_CASE(c) EncISO_8859_2_ToLowerCaseTable[c] 33: #define ENC_IS_ISO_8859_2_CTYPE(code,ctype) \ 34: ((EncISO_8859_2_CtypeTable[code] & ctype) != 0) 35: 36: static const UChar EncISO_8859_2_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', '\261', '\242', '\263', '\244', '\265', '\266', '\247', 58: '\250', '\271', '\272', '\273', '\274', '\255', '\276', '\277', 59: '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', 60: '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', 61: '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', 62: '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', 63: '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\327', 64: '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\337', 65: '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', 66: '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', 67: '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', 68: '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377' 69: }; 70: 71: static const unsigned short EncISO_8859_2_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, 0x14a2, 0x00a0, 0x14a2, 0x00a0, 0x14a2, 0x14a2, 0x00a0, 93: 0x00a0, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x01a0, 0x14a2, 0x14a2, 94: 0x00a0, 0x10e2, 0x00a0, 0x10e2, 0x00a0, 0x10e2, 0x10e2, 0x00a0, 95: 0x00a0, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x00a0, 0x10e2, 0x10e2, 96: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 97: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 98: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x00a0, 99: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x10e2, 100: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 101: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 102: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x00a0, 103: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x00a0 104: }; 105: 106: static int 107: iso_8859_2_mbc_to_normalize(OnigAmbigType flag, 108: const UChar** pp, const UChar* end, UChar* lower) 109: { 110: const UChar* 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_ISO_8859_2_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: iso_8859_2_is_mbc_ambiguous(OnigAmbigType flag, 127: const UChar** pp, const UChar* end) 128: { 129: const UChar* p = *pp; 130: 131: (*pp)++; 132: if (((flag & ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) != 0 && 133: ONIGENC_IS_MBC_ASCII(p)) || 134: ((flag & ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) != 0 && 135: !ONIGENC_IS_MBC_ASCII(p))) { 136: int v = (EncISO_8859_2_CtypeTable[*p] & 137: (ONIGENC_CTYPE_UPPER | ONIGENC_CTYPE_LOWER)); 138: 139: if ((v | ONIGENC_CTYPE_LOWER) != 0) { 140: /* 0xdf is lower case letter, but can't convert. */ 141: if (*p == 0xdf) 142: return FALSE; 143: else 144: return TRUE; 145: } 146: 147: return (v != 0 ? TRUE : FALSE); 148: } 149: return FALSE; 150: } 151: 152: static int 153: iso_8859_2_get_all_pair_ambig_codes(OnigAmbigType flag, 154: const OnigPairAmbigCodes** ccs) 155: { 156: static const OnigPairAmbigCodes cc[] = { 157: { 0xa1, 0xb1 }, 158: { 0xa3, 0xb3 }, 159: { 0xa5, 0xb5 }, 160: { 0xa6, 0xb6 }, 161: { 0xa9, 0xb9 }, 162: { 0xaa, 0xba }, 163: { 0xab, 0xbb }, 164: { 0xac, 0xbc }, 165: { 0xae, 0xbe }, 166: { 0xaf, 0xbf }, 167: 168: { 0xb1, 0xa1 }, 169: { 0xb3, 0xa3 }, 170: { 0xb5, 0xa5 }, 171: { 0xb6, 0xa6 }, 172: { 0xb9, 0xa9 }, 173: { 0xba, 0xaa }, 174: { 0xbb, 0xab }, 175: { 0xbc, 0xac }, 176: { 0xbe, 0xae }, 177: { 0xbf, 0xaf }, 178: 179: { 0xc0, 0xe0 }, 180: { 0xc1, 0xe1 }, 181: { 0xc2, 0xe2 }, 182: { 0xc3, 0xe3 }, 183: { 0xc4, 0xe4 }, 184: { 0xc5, 0xe5 }, 185: { 0xc6, 0xe6 }, 186: { 0xc7, 0xe7 }, 187: { 0xc8, 0xe8 }, 188: { 0xc9, 0xe9 }, 189: { 0xca, 0xea }, 190: { 0xcb, 0xeb }, 191: { 0xcc, 0xec }, 192: { 0xcd, 0xed }, 193: { 0xce, 0xee }, 194: { 0xcf, 0xef }, 195: 196: { 0xd0, 0xf0 }, 197: { 0xd1, 0xf1 }, 198: { 0xd2, 0xf2 }, 199: { 0xd3, 0xf3 }, 200: { 0xd4, 0xf4 }, 201: { 0xd5, 0xf5 }, 202: { 0xd6, 0xf6 }, 203: { 0xd8, 0xf8 }, 204: { 0xd9, 0xf9 }, 205: { 0xda, 0xfa }, 206: { 0xdb, 0xfb }, 207: { 0xdc, 0xfc }, 208: { 0xdd, 0xfd }, 209: { 0xde, 0xfe }, 210: 211: { 0xe0, 0xc0 }, 212: { 0xe1, 0xc1 }, 213: { 0xe2, 0xc2 }, 214: { 0xe3, 0xc3 }, 215: { 0xe4, 0xc4 }, 216: { 0xe5, 0xc5 }, 217: { 0xe6, 0xc6 }, 218: { 0xe7, 0xc7 }, 219: { 0xe8, 0xc8 }, 220: { 0xe9, 0xc9 }, 221: { 0xea, 0xca }, 222: { 0xeb, 0xcb }, 223: { 0xec, 0xcc }, 224: { 0xed, 0xcd }, 225: { 0xee, 0xce }, 226: { 0xef, 0xcf }, 227: 228: { 0xf0, 0xd0 }, 229: { 0xf1, 0xd1 }, 230: { 0xf2, 0xd2 }, 231: { 0xf3, 0xd3 }, 232: { 0xf4, 0xd4 }, 233: { 0xf5, 0xd5 }, 234: { 0xf6, 0xd6 }, 235: { 0xf8, 0xd8 }, 236: { 0xf9, 0xd9 }, 237: { 0xfa, 0xda }, 238: { 0xfb, 0xdb }, 239: { 0xfc, 0xdc }, 240: { 0xfd, 0xdd }, 241: { 0xfe, 0xde } 242: }; 243: 244: if (flag == ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) { 245: *ccs = OnigAsciiPairAmbigCodes; 246: return 52; 247: } 248: if (flag == ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) { 249: *ccs = cc; 250: return sizeof(cc) / sizeof(OnigPairAmbigCodes); 251: } 252: else 253: return 0; 254: } 255: 256: static int 257: iso_8859_2_is_code_ctype(OnigCodePoint code, unsigned int ctype) 258: { 259: if (code < 256) 260: return ENC_IS_ISO_8859_2_CTYPE(code, ctype); 261: else 262: return FALSE; 263: } 264: 265: OnigEncodingType OnigEncodingISO_8859_2 = { 266: onigenc_single_byte_mbc_enc_len, 267: "ISO-8859-2", /* name */ 268: 1, /* max enc length */ 269: 1, /* min enc length */ 270: (ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE | 271: ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE ), 272: { 273: (OnigCodePoint )'\\' /* esc */ 274: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */ 275: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */ 276: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */ 277: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */ 278: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */ 279: }, 280: onigenc_is_mbc_newline_0x0a, 281: onigenc_single_byte_mbc_to_code, 282: onigenc_single_byte_code_to_mbclen, 283: onigenc_single_byte_code_to_mbc, 284: iso_8859_2_mbc_to_normalize, 285: iso_8859_2_is_mbc_ambiguous, 286: iso_8859_2_get_all_pair_ambig_codes, 287: onigenc_ess_tsett_get_all_comp_ambig_codes, 288: iso_8859_2_is_code_ctype, 289: onigenc_not_support_get_ctype_code_range, 290: onigenc_single_byte_left_adjust_char_head, 291: onigenc_always_true_is_allowed_reverse_match 292: };