blob: 88b7b317d08a2e0123a2a2d65e36bb4cebccc6cb [file] [log] [blame]
/**
*******************************************************************************
* 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)});
}
}