82 lines
3.3 KiB
Java
82 lines
3.3 KiB
Java
/* GENERATED SOURCE. DO NOT MODIFY. */
|
|
// © 2016 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
/*
|
|
*******************************************************************************
|
|
* Copyright (C) 2012-2016, International Business Machines Corporation and
|
|
* others. All Rights Reserved.
|
|
*******************************************************************************
|
|
*/
|
|
|
|
package android.icu.impl.breakiter;
|
|
|
|
import java.io.IOException;
|
|
import java.nio.ByteBuffer;
|
|
|
|
import android.icu.impl.Assert;
|
|
import android.icu.impl.ICUBinary;
|
|
import android.icu.impl.ICUData;
|
|
import android.icu.impl.ICUResourceBundle;
|
|
import android.icu.util.UResourceBundle;
|
|
|
|
final class DictionaryData {
|
|
// disallow instantiation
|
|
private DictionaryData() { }
|
|
|
|
public static final int TRIE_TYPE_BYTES = 0;
|
|
public static final int TRIE_TYPE_UCHARS = 1;
|
|
public static final int TRIE_TYPE_MASK = 7;
|
|
public static final int TRIE_HAS_VALUES = 8;
|
|
public static final int TRANSFORM_NONE = 0;
|
|
public static final int TRANSFORM_TYPE_OFFSET = 0x1000000;
|
|
public static final int TRANSFORM_TYPE_MASK = 0x7f000000;
|
|
public static final int TRANSFORM_OFFSET_MASK = 0x1fffff;
|
|
|
|
public static final int IX_STRING_TRIE_OFFSET = 0;
|
|
public static final int IX_RESERVED1_OFFSET = 1;
|
|
public static final int IX_RESERVED2_OFFSET = 2;
|
|
public static final int IX_TOTAL_SIZE = 3;
|
|
public static final int IX_TRIE_TYPE = 4;
|
|
public static final int IX_TRANSFORM = 5;
|
|
public static final int IX_RESERVED6 = 6;
|
|
public static final int IX_RESERVED7 = 7;
|
|
public static final int IX_COUNT = 8;
|
|
|
|
private static final int DATA_FORMAT_ID = 0x44696374;
|
|
|
|
public static DictionaryMatcher loadDictionaryFor(String dictType) throws IOException {
|
|
ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_BRKITR_BASE_NAME);
|
|
String dictFileName = rb.getStringWithFallback("dictionaries/" + dictType);
|
|
dictFileName = ICUData.ICU_BRKITR_NAME + '/' + dictFileName;
|
|
ByteBuffer bytes = ICUBinary.getRequiredData(dictFileName);
|
|
ICUBinary.readHeader(bytes, DATA_FORMAT_ID, null);
|
|
int[] indexes = new int[IX_COUNT];
|
|
// TODO: read indexes[IX_STRING_TRIE_OFFSET] first, then read a variable-length indexes[]
|
|
for (int i = 0; i < IX_COUNT; i++) {
|
|
indexes[i] = bytes.getInt();
|
|
}
|
|
int offset = indexes[IX_STRING_TRIE_OFFSET];
|
|
Assert.assrt(offset >= (4 * IX_COUNT));
|
|
if (offset > (4 * IX_COUNT)) {
|
|
int diff = offset - (4 * IX_COUNT);
|
|
ICUBinary.skipBytes(bytes, diff);
|
|
}
|
|
int trieType = indexes[IX_TRIE_TYPE] & TRIE_TYPE_MASK;
|
|
int totalSize = indexes[IX_TOTAL_SIZE] - offset;
|
|
DictionaryMatcher m = null;
|
|
if (trieType == TRIE_TYPE_BYTES) {
|
|
int transform = indexes[IX_TRANSFORM];
|
|
byte[] data = new byte[totalSize];
|
|
bytes.get(data);
|
|
m = new BytesDictionaryMatcher(data, transform);
|
|
} else if (trieType == TRIE_TYPE_UCHARS) {
|
|
Assert.assrt(totalSize % 2 == 0);
|
|
String data = ICUBinary.getString(bytes, totalSize / 2, totalSize & 1);
|
|
m = new CharsDictionaryMatcher(data);
|
|
} else {
|
|
m = null;
|
|
}
|
|
return m;
|
|
}
|
|
}
|