root/ext/mbstring/oniguruma/enc/utf32_be.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. utf32be_mbc_enc_len
  2. utf32be_is_mbc_newline
  3. utf32be_mbc_to_code
  4. utf32be_code_to_mbclen
  5. utf32be_code_to_mbc
  6. utf32be_mbc_case_fold
  7. utf32be_is_mbc_ambiguous
  8. utf32be_left_adjust_char_head
  9. utf32be_get_case_fold_codes_by_str

   1 /**********************************************************************
   2   utf32_be.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 static int
  33 utf32be_mbc_enc_len(const UChar* p ARG_UNUSED)
  34 {
  35   return 4;
  36 }
  37 
  38 static int
  39 utf32be_is_mbc_newline(const UChar* p, const UChar* end)
  40 {
  41   if (p + 3 < end) {
  42     if (*(p+3) == 0x0a && *(p+2) == 0 && *(p+1) == 0 && *p == 0)
  43       return 1;
  44 #ifdef USE_UNICODE_ALL_LINE_TERMINATORS
  45     if ((
  46 #ifndef USE_CRNL_AS_LINE_TERMINATOR
  47          *(p+3) == 0x0d ||
  48 #endif
  49          *(p+3) == 0x85)
  50         && *(p+2) == 0 && *(p+1) == 0 && *p == 0x00)
  51       return 1;
  52     if (*(p+2) == 0x20 && (*(p+3) == 0x29 || *(p+3) == 0x28)
  53         && *(p+1) == 0 && *p == 0)
  54       return 1;
  55 #endif
  56   }
  57   return 0;
  58 }
  59 
  60 static OnigCodePoint
  61 utf32be_mbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)
  62 {
  63   return (OnigCodePoint )(((p[0] * 256 + p[1]) * 256 + p[2]) * 256 + p[3]);
  64 }
  65 
  66 static int
  67 utf32be_code_to_mbclen(OnigCodePoint code ARG_UNUSED)
  68 {
  69   return 4;
  70 }
  71 
  72 static int
  73 utf32be_code_to_mbc(OnigCodePoint code, UChar *buf)
  74 {
  75   UChar* p = buf;
  76 
  77   *p++ = (UChar )((code & 0xff000000) >>24);
  78   *p++ = (UChar )((code & 0xff0000)   >>16);
  79   *p++ = (UChar )((code & 0xff00)     >> 8);
  80   *p++ = (UChar ) (code & 0xff);
  81   return 4;
  82 }
  83 
  84 static int
  85 utf32be_mbc_case_fold(OnigCaseFoldType flag,
  86                       const UChar** pp, const UChar* end, UChar* fold)
  87 {
  88   const UChar* p = *pp;
  89 
  90   if (ONIGENC_IS_ASCII_CODE(*(p+3)) && *(p+2) == 0 && *(p+1) == 0 && *p == 0) {
  91     *fold++ = 0;
  92     *fold++ = 0;
  93 
  94 #ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI
  95     if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {
  96       if (*(p+3) == 0x49) {
  97         *fold++ = 0x01;
  98         *fold   = 0x31;
  99         (*pp) += 4;
 100         return 4;
 101       }
 102     }
 103 #endif
 104 
 105     *fold++ = 0;
 106     *fold   = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*(p+3));
 107     *pp += 4;
 108     return 4;
 109   }
 110   else
 111     return onigenc_unicode_mbc_case_fold(ONIG_ENCODING_UTF32_BE, flag, pp, end,
 112                                          fold);
 113 }
 114 
 115 #if 0
 116 static int
 117 utf32be_is_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)
 118 {
 119   const UChar* p = *pp;
 120 
 121   (*pp) += 4;
 122 
 123   if (*(p+2) == 0 && *(p+1) == 0 && *p == 0) {
 124     int c, v;
 125 
 126     p += 3;
 127     if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {
 128       return TRUE;
 129     }
 130 
 131     c = *p;
 132     v = ONIGENC_IS_UNICODE_ISO_8859_1_BIT_CTYPE(c,
 133                        (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));
 134     if ((v | BIT_CTYPE_LOWER) != 0) {
 135       /* 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */
 136       if (c >= 0xaa && c <= 0xba)
 137         return FALSE;
 138       else
 139         return TRUE;
 140     }
 141     return (v != 0 ? TRUE : FALSE);
 142   }
 143 
 144   return FALSE;
 145 }
 146 #endif
 147 
 148 static UChar*
 149 utf32be_left_adjust_char_head(const UChar* start, const UChar* s)
 150 {
 151   int rem;
 152 
 153   if (s <= start) return (UChar* )s;
 154 
 155   rem = (s - start) % 4;
 156   return (UChar* )(s - rem);
 157 }
 158 
 159 static int
 160 utf32be_get_case_fold_codes_by_str(OnigCaseFoldType flag,
 161     const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])
 162 {
 163   return onigenc_unicode_get_case_fold_codes_by_str(ONIG_ENCODING_UTF32_BE,
 164                                                     flag, p, end, items);
 165 }
 166 
 167 OnigEncodingType OnigEncodingUTF32_BE = {
 168   utf32be_mbc_enc_len,
 169   "UTF-32BE",   /* name */
 170   4,            /* max byte length */
 171   4,            /* min byte length */
 172   utf32be_is_mbc_newline,
 173   utf32be_mbc_to_code,
 174   utf32be_code_to_mbclen,
 175   utf32be_code_to_mbc,
 176   utf32be_mbc_case_fold,
 177   onigenc_unicode_apply_all_case_fold,
 178   utf32be_get_case_fold_codes_by_str,
 179   onigenc_unicode_property_name_to_ctype,
 180   onigenc_unicode_is_code_ctype,
 181   onigenc_utf16_32_get_ctype_code_range,
 182   utf32be_left_adjust_char_head,
 183   onigenc_always_false_is_allowed_reverse_match
 184 };

/* [<][>][^][v][top][bottom][index][help] */