|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
/* |
|
******************************************************************************* |
|
* (C) Copyright IBM Corp. and others, 1996-2009 - All Rights Reserved * |
|
* * |
|
* The original version of this source code and documentation is copyrighted * |
|
* and owned by IBM, These materials are provided under terms of a License * |
|
* Agreement between IBM and Sun. This technology is protected by multiple * |
|
* US and International patents. This notice and attribution to IBM may not * |
|
* to removed. * |
|
******************************************************************************* |
|
* file name: UBiDiProps.java |
|
* encoding: US-ASCII |
|
* tab size: 8 (not used) |
|
* indentation:4 |
|
* |
|
* created on: 2005jan16 |
|
* created by: Markus W. Scherer |
|
* |
|
* Low-level Unicode bidi/shaping properties access. |
|
* Java port of ubidi_props.h/.c. |
|
*/ |
|
|
|
package sun.text.normalizer; |
|
|
|
import java.io.BufferedInputStream; |
|
import java.io.DataInputStream; |
|
import java.io.InputStream; |
|
import java.io.IOException; |
|
|
|
public final class UBiDiProps { |
|
// constructors etc. --------------------------------------------------- *** |
|
|
|
|
|
public UBiDiProps() throws IOException{ |
|
InputStream is=ICUData.getStream(DATA_FILE_NAME); |
|
BufferedInputStream b=new BufferedInputStream(is, 4096 /* data buffer size */); |
|
readData(b); |
|
b.close(); |
|
is.close(); |
|
|
|
} |
|
|
|
private void readData(InputStream is) throws IOException { |
|
DataInputStream inputStream=new DataInputStream(is); |
|
|
|
|
|
ICUBinary.readHeader(inputStream, FMT, new IsAcceptable()); |
|
|
|
|
|
int i, count; |
|
count=inputStream.readInt(); |
|
if(count<IX_INDEX_TOP) { |
|
throw new IOException("indexes[0] too small in "+DATA_FILE_NAME); |
|
} |
|
indexes=new int[count]; |
|
|
|
indexes[0]=count; |
|
for(i=1; i<count; ++i) { |
|
indexes[i]=inputStream.readInt(); |
|
} |
|
|
|
|
|
trie=new CharTrie(inputStream, null); |
|
|
|
|
|
count=indexes[IX_MIRROR_LENGTH]; |
|
if(count>0) { |
|
mirrors=new int[count]; |
|
for(i=0; i<count; ++i) { |
|
mirrors[i]=inputStream.readInt(); |
|
} |
|
} |
|
|
|
|
|
count=indexes[IX_JG_LIMIT]-indexes[IX_JG_START]; |
|
jgArray=new byte[count]; |
|
for(i=0; i<count; ++i) { |
|
jgArray[i]=inputStream.readByte(); |
|
} |
|
} |
|
|
|
|
|
private final class IsAcceptable implements ICUBinary.Authenticate { |
|
public boolean isDataVersionAcceptable(byte version[]) { |
|
return version[0]==1 && |
|
version[2]==Trie.INDEX_STAGE_1_SHIFT_ && version[3]==Trie.INDEX_STAGE_2_SHIFT_; |
|
} |
|
} |
|
|
|
|
|
private static UBiDiProps gBdp=null; |
|
|
|
|
|
public static final synchronized UBiDiProps getSingleton() throws IOException { |
|
if(gBdp==null) { |
|
gBdp=new UBiDiProps(); |
|
} |
|
return gBdp; |
|
} |
|
|
|
|
|
private static UBiDiProps gBdpDummy=null; |
|
|
|
private UBiDiProps(boolean makeDummy) { |
|
indexes=new int[IX_TOP]; |
|
indexes[0]=IX_TOP; |
|
trie=new CharTrie(0, 0, null); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static final synchronized UBiDiProps getDummy() { |
|
if(gBdpDummy==null) { |
|
gBdpDummy=new UBiDiProps(true); |
|
} |
|
return gBdpDummy; |
|
} |
|
|
|
public final int getClass(int c) { |
|
return getClassFromProps(trie.getCodePointValue(c)); |
|
} |
|
|
|
|
|
private int indexes[]; |
|
private int mirrors[]; |
|
private byte jgArray[]; |
|
|
|
private CharTrie trie; |
|
|
|
|
|
private static final String DATA_FILE_NAME = "/sun/text/resources/ubidi.icu"; |
|
|
|
|
|
private static final byte FMT[]={ 0x42, 0x69, 0x44, 0x69 }; |
|
|
|
|
|
private static final int IX_INDEX_TOP=0; |
|
private static final int IX_MIRROR_LENGTH=3; |
|
|
|
private static final int IX_JG_START=4; |
|
private static final int IX_JG_LIMIT=5; |
|
|
|
private static final int IX_TOP=16; |
|
|
|
private static final int CLASS_MASK= 0x0000001f; |
|
|
|
private static final int getClassFromProps(int props) { |
|
return props&CLASS_MASK; |
|
} |
|
|
|
} |