@ -64,12 +64,15 @@
namespace
{
uint32_t create_checksum_index ( const std : : vector < std : : string > & word_list ,
uint32_t unique_prefix_length ) ;
bool checksum_test ( std : : vector < std : : string > seed , uint32_t unique_prefix_length ) ;
/*!
* \ brief Finds the word list that contains the seed words and puts the indices
* where matches occured in matched_indices .
* \ param seed List of words to match .
* \ param has_checksum If word list passed checksum test , we need to only do a prefix check .
* \ param has_checksum The seed has a checksum word ( maybe not checked ) .
* \ param matched_indices The indices where the seed words were found are added to this .
* \ param language Language instance pointer to write to after it is found .
* \ return true if all the words were present in some language false if not .
@ -88,6 +91,7 @@ namespace
Language : : Singleton < Language : : Russian > : : instance ( ) ,
Language : : Singleton < Language : : OldEnglish > : : instance ( )
} ) ;
Language : : Base * fallback = NULL ;
// Iterate through all the languages and find a match
for ( std : : vector < Language : : Base * > : : iterator it1 = language_instances . begin ( ) ;
@ -125,6 +129,17 @@ namespace
}
}
if ( full_match )
{
// if we were using prefix only, and we have a checksum, check it now
// to avoid false positives due to prefix set being too common
if ( has_checksum )
if ( ! checksum_test ( seed , ( * it1 ) - > get_unique_prefix_length ( ) ) )
{
fallback = * it1 ;
full_match = false ;
}
}
if ( full_match )
{
* language = * it1 ;
return true ;
@ -132,6 +147,16 @@ namespace
// Some didn't match. Clear the index array.
matched_indices . clear ( ) ;
}
// if we get there, we've not found a good match, but we might have a fallback,
// if we detected a match which did not fit the checksum, which might be a badly
// typed/transcribed seed in the right language
if ( fallback )
{
* language = fallback ;
return true ;
}
return false ;
}