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

Commit 75299654 authored by Jean Chalard's avatar Jean Chalard
Browse files

Add read support for string shortcuts for makedict.

Change-Id: I48ee4fc9ac703ad2a680b3cd848de91c415ea3c8
parent 3bbb31f3
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;