< prev index next >
jdk/src/java.base/share/classes/sun/text/normalizer/UBiDiProps.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2005, 2009, 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
--- 1,7 ----
/*
! * Copyright (c) 2005, 2015, 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
*** 22,179 ****
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
*******************************************************************************
! * (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. --------------------------------------------------- ***
// port of ubidi_openProps()
! 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);
!
// read the header
! ICUBinary.readHeader(inputStream, FMT, new IsAcceptable());
// read indexes[]
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();
}
// read the trie
! trie=new CharTrie(inputStream, null);
// read mirrors[]
count=indexes[IX_MIRROR_LENGTH];
if(count>0) {
mirrors=new int[count];
for(i=0; i<count; ++i) {
! mirrors[i]=inputStream.readInt();
}
}
// read jgArray[]
count=indexes[IX_JG_LIMIT]-indexes[IX_JG_START];
jgArray=new byte[count];
for(i=0; i<count; ++i) {
! jgArray[i]=inputStream.readByte();
}
}
// implement ICUBinary.Authenticate
! 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_;
}
}
! // UBiDiProps singleton
! private static UBiDiProps gBdp=null;
! // port of ubidi_getSingleton()
! public static final synchronized UBiDiProps getSingleton() throws IOException {
! if(gBdp==null) {
! gBdp=new UBiDiProps();
}
- return gBdp;
}
! // UBiDiProps dummy singleton
! private static UBiDiProps gBdpDummy=null;
! 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
}
! /**
! * Get a singleton dummy object, one that works with no real data.
! * This can be used when the real data is not available.
! * Using the dummy can reduce checks for available data after an initial failure.
! * Port of ucase_getDummy().
! */
! 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));
}
// data members -------------------------------------------------------- ***
private int indexes[];
private int mirrors[];
private byte jgArray[];
! private CharTrie trie;
// data format constants ----------------------------------------------- ***
private static final String DATA_FILE_NAME = "/sun/text/resources/ubidi.icu";
/* format "BiDi" */
! private static final byte FMT[]={ 0x42, 0x69, 0x44, 0x69 };
/* indexes into indexes[] */
! 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;
}
}
--- 22,267 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
*******************************************************************************
! *
! * Copyright (C) 2004-2014, 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 sun.text.normalizer;
import java.io.IOException;
+ import java.nio.ByteBuffer;
+ import java.util.MissingResourceException;
public final class UBiDiProps {
// constructors etc. --------------------------------------------------- ***
// port of ubidi_openProps()
! private UBiDiProps() throws IOException{
! ByteBuffer bytes=ICUBinary.getRequiredData(DATA_FILE_NAME);
! readData(bytes);
}
! private void readData(ByteBuffer bytes) throws IOException {
// read the header
! ICUBinary.readHeader(bytes, FMT, new IsAcceptable());
// read indexes[]
int i, count;
! count=bytes.getInt();
! if(count<IX_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]=bytes.getInt();
}
// read the trie
! trie=Trie2_16.createFromSerialized(bytes);
! int expectedTrieLength=indexes[IX_TRIE_SIZE];
! int trieLength=trie.getSerializedLength();
! if(trieLength>expectedTrieLength) {
! throw new IOException(DATA_FILE_NAME+": not enough bytes for the trie");
! }
! // skip padding after trie bytes
! ICUBinary.skipBytes(bytes, expectedTrieLength-trieLength);
// read mirrors[]
count=indexes[IX_MIRROR_LENGTH];
if(count>0) {
mirrors=new int[count];
for(i=0; i<count; ++i) {
! mirrors[i]=bytes.getInt();
}
}
// read jgArray[]
count=indexes[IX_JG_LIMIT]-indexes[IX_JG_START];
jgArray=new byte[count];
for(i=0; i<count; ++i) {
! jgArray[i]=bytes.get();
! }
!
! // read jgArray2[]
! count=indexes[IX_JG_LIMIT2]-indexes[IX_JG_START2];
! jgArray2=new byte[count];
! for(i=0; i<count; ++i) {
! jgArray2[i]=bytes.get();
}
}
// implement ICUBinary.Authenticate
! private final static class IsAcceptable implements ICUBinary.Authenticate {
public boolean isDataVersionAcceptable(byte version[]) {
! return version[0]==2;
}
}
! // property access functions ------------------------------------------- ***
! public final int getClass(int c) {
! return getClassFromProps(trie.get(c));
! }
!
! private final int getMirror(int c, int props) {
! int delta=getMirrorDeltaFromProps(props);
! 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<length; ++i) {
! m=mirrors[i];
! c2=getMirrorCodePoint(m);
! if(c==c2) {
! /* found c, return its mirror code point using the index in m */
! return getMirrorCodePoint(mirrors[getMirrorIndex(m)]);
! } else if(c<c2) {
! break;
}
}
! /* c not found, return it itself */
! return c;
! }
! }
! public final int getMirror(int c) {
! int props=trie.get(c);
! return getMirror(c, props);
}
! public final int getJoiningType(int c) {
! return (trie.get(c)&JT_MASK)>>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<limit) {
! return (int)jgArray[c-start]&0xff;
}
! start=indexes[IX_JG_START2];
! limit=indexes[IX_JG_LIMIT2];
! if(start<=c && c<limit) {
! return (int)jgArray2[c-start]&0xff;
! }
! return UCharacter.JoiningGroup.NO_JOINING_GROUP;
}
! public final int getPairedBracketType(int c) {
! return (trie.get(c)&BPT_MASK)>>BPT_SHIFT;
! }
!
! public final int getPairedBracket(int c) {
! int props=trie.get(c);
! if((props&BPT_MASK)==0) {
! return c;
! } else {
! return getMirror(c, props);
! }
}
// data members -------------------------------------------------------- ***
private int indexes[];
private int mirrors[];
private byte jgArray[];
+ private byte jgArray2[];
! private Trie2_16 trie;
// data format constants ----------------------------------------------- ***
private static final String DATA_FILE_NAME = "/sun/text/resources/ubidi.icu";
/* format "BiDi" */
! private static final int FMT=0x42694469;
/* indexes into indexes[] */
! private static final int IX_TRIE_SIZE=2;
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_JG_START2=6; /* new in format version 2.2, ICU 54 */
+ private static final int IX_JG_LIMIT2=7;
private static final int IX_TOP=16;
+ // definitions for 16-bit bidi/shaping properties word ----------------- ***
+
+ /* CLASS_SHIFT=0, */ /* bidi class: 5 bits (4..0) */
+ private static final int JT_SHIFT=5; /* joining type: 3 bits (7..5) */
+
+ private static final int BPT_SHIFT=8; /* Bidi_Paired_Bracket_Type(bpt): 2 bits (9..8) */
+
+ private static final int MIRROR_DELTA_SHIFT=13; /* bidi mirroring delta: 3 bits (15..13) */
+
private static final int CLASS_MASK= 0x0000001f;
+ private static final int JT_MASK= 0x000000e0;
+ private static final int BPT_MASK= 0x00000300;
private static final int getClassFromProps(int props) {
return props&CLASS_MASK;
}
+ private static final boolean getFlagFromProps(int props, int shift) {
+ return ((props>>shift)&1)!=0;
+ }
+ private static final int getMirrorDeltaFromProps(int props) {
+ return (short)props>>MIRROR_DELTA_SHIFT;
+ }
+ private static final int ESC_MIRROR_DELTA=-4;
+
+ // 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 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;
+
+ // This static initializer block must be placed after
+ // other static member initialization
+ static {
+ try {
+ INSTANCE = new UBiDiProps();
+ } catch (IOException e) {
+ throw new MissingResourceException(e.getMessage(),DATA_FILE_NAME,"");
+ }
+ }
}
< prev index next >