am d9a68f9d: am 35ffb906: Merge "Make getTerminalPosition read linked-list nodes." into jb-mr1-dev
* commit 'd9a68f9d8f244b0d93696a1ea809ed702fc4d11d': Make getTerminalPosition read linked-list nodes.main
commit
aaac69e999
|
@ -157,47 +157,63 @@ public class BinaryDictIOUtils {
|
||||||
final int wordLen = word.codePointCount(0, word.length());
|
final int wordLen = word.codePointCount(0, word.length());
|
||||||
for (int depth = 0; depth < Constants.Dictionary.MAX_WORD_LENGTH; ++depth) {
|
for (int depth = 0; depth < Constants.Dictionary.MAX_WORD_LENGTH; ++depth) {
|
||||||
if (wordPos >= wordLen) return FormatSpec.NOT_VALID_WORD;
|
if (wordPos >= wordLen) return FormatSpec.NOT_VALID_WORD;
|
||||||
int groupOffset = buffer.position() - header.mHeaderSize;
|
|
||||||
final int charGroupCount = BinaryDictInputOutput.readCharGroupCount(buffer);
|
|
||||||
groupOffset += BinaryDictInputOutput.getGroupCountSize(charGroupCount);
|
|
||||||
|
|
||||||
for (int i = 0; i < charGroupCount; ++i) {
|
do {
|
||||||
final int charGroupPos = buffer.position();
|
int groupOffset = buffer.position() - header.mHeaderSize;
|
||||||
final CharGroupInfo currentInfo = BinaryDictInputOutput.readCharGroup(buffer,
|
final int charGroupCount = BinaryDictInputOutput.readCharGroupCount(buffer);
|
||||||
buffer.position(), header.mFormatOptions);
|
groupOffset += BinaryDictInputOutput.getGroupCountSize(charGroupCount);
|
||||||
boolean same = true;
|
|
||||||
for (int p = 0, j = word.offsetByCodePoints(0, wordPos);
|
|
||||||
p < currentInfo.mCharacters.length;
|
|
||||||
++p, j = word.offsetByCodePoints(j, 1)) {
|
|
||||||
if (wordPos + p >= wordLen
|
|
||||||
|| word.codePointAt(j) != currentInfo.mCharacters[p]) {
|
|
||||||
same = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (same) {
|
boolean foundNextCharGroup = false;
|
||||||
if (wordPos + currentInfo.mCharacters.length == wordLen) {
|
for (int i = 0; i < charGroupCount; ++i) {
|
||||||
if (currentInfo.mFrequency == CharGroup.NOT_A_TERMINAL) {
|
final int charGroupPos = buffer.position();
|
||||||
return FormatSpec.NOT_VALID_WORD;
|
final CharGroupInfo currentInfo = BinaryDictInputOutput.readCharGroup(buffer,
|
||||||
} else {
|
buffer.position(), header.mFormatOptions);
|
||||||
return charGroupPos;
|
boolean same = true;
|
||||||
|
for (int p = 0, j = word.offsetByCodePoints(0, wordPos);
|
||||||
|
p < currentInfo.mCharacters.length;
|
||||||
|
++p, j = word.offsetByCodePoints(j, 1)) {
|
||||||
|
if (wordPos + p >= wordLen
|
||||||
|
|| word.codePointAt(j) != currentInfo.mCharacters[p]) {
|
||||||
|
same = false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wordPos += currentInfo.mCharacters.length;
|
|
||||||
if (currentInfo.mChildrenAddress == FormatSpec.NO_CHILDREN_ADDRESS) {
|
|
||||||
return FormatSpec.NOT_VALID_WORD;
|
|
||||||
}
|
|
||||||
buffer.position(currentInfo.mChildrenAddress);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
groupOffset = currentInfo.mEndAddress;
|
|
||||||
|
|
||||||
// not found
|
if (same) {
|
||||||
if (i >= charGroupCount - 1) {
|
// found the group matches the word.
|
||||||
|
if (wordPos + currentInfo.mCharacters.length == wordLen) {
|
||||||
|
if (currentInfo.mFrequency == CharGroup.NOT_A_TERMINAL) {
|
||||||
|
return FormatSpec.NOT_VALID_WORD;
|
||||||
|
} else {
|
||||||
|
return charGroupPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wordPos += currentInfo.mCharacters.length;
|
||||||
|
if (currentInfo.mChildrenAddress == FormatSpec.NO_CHILDREN_ADDRESS) {
|
||||||
|
return FormatSpec.NOT_VALID_WORD;
|
||||||
|
}
|
||||||
|
foundNextCharGroup = true;
|
||||||
|
buffer.position(currentInfo.mChildrenAddress);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
groupOffset = currentInfo.mEndAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we found the next char group, it is under the file pointer.
|
||||||
|
// But if not, we are at the end of this node so we expect to have
|
||||||
|
// a forward link address that we need to consult and possibly resume
|
||||||
|
// search on the next node in the linked list.
|
||||||
|
if (foundNextCharGroup) break;
|
||||||
|
if (!header.mFormatOptions.mSupportsDynamicUpdate) {
|
||||||
return FormatSpec.NOT_VALID_WORD;
|
return FormatSpec.NOT_VALID_WORD;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
final int forwardLinkAddress = buffer.readUnsignedInt24();
|
||||||
|
if (forwardLinkAddress == FormatSpec.NO_FORWARD_LINK_ADDRESS) {
|
||||||
|
return FormatSpec.NOT_VALID_WORD;
|
||||||
|
}
|
||||||
|
buffer.position(forwardLinkAddress);
|
||||||
|
} while(true);
|
||||||
}
|
}
|
||||||
return FormatSpec.NOT_VALID_WORD;
|
return FormatSpec.NOT_VALID_WORD;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue