Improve partial matches
This commit is contained in:
parent
da6c46cba9
commit
db0579b7a0
|
@ -931,6 +931,35 @@ stardict_dict_search (StardictDict *sd, const gchar *word, gboolean *success)
|
||||||
|
|
||||||
BINARY_SEARCH_END
|
BINARY_SEARCH_END
|
||||||
|
|
||||||
|
// Try to find a longer common prefix with a preceding entry
|
||||||
|
#define PREFIX(i) stardict_longest_common_collation_prefix \
|
||||||
|
(sd, word, g_array_index (index, StardictIndexEntry, i).name)
|
||||||
|
|
||||||
|
if (sd->priv->collator)
|
||||||
|
{
|
||||||
|
GArray *collated = sd->priv->collated_index;
|
||||||
|
size_t probe, best = PREFIX (g_array_index (collated, guint32, imin));
|
||||||
|
while (imin > 0 && (probe =
|
||||||
|
PREFIX (g_array_index (collated, guint32, imin - 1))) >= best)
|
||||||
|
{
|
||||||
|
best = probe;
|
||||||
|
imin--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// XXX: only looking for _better_ backward matches here, since the
|
||||||
|
// fallback common prefix searching algorithm doesn't ignore case
|
||||||
|
size_t probe, best = PREFIX (imin);
|
||||||
|
while (imin > 0 && (probe = PREFIX (imin - 1)) > best)
|
||||||
|
{
|
||||||
|
best = probe;
|
||||||
|
imin--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef PREFIX
|
||||||
|
|
||||||
if (success) *success = FALSE;
|
if (success) *success = FALSE;
|
||||||
return stardict_iterator_new (sd, imin);
|
return stardict_iterator_new (sd, imin);
|
||||||
}
|
}
|
||||||
|
@ -985,7 +1014,7 @@ stardict_longest_common_collation_prefix (StardictDict *sd,
|
||||||
if (!ucol_strcoll (sd->priv->collator, uc1, pos1, uc2, pos2))
|
if (!ucol_strcoll (sd->priv->collator, uc1, pos1, uc2, pos2))
|
||||||
longest = pos1;
|
longest = pos1;
|
||||||
}
|
}
|
||||||
// I'd need a new collator, so just do the minimal working thing
|
// XXX: I'd need a new collator, so just do the minimal working thing
|
||||||
else if (pos1 == pos2 && !memcmp (uc1, uc2, pos1 * sizeof *uc1))
|
else if (pos1 == pos2 && !memcmp (uc1, uc2, pos1 * sizeof *uc1))
|
||||||
longest = pos1;
|
longest = pos1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue