Return to iso8859_15.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / mbstring / oniguruma / enc |
1.1 misho 1: /********************************************************************** 2: iso8859_15.c - Oniguruma (regular expression library) 3: **********************************************************************/ 4: /*- 5: * Copyright (c) 2002-2007 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_15_TO_LOWER_CASE(c) EncISO_8859_15_ToLowerCaseTable[c] 33: #define ENC_IS_ISO_8859_15_CTYPE(code,ctype) \ 34: ((EncISO_8859_15_CtypeTable[code] & ctype) != 0) 35: 36: static const UChar EncISO_8859_15_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', '\250', '\247', 58: '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', 59: '\260', '\261', '\262', '\263', '\270', '\265', '\266', '\267', 60: '\270', '\271', '\272', '\273', '\275', '\275', '\377', '\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_15_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, 0x01a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x14a2, 0x00a0, 93: 0x10e2, 0x00a0, 0x10e2, 0x01a0, 0x00a0, 0x01a0, 0x00a0, 0x00a0, 94: 0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x14a2, 0x10e2, 0x00a0, 0x01a0, 95: 0x10e2, 0x10a0, 0x10e2, 0x01a0, 0x14a2, 0x10e2, 0x14a2, 0x01a0, 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, 0x10e2 104: }; 105: 106: static int 107: 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_15_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: is_mbc_ambiguous(OnigAmbigType flag, const UChar** pp, const UChar* end) 127: { 128: const UChar* 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 = (EncISO_8859_15_CtypeTable[*p] & 136: (ONIGENC_CTYPE_UPPER | ONIGENC_CTYPE_LOWER)); 137: 138: if ((v | ONIGENC_CTYPE_LOWER) != 0) { 139: /* 0xdf etc.. are lower case letter, but can't convert. */ 140: if (*p == 0xdf || *p == 0xaa || *p == 0xb5 || *p == 0xba) 141: return FALSE; 142: else 143: return TRUE; 144: } 145: 146: return (v != 0 ? TRUE : FALSE); 147: } 148: return FALSE; 149: } 150: 151: static int 152: is_code_ctype(OnigCodePoint code, unsigned int ctype) 153: { 154: if (code < 256) 155: return ENC_IS_ISO_8859_15_CTYPE(code, ctype); 156: else 157: return FALSE; 158: } 159: 160: static int 161: get_all_pair_ambig_codes(OnigAmbigType flag, 162: const OnigPairAmbigCodes** ccs) 163: { 164: static const OnigPairAmbigCodes cc[] = { 165: { 0xa6, 0xa8 }, 166: { 0xa8, 0xa6 }, 167: 168: { 0xb4, 0xb8 }, 169: { 0xb8, 0xb4 }, 170: { 0xbc, 0xbd }, 171: { 0xbd, 0xbc }, 172: { 0xbe, 0xff }, 173: 174: { 0xc0, 0xe0 }, 175: { 0xc1, 0xe1 }, 176: { 0xc2, 0xe2 }, 177: { 0xc3, 0xe3 }, 178: { 0xc4, 0xe4 }, 179: { 0xc5, 0xe5 }, 180: { 0xc6, 0xe6 }, 181: { 0xc7, 0xe7 }, 182: { 0xc8, 0xe8 }, 183: { 0xc9, 0xe9 }, 184: { 0xca, 0xea }, 185: { 0xcb, 0xeb }, 186: { 0xcc, 0xec }, 187: { 0xcd, 0xed }, 188: { 0xce, 0xee }, 189: { 0xcf, 0xef }, 190: 191: { 0xd0, 0xf0 }, 192: { 0xd1, 0xf1 }, 193: { 0xd2, 0xf2 }, 194: { 0xd3, 0xf3 }, 195: { 0xd4, 0xf4 }, 196: { 0xd5, 0xf5 }, 197: { 0xd6, 0xf6 }, 198: { 0xd8, 0xf8 }, 199: { 0xd9, 0xf9 }, 200: { 0xda, 0xfa }, 201: { 0xdb, 0xfb }, 202: { 0xdc, 0xfc }, 203: { 0xdd, 0xfd }, 204: { 0xde, 0xfe }, 205: 206: { 0xe0, 0xc0 }, 207: { 0xe1, 0xc1 }, 208: { 0xe2, 0xc2 }, 209: { 0xe3, 0xc3 }, 210: { 0xe4, 0xc4 }, 211: { 0xe5, 0xc5 }, 212: { 0xe6, 0xc6 }, 213: { 0xe7, 0xc7 }, 214: { 0xe8, 0xc8 }, 215: { 0xe9, 0xc9 }, 216: { 0xea, 0xca }, 217: { 0xeb, 0xcb }, 218: { 0xec, 0xcc }, 219: { 0xed, 0xcd }, 220: { 0xee, 0xce }, 221: { 0xef, 0xcf }, 222: 223: { 0xf0, 0xd0 }, 224: { 0xf1, 0xd1 }, 225: { 0xf2, 0xd2 }, 226: { 0xf3, 0xd3 }, 227: { 0xf4, 0xd4 }, 228: { 0xf5, 0xd5 }, 229: { 0xf6, 0xd6 }, 230: { 0xf8, 0xd8 }, 231: { 0xf9, 0xd9 }, 232: { 0xfa, 0xda }, 233: { 0xfb, 0xdb }, 234: { 0xfc, 0xdc }, 235: { 0xfd, 0xdd }, 236: { 0xfe, 0xde }, 237: { 0xff, 0xbe } 238: }; 239: 240: if (flag == ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) { 241: *ccs = OnigAsciiPairAmbigCodes; 242: return 52; 243: } 244: if (flag == ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) { 245: *ccs = cc; 246: return sizeof(cc) / sizeof(OnigPairAmbigCodes); 247: } 248: else 249: return 0; 250: } 251: 252: OnigEncodingType OnigEncodingISO_8859_15 = { 253: onigenc_single_byte_mbc_enc_len, 254: "ISO-8859-15", /* name */ 255: 1, /* max enc length */ 256: 1, /* min enc length */ 257: (ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE | 258: ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE ), 259: { 260: (OnigCodePoint )'\\' /* esc */ 261: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */ 262: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */ 263: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */ 264: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */ 265: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */ 266: }, 267: onigenc_is_mbc_newline_0x0a, 268: onigenc_single_byte_mbc_to_code, 269: onigenc_single_byte_code_to_mbclen, 270: onigenc_single_byte_code_to_mbc, 271: mbc_to_normalize, 272: is_mbc_ambiguous, 273: get_all_pair_ambig_codes, 274: onigenc_ess_tsett_get_all_comp_ambig_codes, 275: is_code_ctype, 276: onigenc_not_support_get_ctype_code_range, 277: onigenc_single_byte_left_adjust_char_head, 278: onigenc_always_true_is_allowed_reverse_match 279: };