179 lines · 6.1 KB · Java
RawDownload
/* * 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 * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * 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;    } }