1 /*
2 * Copyright (c) 2002, 2013, 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 package java.lang;
27
28 import java.util.Arrays;
29
30 /** The CharacterData class encapsulates the large tables found in
31 Java.lang.Character. */
32
33 class CharacterDataLatin1 extends CharacterData {
34
35 /* The character properties are currently encoded into 32 bits in the following manner:
36 1 bit mirrored property
37 4 bits directionality property
38 9 bits signed offset used for converting case
39 1 bit if 1, adding the signed offset converts the character to lowercase
40 1 bit if 1, subtracting the signed offset converts the character to uppercase
41 1 bit if 1, this character has a titlecase equivalent (possibly itself)
42 3 bits 0 may not be part of an identifier
43 1 ignorable control; may continue a Unicode identifier or Java identifier
44 2 may continue a Java identifier but not a Unicode identifier (unused)
45 3 may continue a Unicode identifier or Java identifier
46 4 is a Java whitespace character
47 5 may start or continue a Java identifier;
48 may continue but not start a Unicode identifier (underscores)
49 6 may start or continue a Java identifier but not a Unicode identifier ($)
173 //
174 // Analysis has shown that generating the whole array allows the JIT to generate
175 // better code compared to a slimmed down array, such as one cutting off after 'z'
176 private static final byte[] DIGITS = new byte[] {
177 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
178 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
179 -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1,
180 -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
181 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, 10, 11, 12,
182 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
183 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
184 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
185 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
186 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
187 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
188 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
189 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
190
191 int digit(int ch, int radix) {
192 int value = DIGITS[ch];
193 if (value >= 0 && radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {
194 value = (value < radix) ? value : -1;
195 }
196 return value;
197 }
198
199 int getNumericValue(int ch) {
200 int val = getProperties(ch);
201 int retval = -1;
202
203 switch (val & $$maskNumericType) {
204 default: // cannot occur
205 case ($$valueNotNumeric): // not numeric
206 retval = -1;
207 break;
208 case ($$valueDigit): // simple numeric
209 retval = ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit;
210 break;
211 case ($$valueStrangeNumeric) : // "strange" numeric
212 retval = -2;
213 break;
214 case ($$valueJavaSupradecimal): // Java supradecimal
215 retval = (ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit) + 10;
216 break;
|
1 /*
2 * Copyright (c) 2002, 2018, 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 package java.lang;
27
28 /** The CharacterData class encapsulates the large tables found in
29 Java.lang.Character. */
30
31 class CharacterDataLatin1 extends CharacterData {
32
33 /* The character properties are currently encoded into 32 bits in the following manner:
34 1 bit mirrored property
35 4 bits directionality property
36 9 bits signed offset used for converting case
37 1 bit if 1, adding the signed offset converts the character to lowercase
38 1 bit if 1, subtracting the signed offset converts the character to uppercase
39 1 bit if 1, this character has a titlecase equivalent (possibly itself)
40 3 bits 0 may not be part of an identifier
41 1 ignorable control; may continue a Unicode identifier or Java identifier
42 2 may continue a Java identifier but not a Unicode identifier (unused)
43 3 may continue a Unicode identifier or Java identifier
44 4 is a Java whitespace character
45 5 may start or continue a Java identifier;
46 may continue but not start a Unicode identifier (underscores)
47 6 may start or continue a Java identifier but not a Unicode identifier ($)
171 //
172 // Analysis has shown that generating the whole array allows the JIT to generate
173 // better code compared to a slimmed down array, such as one cutting off after 'z'
174 private static final byte[] DIGITS = new byte[] {
175 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
176 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
177 -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1,
178 -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
179 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, 10, 11, 12,
180 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
181 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
182 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
183 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
184 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
185 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
186 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
187 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
188
189 int digit(int ch, int radix) {
190 int value = DIGITS[ch];
191 return (value >= 0 && value < radix && radix >= Character.MIN_RADIX
192 && radix <= Character.MAX_RADIX) ? value : -1;
193 }
194
195 int getNumericValue(int ch) {
196 int val = getProperties(ch);
197 int retval = -1;
198
199 switch (val & $$maskNumericType) {
200 default: // cannot occur
201 case ($$valueNotNumeric): // not numeric
202 retval = -1;
203 break;
204 case ($$valueDigit): // simple numeric
205 retval = ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit;
206 break;
207 case ($$valueStrangeNumeric) : // "strange" numeric
208 retval = -2;
209 break;
210 case ($$valueJavaSupradecimal): // Java supradecimal
211 retval = (ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit) + 10;
212 break;
|