Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35ffb906 authored by Jean Chalard's avatar Jean Chalard Committed by Android (Google) Code Review
Browse files

Merge "Make getTerminalPosition read linked-list nodes." into jb-mr1-dev

parents 630d9c95 93d7c623
Loading
Loading
Loading
Loading
+48 −32
Original line number Diff line number Diff line
@@ -157,10 +157,13 @@ public class BinaryDictIOUtils {
        final int wordLen = word.codePointCount(0, word.length());
        for (int depth = 0; depth < Constants.Dictionary.MAX_WORD_LENGTH; ++depth) {
            if (wordPos >= wordLen) return FormatSpec.NOT_VALID_WORD;

            do {
                int groupOffset = buffer.position() - header.mHeaderSize;
                final int charGroupCount = BinaryDictInputOutput.readCharGroupCount(buffer);
                groupOffset += BinaryDictInputOutput.getGroupCountSize(charGroupCount);

                boolean foundNextCharGroup = false;
                for (int i = 0; i < charGroupCount; ++i) {
                    final int charGroupPos = buffer.position();
                    final CharGroupInfo currentInfo = BinaryDictInputOutput.readCharGroup(buffer,
@@ -177,6 +180,7 @@ public class BinaryDictIOUtils {
                    }

                    if (same) {
                        // found the group matches the word.
                        if (wordPos + currentInfo.mCharacters.length == wordLen) {
                            if (currentInfo.mFrequency == CharGroup.NOT_A_TERMINAL) {
                                return FormatSpec.NOT_VALID_WORD;
@@ -188,16 +192,28 @@ public class BinaryDictIOUtils {
                        if (currentInfo.mChildrenAddress == FormatSpec.NO_CHILDREN_ADDRESS) {
                            return FormatSpec.NOT_VALID_WORD;
                        }
                        foundNextCharGroup = true;
                        buffer.position(currentInfo.mChildrenAddress);
                        break;
                    }
                    groupOffset = currentInfo.mEndAddress;
                }

                // not found
                if (i >= charGroupCount - 1) {
                // 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;
                }

                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;
    }