/* ******************************************************************************* * * Copyright (C) 2004-2010, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* * 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 com.ibm.icu.impl; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import com.ibm.icu.lang.UCharacter; import com.ibm.icu.lang.UProperty; import com.ibm.icu.text.UnicodeSet; import com.ibm.icu.util.RangeValueIterator; public final class UBiDiProps { // constructors etc. --------------------------------------------------- *** // port of ubidi_openProps() private UBiDiProps() throws IOException{ InputStream is=ICUData.getStream(ICUResourceBundle.ICU_BUNDLE+"/"+DATA_FILE_NAME); BufferedInputStream b=new BufferedInputStream(is, 4096 /* data buffer size */); readData(b); b.close(); is.close(); } private UBiDiProps(boolean makeDummy) { // ignore makeDummy, only creates a unique signature indexes=new int[IX_TOP]; indexes[0]=IX_TOP; trie=new CharTrie(0, 0, null); // dummy trie, always returns 0 } private void readData(InputStream is) throws IOException { DataInputStream inputStream=new DataInputStream(is); // read the header ICUBinary.readHeader(inputStream, FMT, new IsAcceptable()); // read indexes[] int i, count; count=inputStream.readInt(); if(count0) { mirrors=new int[count]; for(i=0; i>MAX_JG_SHIFT; case UProperty.JOINING_TYPE: return (max&JT_MASK)>>JT_SHIFT; default: return -1; /* undefined */ } } public final int getClass(int c) { return getClassFromProps(trie.getCodePointValue(c)); } public final boolean isMirrored(int c) { return getFlagFromProps(trie.getCodePointValue(c), IS_MIRRORED_SHIFT); } public final int getMirror(int c) { int props; int delta; props=trie.getCodePointValue(c); delta=((short)props)>>MIRROR_DELTA_SHIFT; if(delta!=ESC_MIRROR_DELTA) { return c+delta; } else { /* look for mirror code point in the mirrors[] table */ int m; int i, length; int c2; length=indexes[IX_MIRROR_LENGTH]; /* linear search */ for(i=0; i>JT_SHIFT; } public final int getJoiningGroup(int c) { int start, limit; start=indexes[IX_JG_START]; limit=indexes[IX_JG_LIMIT]; if(start<=c && c>shift)&1)!=0; } private static final int ESC_MIRROR_DELTA=-4; //private static final int MIN_MIRROR_DELTA=-3; //private static final int MAX_MIRROR_DELTA=3; // definitions for 32-bit mirror table entry --------------------------- *** /* the source Unicode code point takes 21 bits (20..0) */ private static final int MIRROR_INDEX_SHIFT=21; //private static final int MAX_MIRROR_INDEX=0x7ff; private static final int getMirrorCodePoint(int m) { return m&0x1fffff; } private static final int getMirrorIndex(int m) { return m>>>MIRROR_INDEX_SHIFT; } /* * public singleton instance */ public static final UBiDiProps INSTANCE; private static volatile UBiDiProps FULL_INSTANCE; private static volatile UBiDiProps DUMMY_INSTANCE; // This static initializer block must be placed after // other static member initialization static { UBiDiProps bp; try { bp = new UBiDiProps(); FULL_INSTANCE = bp; } catch (IOException e) { // creating dummy bp = new UBiDiProps(true); DUMMY_INSTANCE = bp; } INSTANCE = bp; } }