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

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

Merge "Add read support for string shortcuts for makedict."

parents 7b49efde 75299654
Loading
Loading
Loading
Loading
+22 −33
Original line number Diff line number Diff line
@@ -268,6 +268,19 @@ public class BinaryDictInputOutput {
            return index - origin;
        }

        /**
         * Reads a string from a RandomAccessFile. This is the converse of the above method.
         */
        private static String readString(final RandomAccessFile source) throws IOException {
            final StringBuilder s = new StringBuilder();
            int character = readChar(source);
            while (character != INVALID_CHARACTER) {
                s.appendCodePoint(character);
                character = readChar(source);
            }
            return s.toString();
        }

        /**
         * Reads a character from the file.
         *
@@ -995,36 +1008,19 @@ public class BinaryDictInputOutput {
            childrenAddress = NO_CHILDREN_ADDRESS;
            break;
        }
        ArrayList<PendingAttribute> shortcutTargets = null;
        ArrayList<WeightedString> shortcutTargets = null;
        if (0 != (flags & FLAG_HAS_SHORTCUT_TARGETS)) {
            shortcutTargets = new ArrayList<PendingAttribute>();
            final long pointerBefore = source.getFilePointer();
            shortcutTargets = new ArrayList<WeightedString>();
            source.readUnsignedShort(); // Skip the size
            while (true) {
                final int targetFlags = source.readUnsignedByte();
                ++addressPointer;
                final int sign = 0 == (targetFlags & FLAG_ATTRIBUTE_OFFSET_NEGATIVE) ? 1 : -1;
                int targetAddress = addressPointer;
                switch (targetFlags & MASK_ATTRIBUTE_ADDRESS_TYPE) {
                case FLAG_ATTRIBUTE_ADDRESS_TYPE_ONEBYTE:
                    targetAddress += sign * source.readUnsignedByte();
                    addressPointer += 1;
                    break;
                case FLAG_ATTRIBUTE_ADDRESS_TYPE_TWOBYTES:
                    targetAddress += sign * source.readUnsignedShort();
                    addressPointer += 2;
                    break;
                case FLAG_ATTRIBUTE_ADDRESS_TYPE_THREEBYTES:
                    final int offset = ((source.readUnsignedByte() << 16)
                            + source.readUnsignedShort());
                    targetAddress += sign * offset;
                    addressPointer += 3;
                    break;
                default:
                    throw new RuntimeException("Has shortcut targets with no address");
                }
                shortcutTargets.add(new PendingAttribute(targetFlags & FLAG_ATTRIBUTE_FREQUENCY,
                        targetAddress));
                final String word = CharEncoding.readString(source);
                shortcutTargets.add(new WeightedString(word,
                        targetFlags & FLAG_ATTRIBUTE_FREQUENCY));
                if (0 == (targetFlags & FLAG_ATTRIBUTE_HAS_NEXT)) break;
            }
            addressPointer += (source.getFilePointer() - pointerBefore);
        }
        ArrayList<PendingAttribute> bigrams = null;
        if (0 != (flags & FLAG_HAS_BIGRAMS)) {
@@ -1149,14 +1145,7 @@ public class BinaryDictInputOutput {
        int groupOffset = nodeOrigin + getGroupCountSize(count);
        for (int i = count; i > 0; --i) {
            CharGroupInfo info = readCharGroup(source, groupOffset);
            ArrayList<WeightedString> shortcutTargets = null;
            if (null != info.mShortcutTargets) {
                shortcutTargets = new ArrayList<WeightedString>();
                for (PendingAttribute target : info.mShortcutTargets) {
                    final String word = getWordAtAddress(source, headerSize, target.mAddress);
                    shortcutTargets.add(new WeightedString(word, target.mFrequency));
                }
            }
            ArrayList<WeightedString> shortcutTargets = info.mShortcutTargets;
            ArrayList<WeightedString> bigrams = null;
            if (null != info.mBigrams) {
                bigrams = new ArrayList<WeightedString>();
+4 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.inputmethod.latin.makedict;

import com.android.inputmethod.latin.makedict.FusionDictionary.WeightedString;

import java.util.ArrayList;

/**
@@ -29,12 +31,12 @@ public class CharGroupInfo {
    public final int[] mCharacters;
    public final int mFrequency;
    public final int mChildrenAddress;
    public final ArrayList<PendingAttribute> mShortcutTargets;
    public final ArrayList<WeightedString> mShortcutTargets;
    public final ArrayList<PendingAttribute> mBigrams;

    public CharGroupInfo(final int originalAddress, final int endAddress, final int flags,
            final int[] characters, final int frequency, final int childrenAddress,
            final ArrayList<PendingAttribute> shortcutTargets,
            final ArrayList<WeightedString> shortcutTargets,
            final ArrayList<PendingAttribute> bigrams) {
        mOriginalAddress = originalAddress;
        mEndAddress = endAddress;