/** ******************************************************************************* * Copyright (C) 1996-2001, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* * * $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/UCD/UnifiedBinaryProperty.java,v $ * $Date: 2004/02/18 03:09:01 $ * $Revision: 1.17 $ * ******************************************************************************* */ package com.ibm.text.UCD; import java.io.*; import java.util.*; import com.ibm.text.utility.*; import com.ibm.icu.text.UnicodeSet; public final class UnifiedBinaryProperty extends UCDProperty { int majorProp; int propValue; // DerivedProperty dp; public static UCDProperty make(int propMask) { return make(propMask, Default.ucd()); } public static UCDProperty make(int propMask, UCD ucd) { if ((propMask & 0xFF00) == DERIVED) { return DerivedProperty.make(propMask & 0xFF, ucd); } if (!isDefined(propMask, ucd)) return null; return getCached(propMask, ucd); } public static UCDProperty make(String propAndValue, UCD ucd) { return make(getPropmask(propAndValue, ucd), ucd); } public static UnicodeSet getSet(int propMask, UCD ucd) { UCDProperty up = make(propMask, ucd); return up.getSet(); } public static UnicodeSet getSet(String propAndValue, UCD ucd) { return getSet(getPropmask(propAndValue, ucd), ucd); } private static Map propNameCache = null; public static int getPropmask(String propAndValue, UCD ucd) { // cache the names if (propNameCache == null) { System.out.println("Caching Property Names"); propNameCache = new HashMap(); for (int i = 0; i < LIMIT_ENUM; ++i) { UCDProperty up = UnifiedBinaryProperty.make(i, ucd); if (up == null) continue; if (!up.isStandard()) continue; if (up.getValueType() < BINARY_PROP) continue; String shortValue = Utility.getSkeleton(up.getValue(SHORT)); String shortName = Utility.getSkeleton(up.getPropertyName(SHORT)); String longValue = Utility.getSkeleton(up.getValue(LONG)); String longName = Utility.getSkeleton(up.getPropertyName(LONG)); Integer result = new Integer(i); propNameCache.put(longName + "=" + longValue, result); propNameCache.put(longName + "=" + shortValue, result); propNameCache.put(shortName + "=" + longValue, result); propNameCache.put(shortName + "=" + shortValue, result); } System.out.println("Done Caching"); } propAndValue = Utility.getSkeleton(propAndValue); Integer indexObj = (Integer) propNameCache.get(propAndValue); if (indexObj == null) { throw new IllegalArgumentException("No property found for " + propAndValue); } return indexObj.intValue(); } static Map cache = new HashMap(); static UCD lastUCD = null; static int lastPropMask = -1; static UnifiedBinaryProperty lastValue = null; static Clump probeClump = new Clump(); static class Clump { int prop; UCD ucd; public boolean equals(Object other) { Clump that = (Clump) other; return (that.prop != prop || !ucd.equals(that)); } } private static UnifiedBinaryProperty getCached(int propMask, UCD ucd) { if (ucd.equals(lastUCD) && propMask == lastPropMask) return lastValue; probeClump.prop = propMask; probeClump.ucd = ucd; UnifiedBinaryProperty dp = (UnifiedBinaryProperty) cache.get(probeClump); if (dp == null) { dp = new UnifiedBinaryProperty(propMask, ucd); cache.put(probeClump, dp); probeClump = new Clump(); } lastUCD = ucd; lastValue = dp; lastPropMask = propMask; return dp; } ///////////////////////////////// private UnifiedBinaryProperty(int propMask, UCD ucdin) { ucd = ucdin; majorProp = propMask >> 8; propValue = propMask & 0xFF; //System.out.println("A: " + getValueType()); if (majorProp <= (JOINING_GROUP>>8) || majorProp == (SCRIPT>>8) || majorProp==(HANGUL_SYLLABLE_TYPE>>8)) { setValueType(FLATTENED_BINARY_PROP); } //System.out.println("B: " + getValueType()); header = UCD_Names.UNIFIED_PROPERTY_HEADERS[majorProp]; name = UCD_Names.UNIFIED_PROPERTIES[majorProp]; shortName = UCD_Names.SHORT_UNIFIED_PROPERTIES[majorProp]; valueName = _getValue(LONG); shortValueName = _getValue(SHORT); numberValueName = _getValue(NUMBER); defaultValueStyle = _getDefaultStyle(); if (majorProp == (BINARY_PROPERTIES>>8)) { name = ucd.getBinaryPropertiesID_fromIndex((byte)propValue, LONG); shortName = ucd.getBinaryPropertiesID_fromIndex((byte)propValue, SHORT); defaultPropertyStyle = defaultValueStyle; valueName = "True"; shortValueName = "T"; } // System.out.println("Value = " + getValue(defaultValueStyle)); // System.out.println(majorProp + ", " + propValue + ", " + name); // dp = new DerivedProperty(ucd); } /* public boolean isTest(int propMask) { int enum = propMask >> 8; propMask &= 0xFF; if (enum != (DERIVED>>8)) return false; return DerivedProperty.make(propMask, ucd).isTest(); } */ /** * @return unified property number */ /* public boolean isDefined(int propMask) { int enum = propMask >> 8; propMask &= 0xFF; switch (enum) { case CATEGORY>>8: return propMask != UNUSED_CATEGORY && propMask < LIMIT_CATEGORY; case COMBINING_CLASS>>8: return true; // ucd.isCombiningClassUsed((byte)propMask) // || !ucd.getCombiningID_fromIndex ((byte)propMask, SHORT).startsWith("Fixed"); case BIDI_CLASS>>8: return propMask != BIDI_UNUSED && propMask < LIMIT_BIDI_CLASS; case DECOMPOSITION_TYPE>>8: return propMask < LIMIT_DECOMPOSITION_TYPE; case NUMERIC_TYPE>>8: return propMask < LIMIT_NUMERIC_TYPE; case EAST_ASIAN_WIDTH>>8: return propMask < LIMIT_EAST_ASIAN_WIDTH; case LINE_BREAK>>8: return propMask < LIMIT_LINE_BREAK; case JOINING_TYPE>>8: return propMask < LIMIT_JOINING_TYPE; case JOINING_GROUP>>8: return propMask < LIMIT_JOINING_GROUP; case BINARY_PROPERTIES>>8: return propMask < LIMIT_BINARY_PROPERTIES; case SCRIPT>>8: return propMask != UNUSED_SCRIPT && propMask < LIMIT_SCRIPT; case AGE>>8: return propMask < LIMIT_AGE; case DERIVED>>8: UnicodeProperty up = DerivedProperty.make(propMask, ucd); return (up != null); default: return false; } } */ static private boolean isDefined(int propMask, UCD ucd) { int majorProp = propMask >> 8; int propValue = propMask & 0xFF; switch (majorProp) { case CATEGORY>>8: if (propValue >= LIMIT_CATEGORY) break; if (propValue == UNUSED_CATEGORY) break; return true; case COMBINING_CLASS>>8: if (propValue >= LIMIT_COMBINING_CLASS) break; return ucd.isCombiningClassUsed((byte)propValue); case BIDI_CLASS>>8: if (propValue >= LIMIT_BIDI_CLASS) break; if (propValue == BIDI_UNUSED) break; return true; case DECOMPOSITION_TYPE>>8: if (propValue >= LIMIT_DECOMPOSITION_TYPE) break; return true; case NUMERIC_TYPE>>8: if (propValue >= LIMIT_NUMERIC_TYPE) break; return true; case EAST_ASIAN_WIDTH>>8: if (propValue >= LIMIT_EAST_ASIAN_WIDTH) break; return true; case LINE_BREAK>>8: if (propValue >= LIMIT_LINE_BREAK) break; return true; case JOINING_TYPE>>8: if (propValue >= LIMIT_JOINING_TYPE) break; return true; case JOINING_GROUP>>8: if (propValue >= LIMIT_JOINING_GROUP) break; return true; case BINARY_PROPERTIES>>8: if (propValue >= LIMIT_BINARY_PROPERTIES) break; return true; case SCRIPT>>8: if (propValue >= LIMIT_SCRIPT) break; if (propValue == UNUSED_SCRIPT) break; return true; case AGE>>8: if (propValue >= LIMIT_AGE) break; return true; case HANGUL_SYLLABLE_TYPE>>8: if (propValue >= HANGUL_SYLLABLE_TYPE_LIMIT) break; return true; /* case DERIVED>>8: UnicodeProperty up = DerivedProperty.make(propValue, ucd); if (up == null) break; return up.hasValue(cp); */ } return false; } public boolean skipInDerivedListing() { switch ((majorProp<<8) | propValue) { //case CATEGORY | Cn: //case COMBINING_CLASS | 0: //case BIDI_CLASS | BIDI_L: case DECOMPOSITION_TYPE | NONE: case NUMERIC_TYPE | NUMERIC_NONE: // case EAST_ASIAN_WIDTH | EAN: // case LINE_BREAK | LB_XX: case JOINING_TYPE | JT_U: case JOINING_GROUP | NO_SHAPING: case SCRIPT | COMMON_SCRIPT: case HANGUL_SYLLABLE_TYPE | NA: case BINARY_PROPERTIES | Non_break: case BINARY_PROPERTIES | CaseFoldTurkishI: return true; } return false; } public boolean isDefaultValue() { switch (majorProp) { case CATEGORY>>8: return propValue == Cn; case COMBINING_CLASS>>8: return propValue == 0; case BIDI_CLASS>>8: return propValue == BIDI_L; case DECOMPOSITION_TYPE>>8: return propValue == NONE; case NUMERIC_TYPE>>8: return propValue == NUMERIC_NONE; case EAST_ASIAN_WIDTH>>8: return propValue == EAN; case LINE_BREAK>>8: return propValue == LB_XX; case JOINING_TYPE>>8: return propValue == JT_U; case JOINING_GROUP>>8: return propValue == NO_SHAPING; case SCRIPT>>8: return propValue == COMMON_SCRIPT; case HANGUL_SYLLABLE_TYPE>>8: return propValue == NA; } return false; } public boolean hasValue(int cp) { try { switch (majorProp) { case CATEGORY>>8: return ucd.getCategory(cp) == propValue; case COMBINING_CLASS>>8: return ucd.getCombiningClass(cp) == propValue; case BIDI_CLASS>>8: return ucd.getBidiClass(cp) == propValue; case DECOMPOSITION_TYPE>>8: return ucd.getDecompositionType(cp) == propValue; case NUMERIC_TYPE>>8: return ucd.getNumericType(cp) == propValue; case EAST_ASIAN_WIDTH>>8: return ucd.getEastAsianWidth(cp) == propValue; case LINE_BREAK>>8: return ucd.getLineBreak(cp) == propValue; case JOINING_TYPE>>8: return ucd.getJoiningType(cp) == propValue; case JOINING_GROUP>>8: return ucd.getJoiningGroup(cp) == propValue; case BINARY_PROPERTIES>>8: return ucd.getBinaryProperty(cp, propValue); case SCRIPT>>8: return ucd.getScript(cp) == propValue; case AGE>>8: return ucd.getAge(cp) == propValue; case HANGUL_SYLLABLE_TYPE>>8: return ucd.getHangulSyllableType(cp) == propValue; // return true; /* case DERIVED>>8: UnicodeProperty up = DerivedProperty.make(propValue, ucd); if (up == null) break; return up.hasValue(cp); */ } throw new ChainException("Illegal property Number {0}, {1}", new Object[]{ new Integer(majorProp), new Integer(propValue)}); } catch (RuntimeException e) { throw new ChainException("Illegal property Number {0}, {1}", new Object[]{ new Integer(majorProp), new Integer(propValue)}, e); } } /* public static String getID(UCD ucd, int unifiedPropMask) { String longOne = getID(ucd, unifiedPropMask, LONG); String shortOne = getID(ucd, unifiedPropMask, SHORT); if (longOne.equals(shortOne)) return longOne; return shortOne + "(" + longOne + ")"; } */ public String getFullName(byte style) { String pre = ""; /*if ((majorProp) != BINARY_PROPERTIES>>8)*/ { String preShort = getPropertyName(SHORT) + "="; String preLong = getPropertyName(LONG) + "="; if (style < LONG) pre = preShort; else if (style == LONG || preShort.equals(preLong)) pre = preLong; else pre = preShort + "(" + preLong + ")"; } String shortOne = getValue(SHORT); if (shortOne.length() == 0) shortOne = "xx"; String longOne = getValue(LONG); if (majorProp == (SCRIPT>>8)) { longOne = Default.ucd().getCase(longOne, FULL, TITLE); } if (longOne.length() == 0) longOne = "none"; String post; if (style < LONG) post = shortOne; else if (style == LONG || shortOne.equals(longOne)) post = longOne; else post = shortOne + "(" + longOne + ")"; if (pre.length() == 0) { pre = post + "="; post = "T"; } return pre + post; } public String _getValue(byte style) { try { switch (majorProp) { case CATEGORY>>8: return ucd.getCategoryID_fromIndex((byte)propValue, style); case COMBINING_CLASS>>8: return ucd.getCombiningClassID_fromIndex((byte)propValue, style); case BIDI_CLASS>>8: return ucd.getBidiClassID_fromIndex((byte)propValue, style); case DECOMPOSITION_TYPE>>8: return ucd.getDecompositionTypeID_fromIndex((byte)propValue, style); case NUMERIC_TYPE>>8: return ucd.getNumericTypeID_fromIndex((byte)propValue, style); case EAST_ASIAN_WIDTH>>8: return ucd.getEastAsianWidthID_fromIndex((byte)propValue, style); case LINE_BREAK>>8: return ucd.getLineBreakID_fromIndex((byte)propValue, style); case JOINING_TYPE>>8: return ucd.getJoiningTypeID_fromIndex((byte)propValue, style); case JOINING_GROUP>>8: return ucd.getJoiningGroupID_fromIndex((byte)propValue, style); case BINARY_PROPERTIES>>8: return ucd.getBinaryPropertiesID_fromIndex((byte)propValue, style); case SCRIPT>>8: return ucd.getScriptID_fromIndex((byte)propValue, style); case AGE>>8: return ucd.getAgeID_fromIndex((byte)propValue); case HANGUL_SYLLABLE_TYPE>>8: return ucd.getHangulSyllableTypeID_fromIndex((byte)propValue, style); /* case DERIVED>>8: UnicodeProperty up = DerivedProperty.make(propValue, ucd); if (up == null) break; return up.getName(style); */ } } catch (RuntimeException e) { throw new ChainException("Illegal property Number* {0}, {1}", new Object[]{ new Integer(majorProp), new Integer(propValue)}, e); } throw new ChainException("Illegal property Number {0}, {1}", new Object[]{ new Integer(majorProp), new Integer(propValue)}); } public byte _getDefaultStyle() { try { switch (majorProp) { case CATEGORY>>8: return SHORT; case COMBINING_CLASS>>8: return NUMBER; case BIDI_CLASS>>8: return SHORT; case DECOMPOSITION_TYPE>>8: return LONG; case NUMERIC_TYPE>>8: return LONG; case EAST_ASIAN_WIDTH>>8: return SHORT; case LINE_BREAK>>8: return SHORT; case JOINING_TYPE>>8: return SHORT; case JOINING_GROUP>>8: return LONG; case BINARY_PROPERTIES>>8: return LONG; case SCRIPT>>8: return LONG; case AGE>>8: return LONG; case HANGUL_SYLLABLE_TYPE>>8: return SHORT; } } catch (RuntimeException e) { throw new ChainException("Illegal property Number {0}, {1}", new Object[]{ new Integer(majorProp), new Integer(propValue)}, e); } throw new ChainException("Illegal property Number {0}, {1}", new Object[]{ new Integer(majorProp), new Integer(propValue)}); } }