History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/text/normalizer/UCharacterProperty.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/text/normalizer/UCharacterProperty.java+369−0
@@ -0,0 +1,369 @@
1/*
2 * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25/*
26 *******************************************************************************
27 * (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved *
28 * *
29 * The original version of this source code and documentation is copyrighted *
30 * and owned by IBM, These materials are provided under terms of a License *
31 * Agreement between IBM and Sun. This technology is protected by multiple *
32 * US and International patents. This notice and attribution to IBM may not *
33 * to removed. *
34 *******************************************************************************
35 */
36
37package sun.text.normalizer;
38
39import java.io.BufferedInputStream;
40import java.io.InputStream;
41import java.io.IOException;
42import java.util.MissingResourceException;
43
44/**
45* <p>Internal class used for Unicode character property database.</p>
46* <p>This classes store binary data read from uprops.icu.
47* It does not have the capability to parse the data into more high-level
48* information. It only returns bytes of information when required.</p>
49* <p>Due to the form most commonly used for retrieval, array of char is used
50* to store the binary data.</p>
51* <p>UCharacterPropertyDB also contains information on accessing indexes to
52* significant points in the binary data.</p>
53* <p>Responsibility for molding the binary data into more meaning form lies on
54* <a href=UCharacter.html>UCharacter</a>.</p>
55* @author Syn Wee Quek
56* @since release 2.1, february 1st 2002
57*/
58
59public final class UCharacterProperty
60{
61 // public data members -----------------------------------------------
62
63 /**
64 * Trie data
65 */
66 public CharTrie m_trie_;
67 /**
68 * Optimization
69 * CharTrie index array
70 */
71 public char[] m_trieIndex_;
72 /**
73 * Optimization
74 * CharTrie data array
75 */
76 public char[] m_trieData_;
77 /**
78 * Optimization
79 * CharTrie data offset
80 */
81 public int m_trieInitialValue_;
82 /**
83 * Unicode version
84 */
85 public VersionInfo m_unicodeVersion_;
86
87 // uprops.h enum UPropertySource --------------------------------------- ***
88
89 /** From uchar.c/uprops.icu properties vectors trie */
90 public static final int SRC_PROPSVEC=2;
91 /** One more than the highest UPropertySource (SRC_) constant. */
92 public static final int SRC_COUNT=9;
93
94 // public methods ----------------------------------------------------
95
96 /**
97 * Java friends implementation
98 */
99 public void setIndexData(CharTrie.FriendAgent friendagent)
100 {
101 m_trieIndex_ = friendagent.getPrivateIndex();
102 m_trieData_ = friendagent.getPrivateData();
103 m_trieInitialValue_ = friendagent.getPrivateInitialValue();
104 }
105
106 /**
107 * Gets the property value at the index.
108 * This is optimized.
109 * Note this is alittle different from CharTrie the index m_trieData_
110 * is never negative.
111 * @param ch code point whose property value is to be retrieved
112 * @return property value of code point
113 */
114 public final int getProperty(int ch)
115 {
116 if (ch < UTF16.LEAD_SURROGATE_MIN_VALUE
117 || (ch > UTF16.LEAD_SURROGATE_MAX_VALUE
118 && ch < UTF16.SUPPLEMENTARY_MIN_VALUE)) {
119 // BMP codepoint 0000..D7FF or DC00..FFFF
120 // optimized
121 try { // using try for ch < 0 is faster than using an if statement
122 return m_trieData_[
123 (m_trieIndex_[ch >> Trie.INDEX_STAGE_1_SHIFT_]
124 << Trie.INDEX_STAGE_2_SHIFT_)
125 + (ch & Trie.INDEX_STAGE_3_MASK_)];
126 } catch (ArrayIndexOutOfBoundsException e) {
127 return m_trieInitialValue_;
128 }
129 }
130 if (ch <= UTF16.LEAD_SURROGATE_MAX_VALUE) {
131 // lead surrogate D800..DBFF
132 return m_trieData_[
133 (m_trieIndex_[Trie.LEAD_INDEX_OFFSET_
134 + (ch >> Trie.INDEX_STAGE_1_SHIFT_)]
135 << Trie.INDEX_STAGE_2_SHIFT_)
136 + (ch & Trie.INDEX_STAGE_3_MASK_)];
137 }
138 if (ch <= UTF16.CODEPOINT_MAX_VALUE) {
139 // supplementary code point 10000..10FFFF
140 // look at the construction of supplementary characters
141 // trail forms the ends of it.
142 return m_trie_.getSurrogateValue(
143 UTF16.getLeadSurrogate(ch),
144 (char)(ch & Trie.SURROGATE_MASK_));
145 }
146 // ch is out of bounds
147 // return m_dataOffset_ if there is an error, in this case we return
148 // the default value: m_initialValue_
149 // we cannot assume that m_initialValue_ is at offset 0
150 // this is for optimization.
151 return m_trieInitialValue_;
152
153 // this all is an inlined form of return m_trie_.getCodePointValue(ch);
154 }
155
156 /**
157 * Getting the unsigned numeric value of a character embedded in the property
158 * argument
159 * @param prop the character
160 * @return unsigned numberic value
161 */
162 public static int getUnsignedValue(int prop)
163 {
164 return (prop >> VALUE_SHIFT_) & UNSIGNED_VALUE_MASK_AFTER_SHIFT_;
165 }
166
167 /**
168 * Gets the unicode additional properties.
169 * C version getUnicodeProperties.
170 * @param codepoint codepoint whose additional properties is to be
171 * retrieved
172 * @param column
173 * @return unicode properties
174 */
175 public int getAdditional(int codepoint, int column) {
176 if (column == -1) {
177 return getProperty(codepoint);
178 }
179 if (column < 0 || column >= m_additionalColumnsCount_) {
180 return 0;
181 }
182 return m_additionalVectors_[
183 m_additionalTrie_.getCodePointValue(codepoint) + column];
184 }
185
186 /**
187 * <p>Get the "age" of the code point.</p>
188 * <p>The "age" is the Unicode version when the code point was first
189 * designated (as a non-character or for Private Use) or assigned a
190 * character.</p>
191 * <p>This can be useful to avoid emitting code points to receiving
192 * processes that do not accept newer characters.</p>
193 * <p>The data is from the UCD file DerivedAge.txt.</p>
194 * <p>This API does not check the validity of the codepoint.</p>
195 * @param codepoint The code point.
196 * @return the Unicode version number
197 */
198 public VersionInfo getAge(int codepoint)
199 {
200 int version = getAdditional(codepoint, 0) >> AGE_SHIFT_;
201 return VersionInfo.getInstance(
202 (version >> FIRST_NIBBLE_SHIFT_) & LAST_NIBBLE_MASK_,
203 version & LAST_NIBBLE_MASK_, 0, 0);
204 }
205
206 /**
207 * Forms a supplementary code point from the argument character<br>
208 * Note this is for internal use hence no checks for the validity of the
209 * surrogate characters are done
210 * @param lead lead surrogate character
211 * @param trail trailing surrogate character
212 * @return code point of the supplementary character
213 */
214 public static int getRawSupplementary(char lead, char trail)
215 {
216 return (lead << LEAD_SURROGATE_SHIFT_) + trail + SURROGATE_OFFSET_;
217 }
218
219 /**
220 * Loads the property data and initialize the UCharacterProperty instance.
221 * @throws MissingResourceException when data is missing or data has been corrupted
222 */
223 public static UCharacterProperty getInstance()
224 {
225 if(INSTANCE_ == null) {
226 try {
227 INSTANCE_ = new UCharacterProperty();
228 }
229 catch (Exception e) {
230 throw new MissingResourceException(e.getMessage(),"","");
231 }
232 }
233 return INSTANCE_;
234 }
235
236 /**
237 * Checks if the argument c is to be treated as a white space in ICU
238 * rules. Usually ICU rule white spaces are ignored unless quoted.
239 * Equivalent to test for Pattern_White_Space Unicode property.
240 * Stable set of characters, won't change.
241 * See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/
242 * @param c codepoint to check
243 * @return true if c is a ICU white space
244 */
245 public static boolean isRuleWhiteSpace(int c)
246 {
247 /* "white space" in the sense of ICU rule parsers
248 This is a FIXED LIST that is NOT DEPENDENT ON UNICODE PROPERTIES.
249 See UAX #31 Identifier and Pattern Syntax: http://www.unicode.org/reports/tr31/
250 U+0009..U+000D, U+0020, U+0085, U+200E..U+200F, and U+2028..U+2029
251 Equivalent to test for Pattern_White_Space Unicode property.
252 */
253 return (c >= 0x0009 && c <= 0x2029 &&
254 (c <= 0x000D || c == 0x0020 || c == 0x0085 ||
255 c == 0x200E || c == 0x200F || c >= 0x2028));
256 }
257
258 // protected variables -----------------------------------------------
259
260 /**
261 * Extra property trie
262 */
263 CharTrie m_additionalTrie_;
264 /**
265 * Extra property vectors, 1st column for age and second for binary
266 * properties.
267 */
268 int m_additionalVectors_[];
269 /**
270 * Number of additional columns
271 */
272 int m_additionalColumnsCount_;
273 /**
274 * Maximum values for block, bits used as in vector word
275 * 0
276 */
277 int m_maxBlockScriptValue_;
278 /**
279 * Maximum values for script, bits used as in vector word
280 * 0
281 */
282 int m_maxJTGValue_;
283
284 // private variables -------------------------------------------------
285
286 /**
287 * UnicodeData.txt property object
288 */
289 private static UCharacterProperty INSTANCE_ = null;
290
291 /**
292 * Default name of the datafile
293 */
294 private static final String DATA_FILE_NAME_ = "/sun/text/resources/uprops.icu";
295
296 /**
297 * Default buffer size of datafile
298 */
299 private static final int DATA_BUFFER_SIZE_ = 25000;
300
301 /**
302 * Numeric value shift
303 */
304 private static final int VALUE_SHIFT_ = 8;
305
306 /**
307 * Mask to be applied after shifting to obtain an unsigned numeric value
308 */
309 private static final int UNSIGNED_VALUE_MASK_AFTER_SHIFT_ = 0xFF;
310
311 /**
312 * Shift value for lead surrogate to form a supplementary character.
313 */
314 private static final int LEAD_SURROGATE_SHIFT_ = 10;
315 /**
316 * Offset to add to combined surrogate pair to avoid msking.
317 */
318 private static final int SURROGATE_OFFSET_ =
319 UTF16.SUPPLEMENTARY_MIN_VALUE -
320 (UTF16.SURROGATE_MIN_VALUE <<
321 LEAD_SURROGATE_SHIFT_) -
322 UTF16.TRAIL_SURROGATE_MIN_VALUE;
323
324 // additional properties ----------------------------------------------
325
326 /**
327 * First nibble shift
328 */
329 private static final int FIRST_NIBBLE_SHIFT_ = 0x4;
330 /**
331 * Second nibble mask
332 */
333 private static final int LAST_NIBBLE_MASK_ = 0xF;
334 /**
335 * Age value shift
336 */
337 private static final int AGE_SHIFT_ = 24;
338
339 // private constructors --------------------------------------------------
340
341 /**
342 * Constructor
343 * @exception IOException thrown when data reading fails or data corrupted
344 */
345 private UCharacterProperty() throws IOException
346 {
347 // jar access
348 InputStream is = ICUData.getRequiredStream(DATA_FILE_NAME_);
349 BufferedInputStream b = new BufferedInputStream(is, DATA_BUFFER_SIZE_);
350 UCharacterPropertyReader reader = new UCharacterPropertyReader(b);
351 reader.read(this);
352 b.close();
353
354 m_trie_.putIndexData(this);
355 }
356
357 public void upropsvec_addPropertyStarts(UnicodeSet set) {
358 /* add the start code point of each same-value range of the properties vectors trie */
359 if(m_additionalColumnsCount_>0) {
360 /* if m_additionalColumnsCount_==0 then the properties vectors trie may not be there at all */
361 TrieIterator propsVectorsIter = new TrieIterator(m_additionalTrie_);
362 RangeValueIterator.Element propsVectorsResult = new RangeValueIterator.Element();
363 while(propsVectorsIter.next(propsVectorsResult)){
364 set.add(propsVectorsResult.start);
365 }
366 }
367 }
368
369}