in Squiggly/ane/MacFWHunspellANE/HunspellNativeExtension/HunspellNativeExtension.cpp [229:313]
FREObject getSuggestions(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
const uint8_t *locale = 0;
const uint8_t *inpWord = 0;
uint32_t len = -1;
FREObject retObj=0;
FREObject oneSuggestion=0;
U16Char_t* inpWordU16 = NULL;
std::string inpWordDictEncoded;
bool isConversionUnSuccesful=false;
char * oneSuggestionEncoded=NULL;
U16Char_t * oneSuggestionU16=NULL;
std::string oneSuggestionU8;
//assign memory to retobj
FRENewObject((const uint8_t*)"Array", 0, NULL, &retObj, 0);
//get first argument
if(FREGetObjectAsUTF8(argv[1], &len, &locale) != FRE_OK)
return retObj;
len = 0;
//get second argument
if(FREGetObjectAsUTF8(argv[0], &len, &inpWord) != FRE_OK)
return retObj;
//get the hunspell object from cache
Hunspell * hunspellObject=getHunspellObject(std::string((char *)locale));
if(!hunspellObject) return retObj;
//convert input utf8 to u16 string
inpWordU16 = EncConv::convCharStrToU16Str((char *)inpWord, "UTF-8");
//get dictionary encoding
HUNSPELL_GET_ENCODING getEncAdd=(HUNSPELL_GET_ENCODING) dlsym(hinstLib, "Hunspell_get_dic_encoding");
char * m_MainEncoding= (getEncAdd)(hunspellObject);
//convert u16 to dictionary encoding
inpWordDictEncoded=EncConv::convU16StrToCharStr(inpWordU16,m_MainEncoding);
if(inpWordDictEncoded.length()==0)
{
isConversionUnSuccesful = true;
}
//get suggestAddress &freelistAddress
HUNSPELL_SUGGEST suggestAdd= (HUNSPELL_SUGGEST) dlsym(hinstLib, "Hunspell_suggest");
HUNSPELL_FREE_LIST freeListAdd= (HUNSPELL_FREE_LIST) dlsym(hinstLib, "Hunspell_free_list");
char** suggList = NULL;
int numSugg = 0;
//Try getting suggestions with encoded word else try with UTF8
if(suggestAdd && !isConversionUnSuccesful)
{
numSugg = (suggestAdd)(hunspellObject,&suggList,(char *) (inpWordDictEncoded.c_str()));
}
else
{
numSugg = (suggestAdd)(hunspellObject,&suggList ,(char *) (inpWord));
}
if(numSugg)
{
FRESetArrayLength( retObj, numSugg );
for(int iCount=0; iCount <numSugg; iCount++)
{
oneSuggestionEncoded=suggList[iCount];
oneSuggestionU16=EncConv::convCharStrToU16Str(oneSuggestionEncoded, m_MainEncoding);
oneSuggestionU8= EncConv::convU16StrToCharStr(oneSuggestionU16, "UTF-8");
FRENewObjectFromUTF8((uint32_t)(oneSuggestionU8.length()),(const uint8_t*)(oneSuggestionU8.c_str()), &oneSuggestion);
FRESetArrayElementAt(retObj, iCount, oneSuggestion);
EncConv::releaseU16Str(oneSuggestionU16);
}
(freeListAdd)(hunspellObject, &suggList,numSugg);
}
EncConv::releaseU16Str(inpWordU16);
return retObj;
}