void UserRemovePhrase( ChewingData *pgdata, const uint16_t phoneSeq[], const char wordSeq[] ) { HASH_ITEM **prev = NULL; HASH_ITEM *item = NULL; assert( pgdata ); assert( phoneSeq ); assert( wordSeq ); prev = HashFindHead( pgdata, phoneSeq ); item = *prev; while ( item ) { if ( strcmp( item->data.wordSeq, wordSeq ) == 0 ) { /* Remove this phrase by removing */ item->data.phoneSeq[0] = 0; item->data.wordSeq[0] = 0; HashModify( pgdata, item ); *prev = item->next; FreeHashItem( item ); return; } prev = &item->next; item = item->next; } }
int UserUpdatePhrase( ChewingData *pgdata, const uint16_t phoneSeq[], const char wordSeq[] ) { HASH_ITEM *pItem; UserPhraseData data; int len; len = ueStrLen( wordSeq ); pItem = HashFindEntry( pgdata, phoneSeq, wordSeq ); if ( ! pItem ) { if ( ! AlcUserPhraseSeq( &data, len, strlen( wordSeq ) ) ) { return USER_UPDATE_FAIL; } memcpy( data.phoneSeq, phoneSeq, len * sizeof( phoneSeq[ 0 ] ) ); data.phoneSeq[ len ] = 0; strcpy( data.wordSeq, wordSeq ); /* load initial freq */ data.origfreq = LoadOriginalFreq( pgdata, phoneSeq, wordSeq, len ); data.maxfreq = LoadMaxFreq( pgdata, phoneSeq, len ); data.userfreq = data.origfreq; data.recentTime = pgdata->static_data.chewing_lifetime; pItem = HashInsert( pgdata, &data ); LogUserPhrase( pgdata, phoneSeq, wordSeq, pItem->data.origfreq, pItem->data.maxfreq, pItem->data.userfreq, pItem->data.recentTime ); HashModify( pgdata, pItem ); return USER_UPDATE_INSERT; } else { pItem->data.maxfreq = LoadMaxFreq( pgdata, phoneSeq, len ); pItem->data.userfreq = UpdateFreq( pItem->data.userfreq, pItem->data.maxfreq, pItem->data.origfreq, pgdata->static_data.chewing_lifetime - pItem->data.recentTime ); pItem->data.recentTime = pgdata->static_data.chewing_lifetime; LogUserPhrase( pgdata, phoneSeq, wordSeq, pItem->data.origfreq, pItem->data.maxfreq, pItem->data.userfreq, pItem->data.recentTime ); HashModify( pgdata, pItem ); return USER_UPDATE_MODIFY; } }