| // This file was generated AUTOMATICALLY from a template file Thu Sep 11 09:30:36 BST 2014 |
| /* |
| * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package java.lang; |
| |
| /** The CharacterData class encapsulates the large tables found in |
| Java.lang.Character. */ |
| |
| class CharacterDataLatin1 extends CharacterData { |
| |
| /* The character properties are currently encoded into 32 bits in the following manner: |
| 1 bit mirrored property |
| 4 bits directionality property |
| 9 bits signed offset used for converting case |
| 1 bit if 1, adding the signed offset converts the character to lowercase |
| 1 bit if 1, subtracting the signed offset converts the character to uppercase |
| 1 bit if 1, this character has a titlecase equivalent (possibly itself) |
| 3 bits 0 may not be part of an identifier |
| 1 ignorable control; may continue a Unicode identifier or Java identifier |
| 2 may continue a Java identifier but not a Unicode identifier (unused) |
| 3 may continue a Unicode identifier or Java identifier |
| 4 is a Java whitespace character |
| 5 may start or continue a Java identifier; |
| may continue but not start a Unicode identifier (underscores) |
| 6 may start or continue a Java identifier but not a Unicode identifier ($) |
| 7 may start or continue a Unicode identifier or Java identifier |
| Thus: |
| 5, 6, 7 may start a Java identifier |
| 1, 2, 3, 5, 6, 7 may continue a Java identifier |
| 7 may start a Unicode identifier |
| 1, 3, 5, 7 may continue a Unicode identifier |
| 1 is ignorable within an identifier |
| 4 is Java whitespace |
| 2 bits 0 this character has no numeric property |
| 1 adding the digit offset to the character code and then |
| masking with 0x1F will produce the desired numeric value |
| 2 this character has a "strange" numeric value |
| 3 a Java supradecimal digit: adding the digit offset to the |
| character code, then masking with 0x1F, then adding 10 |
| will produce the desired numeric value |
| 5 bits digit offset |
| 5 bits character type |
| |
| The encoding of character properties is subject to change at any time. |
| */ |
| |
| int getProperties(int ch) { |
| char offset = (char)ch; |
| int props = A[offset]; |
| return props; |
| } |
| |
| int getPropertiesEx(int ch) { |
| char offset = (char)ch; |
| int props = B[offset]; |
| return props; |
| } |
| |
| boolean isOtherLowercase(int ch) { |
| int props = getPropertiesEx(ch); |
| return (props & 0x0001) != 0; |
| } |
| |
| boolean isOtherUppercase(int ch) { |
| int props = getPropertiesEx(ch); |
| return (props & 0x0002) != 0; |
| } |
| |
| boolean isOtherAlphabetic(int ch) { |
| int props = getPropertiesEx(ch); |
| return (props & 0x0004) != 0; |
| } |
| |
| boolean isIdeographic(int ch) { |
| int props = getPropertiesEx(ch); |
| return (props & 0x0010) != 0; |
| } |
| |
| int getType(int ch) { |
| int props = getProperties(ch); |
| return (props & 0x1F); |
| } |
| |
| boolean isJavaIdentifierStart(int ch) { |
| int props = getProperties(ch); |
| return ((props & 0x00007000) >= 0x00005000); |
| } |
| |
| boolean isJavaIdentifierPart(int ch) { |
| int props = getProperties(ch); |
| return ((props & 0x00003000) != 0); |
| } |
| |
| boolean isUnicodeIdentifierStart(int ch) { |
| int props = getProperties(ch); |
| return ((props & 0x00007000) == 0x00007000); |
| } |
| |
| boolean isUnicodeIdentifierPart(int ch) { |
| int props = getProperties(ch); |
| return ((props & 0x00001000) != 0); |
| } |
| |
| boolean isIdentifierIgnorable(int ch) { |
| int props = getProperties(ch); |
| return ((props & 0x00007000) == 0x00001000); |
| } |
| |
| int toLowerCase(int ch) { |
| int mapChar = ch; |
| int val = getProperties(ch); |
| |
| if (((val & 0x00020000) != 0) && |
| ((val & 0x07FC0000) != 0x07FC0000)) { |
| int offset = val << 5 >> (5+18); |
| mapChar = ch + offset; |
| } |
| return mapChar; |
| } |
| |
| int toUpperCase(int ch) { |
| int mapChar = ch; |
| int val = getProperties(ch); |
| |
| if ((val & 0x00010000) != 0) { |
| if ((val & 0x07FC0000) != 0x07FC0000) { |
| int offset = val << 5 >> (5+18); |
| mapChar = ch - offset; |
| } else if (ch == 0x00B5) { |
| mapChar = 0x039C; |
| } |
| } |
| return mapChar; |
| } |
| |
| int toTitleCase(int ch) { |
| return toUpperCase(ch); |
| } |
| |
| int digit(int ch, int radix) { |
| int value = -1; |
| if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) { |
| int val = getProperties(ch); |
| int kind = val & 0x1F; |
| if (kind == Character.DECIMAL_DIGIT_NUMBER) { |
| value = ch + ((val & 0x3E0) >> 5) & 0x1F; |
| } |
| else if ((val & 0xC00) == 0x00000C00) { |
| // Java supradecimal digit |
| value = (ch + ((val & 0x3E0) >> 5) & 0x1F) + 10; |
| } |
| } |
| return (value < radix) ? value : -1; |
| } |
| |
| int getNumericValue(int ch) { |
| int val = getProperties(ch); |
| int retval = -1; |
| |
| switch (val & 0xC00) { |
| default: // cannot occur |
| case (0x00000000): // not numeric |
| retval = -1; |
| break; |
| case (0x00000400): // simple numeric |
| retval = ch + ((val & 0x3E0) >> 5) & 0x1F; |
| break; |
| case (0x00000800) : // "strange" numeric |
| retval = -2; |
| break; |
| case (0x00000C00): // Java supradecimal |
| retval = (ch + ((val & 0x3E0) >> 5) & 0x1F) + 10; |
| break; |
| } |
| return retval; |
| } |
| |
| boolean isWhitespace(int ch) { |
| int props = getProperties(ch); |
| return ((props & 0x00007000) == 0x00004000); |
| } |
| |
| byte getDirectionality(int ch) { |
| int val = getProperties(ch); |
| byte directionality = (byte)((val & 0x78000000) >> 27); |
| |
| if (directionality == 0xF ) { |
| directionality = -1; |
| } |
| return directionality; |
| } |
| |
| boolean isMirrored(int ch) { |
| int props = getProperties(ch); |
| return ((props & 0x80000000) != 0); |
| } |
| |
| int toUpperCaseEx(int ch) { |
| int mapChar = ch; |
| int val = getProperties(ch); |
| |
| if ((val & 0x00010000) != 0) { |
| if ((val & 0x07FC0000) != 0x07FC0000) { |
| int offset = val << 5 >> (5+18); |
| mapChar = ch - offset; |
| } |
| else { |
| switch(ch) { |
| // map overflow characters |
| case 0x00B5 : mapChar = 0x039C; break; |
| default : mapChar = Character.ERROR; break; |
| } |
| } |
| } |
| return mapChar; |
| } |
| |
| static char[] sharpsMap = new char[] {'S', 'S'}; |
| |
| char[] toUpperCaseCharArray(int ch) { |
| char[] upperMap = {(char)ch}; |
| if (ch == 0x00DF) { |
| upperMap = sharpsMap; |
| } |
| return upperMap; |
| } |
| |
| static final CharacterDataLatin1 instance = new CharacterDataLatin1(); |
| private CharacterDataLatin1() {}; |
| |
| // The following tables and code generated using: |
| // java GenerateCharacter -template ../../tools/GenerateCharacter/CharacterDataLatin1.java.template -spec ../../tools/UnicodeData/UnicodeData.txt -specialcasing ../../tools/UnicodeData/SpecialCasing.txt -proplist ../../tools/UnicodeData/PropList.txt -o /usr/local/google/home/haaawk/ojluni/openjdk/build/linux-amd64/gensrc/java/lang/CharacterDataLatin1.java -string -usecharforbyte -latin1 8 |
| // The A table has 256 entries for a total of 1024 bytes. |
| |
| static final int A[] = new int[256]; |
| static final String A_DATA = |
| "\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800"+ |
| "\u100F\u4800\u100F\u4800\u100F\u5800\u400F\u5000\u400F\u5800\u400F\u6000\u400F"+ |
| "\u5000\u400F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800"+ |
| "\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F"+ |
| "\u4800\u100F\u4800\u100F\u5000\u400F\u5000\u400F\u5000\u400F\u5800\u400F\u6000"+ |
| "\u400C\u6800\030\u6800\030\u2800\030\u2800\u601A\u2800\030\u6800\030\u6800"+ |
| "\030\uE800\025\uE800\026\u6800\030\u2000\031\u3800\030\u2000\024\u3800\030"+ |
| "\u3800\030\u1800\u3609\u1800\u3609\u1800\u3609\u1800\u3609\u1800\u3609\u1800"+ |
| "\u3609\u1800\u3609\u1800\u3609\u1800\u3609\u1800\u3609\u3800\030\u6800\030"+ |
| "\uE800\031\u6800\031\uE800\031\u6800\030\u6800\030\202\u7FE1\202\u7FE1\202"+ |
| "\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1"+ |
| "\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202"+ |
| "\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1\202\u7FE1"+ |
| "\202\u7FE1\uE800\025\u6800\030\uE800\026\u6800\033\u6800\u5017\u6800\033\201"+ |
| "\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2"+ |
| "\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201"+ |
| "\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2\201\u7FE2"+ |
| "\201\u7FE2\201\u7FE2\201\u7FE2\uE800\025\u6800\031\uE800\026\u6800\031\u4800"+ |
| "\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u5000\u100F"+ |
| "\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800"+ |
| "\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F"+ |
| "\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800"+ |
| "\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F\u4800\u100F"+ |
| "\u3800\014\u6800\030\u2800\u601A\u2800\u601A\u2800\u601A\u2800\u601A\u6800"+ |
| "\034\u6800\034\u6800\033\u6800\034\000\u7002\uE800\035\u6800\031\u4800\u1010"+ |
| "\u6800\034\u6800\033\u2800\034\u2800\031\u1800\u060B\u1800\u060B\u6800\033"+ |
| "\u07FD\u7002\u6800\034\u6800\030\u6800\033\u1800\u050B\000\u7002\uE800\036"+ |
| "\u6800\u080B\u6800\u080B\u6800\u080B\u6800\030\202\u7001\202\u7001\202\u7001"+ |
| "\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202"+ |
| "\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001"+ |
| "\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\u6800\031\202\u7001\202"+ |
| "\u7001\202\u7001\202\u7001\202\u7001\202\u7001\202\u7001\u07FD\u7002\201\u7002"+ |
| "\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201"+ |
| "\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002"+ |
| "\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\u6800"+ |
| "\031\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002\201\u7002"+ |
| "\u061D\u7002"; |
| |
| // The B table has 256 entries for a total of 512 bytes. |
| |
| static final char B[] = ( |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"+ |
| "\000\000\000\000\000\000\000\000\000").toCharArray(); |
| |
| // In all, the character property tables require 1024 bytes. |
| |
| static { |
| { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter: |
| char[] data = A_DATA.toCharArray(); |
| assert (data.length == (256 * 2)); |
| int i = 0, j = 0; |
| while (i < (256 * 2)) { |
| int entry = data[i++] << 16; |
| A[j++] = entry | data[i++]; |
| } |
| } |
| |
| } |
| } |
| |