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

Commit 6850ea0e authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Android (Google) Code Review
Browse files

Merge "Add boundary check for ver2 bigram reading." into lmp-dev

parents 036b83f4 3225b6fe
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ class DictionaryBigramsStructurePolicy {

    virtual void getNextBigram(int *const outBigramPos, int *const outProbability,
            bool *const outHasNext, int *const pos) const = 0;
    virtual void skipAllBigrams(int *const pos) const = 0;
    virtual bool skipAllBigrams(int *const pos) const = 0;

 protected:
    DictionaryBigramsStructurePolicy() {}
+2 −1
Original line number Diff line number Diff line
@@ -58,8 +58,9 @@ class Ver4BigramListPolicy : public DictionaryBigramsStructurePolicy {
    void getNextBigram(int *const outBigramPos, int *const outProbability,
            bool *const outHasNext, int *const bigramEntryPos) const;

    void skipAllBigrams(int *const pos) const {
    bool skipAllBigrams(int *const pos) const {
        // Do nothing because we don't need to skip bigram lists in ver4 dictionaries.
        return true;
    }

    bool addNewEntry(const int terminalId, const int newTargetTerminalId,
+15 −6
Original line number Diff line number Diff line
@@ -38,9 +38,14 @@ const BigramListReadWriteUtils::BigramFlags BigramListReadWriteUtils::FLAG_ATTRI
const BigramListReadWriteUtils::BigramFlags
        BigramListReadWriteUtils::MASK_ATTRIBUTE_PROBABILITY = 0x0F;

/* static */ void BigramListReadWriteUtils::getBigramEntryPropertiesAndAdvancePosition(
        const uint8_t *const bigramsBuf, BigramFlags *const outBigramFlags,
/* static */ bool BigramListReadWriteUtils::getBigramEntryPropertiesAndAdvancePosition(
        const uint8_t *const bigramsBuf, const int bufSize, BigramFlags *const outBigramFlags,
        int *const outTargetPtNodePos, int *const bigramEntryPos) {
    if (bufSize <= *bigramEntryPos) {
        AKLOGE("Read invalid pos in getBigramEntryPropertiesAndAdvancePosition(). bufSize: %d, "
                "bigramEntryPos: %d.", bufSize, *bigramEntryPos);
        return false;
    }
    const BigramFlags bigramFlags = ByteArrayUtils::readUint8AndAdvancePosition(bigramsBuf,
            bigramEntryPos);
    if (outBigramFlags) {
@@ -51,15 +56,19 @@ const BigramListReadWriteUtils::BigramFlags
    if (outTargetPtNodePos) {
        *outTargetPtNodePos = targetPos;
    }
    return true;
}

/* static */ void BigramListReadWriteUtils::skipExistingBigrams(const uint8_t *const bigramsBuf,
        int *const bigramListPos) {
/* static */ bool BigramListReadWriteUtils::skipExistingBigrams(const uint8_t *const bigramsBuf,
        const int bufSize, int *const bigramListPos) {
    BigramFlags flags;
    do {
        getBigramEntryPropertiesAndAdvancePosition(bigramsBuf, &flags, 0 /* outTargetPtNodePos */,
                bigramListPos);
        if (!getBigramEntryPropertiesAndAdvancePosition(bigramsBuf, bufSize, &flags,
                0 /* outTargetPtNodePos */, bigramListPos)) {
            return false;
        }
    } while(hasNext(flags));
    return true;
}

/* static */ int BigramListReadWriteUtils::getBigramAddressAndAdvancePosition(
+4 −3
Original line number Diff line number Diff line
@@ -30,8 +30,8 @@ class BigramListReadWriteUtils {
public:
   typedef uint8_t BigramFlags;

   static void getBigramEntryPropertiesAndAdvancePosition(const uint8_t *const bigramsBuf,
           BigramFlags *const outBigramFlags, int *const outTargetPtNodePos,
   static bool getBigramEntryPropertiesAndAdvancePosition(const uint8_t *const bigramsBuf,
           const int bufSize, BigramFlags *const outBigramFlags, int *const outTargetPtNodePos,
           int *const bigramEntryPos);

   static AK_FORCE_INLINE int getProbabilityFromFlags(const BigramFlags flags) {
@@ -43,7 +43,8 @@ public:
   }

   // Bigrams reading methods
   static void skipExistingBigrams(const uint8_t *const bigramsBuf, int *const bigramListPos);
   static bool skipExistingBigrams(const uint8_t *const bigramsBuf, const int bufSize,
           int *const bigramListPos);

private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(BigramListReadWriteUtils);
+12 −5
Original line number Diff line number Diff line
@@ -27,27 +27,34 @@ namespace latinime {

class BigramListPolicy : public DictionaryBigramsStructurePolicy {
 public:
    explicit BigramListPolicy(const uint8_t *const bigramsBuf) : mBigramsBuf(bigramsBuf) {}
    BigramListPolicy(const uint8_t *const bigramsBuf, const int bufSize)
            : mBigramsBuf(bigramsBuf), mBufSize(bufSize) {}

    ~BigramListPolicy() {}

    void getNextBigram(int *const outBigramPos, int *const outProbability, bool *const outHasNext,
            int *const pos) const {
        BigramListReadWriteUtils::BigramFlags flags;
        BigramListReadWriteUtils::getBigramEntryPropertiesAndAdvancePosition(mBigramsBuf, &flags,
                outBigramPos, pos);
        if (!BigramListReadWriteUtils::getBigramEntryPropertiesAndAdvancePosition(mBigramsBuf,
                mBufSize, &flags, outBigramPos, pos)) {
            AKLOGE("Cannot read bigram entry. mBufSize: %d, pos: %d. ", mBufSize, *pos);
            *outProbability = NOT_A_PROBABILITY;
            *outHasNext = false;
            return;
        }
        *outProbability = BigramListReadWriteUtils::getProbabilityFromFlags(flags);
        *outHasNext = BigramListReadWriteUtils::hasNext(flags);
    }

    void skipAllBigrams(int *const pos) const {
        BigramListReadWriteUtils::skipExistingBigrams(mBigramsBuf, pos);
    bool skipAllBigrams(int *const pos) const {
        return BigramListReadWriteUtils::skipExistingBigrams(mBigramsBuf, mBufSize, pos);
    }

 private:
    DISALLOW_IMPLICIT_CONSTRUCTORS(BigramListPolicy);

    const uint8_t *const mBigramsBuf;
    const int mBufSize;
};
} // namespace latinime
#endif // LATINIME_BIGRAM_LIST_POLICY_H
Loading