diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2021-10-06 20:08:48 +0200 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2021-10-06 20:14:49 +0200 |
commit | 690402f2e18e9a944b77147de4b3a678cca6d162 (patch) | |
tree | 88e15d7a830b6755bbc2990bde910548d56108d2 | |
parent | 03f2123447b1a5537db1cdde016eb87eb2d2371f (diff) | |
download | tdv-690402f2e18e9a944b77147de4b3a678cca6d162.tar.gz tdv-690402f2e18e9a944b77147de4b3a678cca6d162.tar.xz tdv-690402f2e18e9a944b77147de4b3a678cca6d162.zip |
Unbreak stardict_dict_get_synonyms()
Untested, but certainly broken six ways to Sunday before.
-rw-r--r-- | src/stardict.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/stardict.c b/src/stardict.c index 2d49aad..a757590 100644 --- a/src/stardict.c +++ b/src/stardict.c @@ -867,11 +867,12 @@ stardict_dict_cmp_synonym (StardictDict *sd, const gchar *word, gint i) g_array_index (synonyms, StardictSynonymEntry, i).word); } -/// Return words for which the argument is a synonym of or NULL +/// Return words of which the argument is a synonym or NULL /// if there are no such words. gchar ** stardict_dict_get_synonyms (StardictDict *sd, const gchar *word) { + GArray *collated = sd->priv->collated_synonyms; GArray *synonyms = sd->priv->synonyms; GArray *index = sd->priv->index; @@ -879,26 +880,32 @@ stardict_dict_get_synonyms (StardictDict *sd, const gchar *word) stardict_dict_cmp_synonym (sd, word, imid)) // Back off to the first matching entry - while (imid > 0 && !stardict_dict_cmp_synonym (sd, word, --imid)) - ; + while (imid > 0 && !stardict_dict_cmp_synonym (sd, word, imid - 1)) + imid--; GPtrArray *array = g_ptr_array_new (); // And add all matching entries from that position on to the array do { - guint32 i = g_array_index - (synonyms, StardictSynonymEntry, ++imid).original_word; + guint32 i = sd->priv->collator + ? g_array_index (synonyms, StardictSynonymEntry, + g_array_index (collated, guint32, imid)).original_word + : g_array_index (synonyms, StardictSynonymEntry, + imid).original_word; + // When we use a collator this will point to the original entry, // otherwise it points to itself and this changes nothing - i = g_array_index - (sd->priv->index, StardictIndexEntry, i).reverse_index; - g_ptr_array_add (array, g_strdup (g_array_index - (index, StardictIndexEntry, i).name)); + i = g_array_index (sd->priv->index, StardictIndexEntry, + i).reverse_index; + + g_ptr_array_add (array, + g_strdup (g_array_index (index, StardictIndexEntry, i).name)); } - while ((guint) imid < synonyms->len - 1 && !stardict_strcmp (word, - g_array_index (synonyms, StardictSynonymEntry, imid + 1).word)); + while ((guint) ++imid < synonyms->len + && !stardict_dict_cmp_synonym (sd, word, imid)); + g_ptr_array_add (array, NULL); return (gchar **) g_ptr_array_free (array, FALSE); BINARY_SEARCH_END |