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 ($)
142
143 int toUpperCase(int ch) {
144 int mapChar = ch;
145 int val = getProperties(ch);
146
147 if ((val & $$maskUpperCase) != 0) {
148 if ((val & $$maskCaseOffset) != $$maskCaseOffset) {
149 int offset = val << $$shiftCaseOffsetSign >> ($$shiftCaseOffsetSign+$$shiftCaseOffset);
150 mapChar = ch - offset;
151 } else if (ch == 0x00B5) {
152 mapChar = 0x039C;
153 }
154 }
155 return mapChar;
156 }
157
158 int toTitleCase(int ch) {
159 return toUpperCase(ch);
160 }
161
162 int digit(int ch, int radix) {
163 int value = -1;
164 if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {
165 int val = getProperties(ch);
166 int kind = val & $$maskType;
167 if (kind == Character.DECIMAL_DIGIT_NUMBER) {
168 value = ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit;
169 }
170 else if ((val & $$maskNumericType) == $$valueJavaSupradecimal) {
171 // Java supradecimal digit
172 value = (ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit) + 10;
173 }
174 }
175 return (value < radix) ? value : -1;
176 }
177
178 int getNumericValue(int ch) {
179 int val = getProperties(ch);
180 int retval = -1;
181
182 switch (val & $$maskNumericType) {
183 default: // cannot occur
184 case ($$valueNotNumeric): // not numeric
185 retval = -1;
186 break;
187 case ($$valueDigit): // simple numeric
188 retval = ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit;
189 break;
190 case ($$valueStrangeNumeric) : // "strange" numeric
191 retval = -2;
192 break;
193 case ($$valueJavaSupradecimal): // Java supradecimal
194 retval = (ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit) + 10;
195 break;
|
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 ($)
144
145 int toUpperCase(int ch) {
146 int mapChar = ch;
147 int val = getProperties(ch);
148
149 if ((val & $$maskUpperCase) != 0) {
150 if ((val & $$maskCaseOffset) != $$maskCaseOffset) {
151 int offset = val << $$shiftCaseOffsetSign >> ($$shiftCaseOffsetSign+$$shiftCaseOffset);
152 mapChar = ch - offset;
153 } else if (ch == 0x00B5) {
154 mapChar = 0x039C;
155 }
156 }
157 return mapChar;
158 }
159
160 int toTitleCase(int ch) {
161 return toUpperCase(ch);
162 }
163
164 // Digit values for codePoints in the 0-255 range. Contents generated using:
165 // for (char i = 0; i < 256; i++) {
166 // int v = -1;
167 // if (i >= '0' && i <= '9') { v = i - '0'; }
168 // else if (i >= 'A' && i <= 'Z') { v = i - 'A' + 10; }
169 // else if (i >= 'a' && i <= 'z') { v = i - 'a' + 10; }
170 // if (i % 20 == 0) System.out.println();
171 // System.out.printf("%2d, ", v);
172 // }
173 private static final byte[] DIGITS = new byte[] {
174 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
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, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1,
177 -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
178 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, 10, 11, 12,
179 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
180 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
181 -1, -1, -1, -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 };
187
188 int digit(int ch, int radix) {
189 int value = DIGITS[ch];
190 if (value >= 0 && radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {
191 value = (value < radix) ? value : -1;
192 }
193 return value;
194 }
195
196 int getNumericValue(int ch) {
197 int val = getProperties(ch);
198 int retval = -1;
199
200 switch (val & $$maskNumericType) {
201 default: // cannot occur
202 case ($$valueNotNumeric): // not numeric
203 retval = -1;
204 break;
205 case ($$valueDigit): // simple numeric
206 retval = ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit;
207 break;
208 case ($$valueStrangeNumeric) : // "strange" numeric
209 retval = -2;
210 break;
211 case ($$valueJavaSupradecimal): // Java supradecimal
212 retval = (ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit) + 10;
213 break;
|