Home | History | Annotate | Download | only in impl
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html#License
      3 /**
      4 *******************************************************************************
      5 * Copyright (C) 1996-2004, International Business Machines Corporation and    *
      6 * others. All Rights Reserved.                                                *
      7 *******************************************************************************
      8 */
      9 package com.ibm.icu.impl;
     10 
     11 /**
     12 * Internal character utility class for simple data type conversion and String
     13 * parsing functions. Does not have an analog in the JDK.
     14 * @author Syn Wee Quek
     15 * @since sep2900
     16 */
     17 
     18 public final class UCharacterUtility
     19 {
     20     // public methods -----------------------------------------------------
     21 
     22     /**
     23     * Determines if codepoint is a non character
     24     * @param ch codepoint
     25     * @return true if codepoint is a non character false otherwise
     26     */
     27     public static boolean isNonCharacter(int ch)
     28     {
     29         if ((ch & NON_CHARACTER_SUFFIX_MIN_3_0_) ==
     30                                             NON_CHARACTER_SUFFIX_MIN_3_0_) {
     31             return true;
     32         }
     33 
     34         return ch >= NON_CHARACTER_MIN_3_1_ && ch <=  NON_CHARACTER_MAX_3_1_;
     35     }
     36 
     37     // package private methods ---------------------------------------------
     38 
     39     /**
     40     * joining 2 chars to form an int
     41     * @param msc most significant char
     42     * @param lsc least significant char
     43     * @return int form
     44     */
     45     static int toInt(char msc, char lsc)
     46     {
     47         return ((msc << 16) | lsc);
     48     }
     49 
     50     /**
     51     * Retrieves a null terminated substring from an array of bytes.
     52     * Substring is a set of non-zero bytes starting from argument start to the
     53     * next zero byte. If the first byte is a zero, the next byte will be taken as
     54     * the first byte.
     55     * @param str stringbuffer to store data in, data will be store with each
     56     *            byte as a char
     57     * @param array byte array
     58     * @param index to start substring in byte count
     59     * @return the end position of the substring within the character array
     60     */
     61     static int getNullTermByteSubString(StringBuffer str, byte[] array,
     62                                                   int index)
     63     {
     64         byte b = 1;
     65 
     66         while (b != 0)
     67         {
     68             b = array[index];
     69             if (b != 0) {
     70                 str.append((char)(b & 0x00FF));
     71             }
     72             index ++;
     73         }
     74         return index;
     75     }
     76 
     77     /**
     78     * Compares a null terminated substring from an array of bytes.
     79     * Substring is a set of non-zero bytes starting from argument start to the
     80     * next zero byte. if the first byte is a zero, the next byte will be taken as
     81     * the first byte.
     82     * @param str string to compare
     83     * @param array byte array
     84     * @param strindex index within str to start comparing
     85     * @param aindex array index to start in byte count
     86     * @return the end position of the substring within str if matches otherwise
     87     *         a -1
     88     */
     89     static int compareNullTermByteSubString(String str, byte[] array,
     90                                                       int strindex, int aindex)
     91     {
     92         byte b = 1;
     93         int length = str.length();
     94 
     95         while (b != 0)
     96         {
     97             b = array[aindex];
     98             aindex ++;
     99             if (b == 0) {
    100                 break;
    101             }
    102             // if we have reached the end of the string and yet the array has not
    103             // reached the end of their substring yet, abort
    104             if (strindex == length
    105                 || (str.charAt(strindex) != (char)(b & 0xFF))) {
    106               return -1;
    107             }
    108             strindex ++;
    109         }
    110         return strindex;
    111     }
    112 
    113     /**
    114     * Skip null terminated substrings from an array of bytes.
    115     * Substring is a set of non-zero bytes starting from argument start to the
    116     * next zero byte. If the first byte is a zero, the next byte will be taken as
    117     * the first byte.
    118     * @param array byte array
    119     * @param index to start substrings in byte count
    120     * @param skipcount number of null terminated substrings to skip
    121     * @return the end position of the substrings within the character array
    122     */
    123     static int skipNullTermByteSubString(byte[] array, int index,
    124                                                    int skipcount)
    125     {
    126         byte b;
    127         for (int i = 0; i < skipcount; i ++)
    128         {
    129             b = 1;
    130             while (b != 0)
    131             {
    132                 b = array[index];
    133                 index ++;
    134             }
    135         }
    136         return index;
    137     }
    138 
    139     /**
    140      * skip substrings from an array of characters, where each character is a set
    141      * of 2 bytes. substring is a set of non-zero bytes starting from argument
    142      * start to the byte of the argument value. skips up to a max number of
    143      * characters
    144      * @param array byte array to parse
    145      * @param index to start substrings in byte count
    146      * @param length the max number of bytes to skip
    147      * @param skipend value of byte to skip to
    148      * @return the number of bytes skipped
    149      */
    150     static int skipByteSubString(byte[] array, int index, int length,
    151                                            byte skipend)
    152     {
    153         int result;
    154         byte b;
    155 
    156         for (result = 0; result < length; result ++)
    157         {
    158             b = array[index + result];
    159             if (b == skipend)
    160             {
    161                 result ++;
    162                 break;
    163             }
    164         }
    165 
    166         return result;
    167     }
    168 
    169     // private data member --------------------------------------------------
    170 
    171     /**
    172     * Minimum suffix value that indicates if a character is non character.
    173     * Unicode 3.0 non characters
    174     */
    175     private static final int NON_CHARACTER_SUFFIX_MIN_3_0_ = 0xFFFE;
    176     /**
    177     * New minimum non character in Unicode 3.1
    178     */
    179     private static final int NON_CHARACTER_MIN_3_1_ = 0xFDD0;
    180     /**
    181     * New non character range in Unicode 3.1
    182     */
    183     private static final int NON_CHARACTER_MAX_3_1_ = 0xFDEF;
    184 
    185     // private constructor --------------------------------------------------
    186 
    187     ///CLOVER:OFF
    188     /**
    189     * private constructor to avoid initialisation
    190     */
    191     private UCharacterUtility()
    192     {
    193     }
    194     ///CLOVER:ON
    195 }
    196 
    197