📄 phb_name_num_index.c
字号:
/*----------------------------------------------------------------*/
kal_trace(TRACE_FUNC, FUNC_PHB_NAME_NUM_INDEX_UPDATE);
ASSERT(name_num_index != NULL);
data_entry_pos = name_num_index->name_index.table[old_index].position;
data_entry = &name_num_index->data_entry_table.table[data_entry_pos];
if (name_num_index->num_index.slots > 0)
{
old_num_index = phb_name_num_index_find_index_by_num_sig_exact_match(
name_num_index,
data_entry->tel_num_sig,
data_entry->tel_num,
data_entry_pos);
new_index = phb_name_num_index_find_index_by_num_sig(name_num_index, signature, tel_num);
if (new_index == name_num_index->num_index.used_count || new_index > old_num_index) /* should exclude the old one */
{
--new_index;
}
if ((new_index = phb_pindex_update(
&name_num_index->num_index,
old_num_index,
new_index,
data_entry_pos)) == (kal_uint16) PHB_INVALID_VALUE)
{
return (kal_uint16) PHB_INVALID_VALUE;
}
}
new_index = phb_name_num_index_find_index_by_alpha_id_storage(name_num_index, alpha_id, data_entry->storage);
if (new_index == name_num_index->name_index.used_count)
{
--new_index;
}
else if (new_index > old_index)
{
new_index--;
}
if ((new_index = phb_pindex_update(
&name_num_index->name_index,
old_index,
new_index,
data_entry_pos)) == (kal_uint16) PHB_INVALID_VALUE)
{
return (kal_uint16) PHB_INVALID_VALUE;
}
data_entry_pos = name_num_index->name_index.table[new_index].position;
*old_ext_index = name_num_index->data_entry_table.table[data_entry_pos].ext_index;
phb_det_set(
&name_num_index->data_entry_table,
data_entry_pos,
alpha_id,
data_entry->storage,
data_entry->record_index,
signature,
tel_num,
ext_index);
return new_index;
} /* end of phb_name_num_index_update */
/*****************************************************************************
* FUNCTION
* phb_name_num_index_get_data_entry
* DESCRIPTION
* Returns the data-entry of the name_num_inex at `position'
* PARAMETERS
* name_num_index [IN] The name_num_index
* position [IN]
* RETURNS
* the data-entry
*****************************************************************************/
data_entry_struct *phb_name_num_index_get_data_entry(name_num_index_type *name_num_index, kal_uint16 position)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_FUNC, FUNC_PHB_NAME_NUM_INDEX_GET_DATA_ENTRY);
ASSERT(name_num_index != NULL);
return &name_num_index->data_entry_table.table[position];
}
/*****************************************************************************
* FUNCTION
* phb_name_num_index_delete
* DESCRIPTION
* Delete `index'th element of data-entry-table in name_num_index.
* The name_index and num_index are also re-ogranized.
* PARAMETERS
* name_num_index [IN] The name_num_index
* index [IN]
* ext_index [?]
* RETURNS
* KAL_TRUE if success, KAL_FALSE else.
*****************************************************************************/
kal_bool phb_name_num_index_delete(name_num_index_type *name_num_index, kal_uint16 index, kal_uint8 *ext_index)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint16 old_index, old_data_entry_pos;
data_entry_struct *old_data_entry;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_FUNC, FUNC_PHB_NAME_NUM_INDEX_DELETE);
ASSERT(name_num_index != NULL);
old_data_entry_pos = name_num_index->name_index.table[index].position;
old_data_entry = &name_num_index->data_entry_table.table[old_data_entry_pos];
old_index = phb_name_num_index_find_index_by_num_sig_exact_match(
name_num_index,
old_data_entry->tel_num_sig,
old_data_entry->tel_num,
old_data_entry_pos);
if (name_num_index->num_index.slots > 0)
{
phb_pindex_delete(&name_num_index->num_index, old_index);
}
phb_pindex_delete(&name_num_index->name_index, index);
*ext_index = old_data_entry->ext_index;
phb_det_delete(&name_num_index->data_entry_table, old_data_entry_pos);
/**
* Since certain entry is deleted from data_entry_table,
* `position''s stored in pindex are not synchronous.
* Reorganize is needed. *Sigh*
*/
if (name_num_index->num_index.slots > 0)
{
phb_pindex_relink(&name_num_index->num_index, old_data_entry_pos);
}
phb_pindex_relink(&name_num_index->name_index, old_data_entry_pos);
return KAL_TRUE;
} /* end of phb_pindex_delete */
/*****************************************************************************
* FUNCTION
* phb_name_num_index_find_index_by_alpha_id
* DESCRIPTION
* Search the index of name_num_index->name_index by alpha_id
* PARAMETERS
* name_num_index [?]
* alpha_id [?]
* RETURNS
* index to name_num_index->name_index
*****************************************************************************/
kal_uint16 phb_name_num_index_find_index_by_alpha_id(name_num_index_type *name_num_index, alpha_id_type *alpha_id)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint16 candidate;
compare_result_type result, result1; /* Wilson 2004-02-18 */
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_FUNC, FUNC_PHB_NAME_NUM_INDEX_FIND_INDEX_BY_ALPHA_ID);
ASSERT(name_num_index != NULL);
if (name_num_index->name_index.used_count == 0)
{
return (kal_uint16) PHB_INVALID_VALUE;
}
candidate = phb_binary_search(
name_num_index->name_index.table,
&name_num_index->data_entry_table,
name_num_index->name_index.used_count,
0,
(kal_uint16) (name_num_index->name_index.used_count - 1),
alpha_id,
(compare_func_type) phb_compare_by_alpha_id);
if (candidate < name_num_index->name_index.used_count)
{
phb_compare_by_alpha_id(
&name_num_index->data_entry_table,
alpha_id,
&name_num_index->name_index.table[candidate],
&result);
/* MTK Wilson 2004-02-18, Compare with next record to see if more match */
phb_compare_by_alpha_id(
&name_num_index->data_entry_table,
alpha_id,
&name_num_index->name_index.table[candidate + 1],
&result1);
/* if (result.distance > 0) */
if (result.distance > 0 || result1.same_count > result.same_count) /* Wilson 2004-05-16 */
{
return candidate + 1;
}
/* END MTK */
}
return candidate;
} /* end of phb_name_num_index_find_index_by_alpha_id */
/* MTK 2003-12-30 Wilson, For Exactly Match after PinYin Search */
/*****************************************************************************
* FUNCTION
* phb_name_num_index_after_find_index_by_alpha_id
* DESCRIPTION
* Use encoding to compare if two UCS2 string with the same PinYin spelling.
* PARAMETERS
* name_num_index [?]
* alpha_id [?]
* candidate [IN]
* RETURNS
* index to name_num_index->name_index
*****************************************************************************/
kal_uint16 phb_name_num_index_after_find_index_by_alpha_id(
name_num_index_type *name_num_index,
alpha_id_type *alpha_id,
kal_uint16 candidate)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
compare_result_type result, new_result, char_result, new_char_result;
kal_int16 new_candidate;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
ASSERT(name_num_index != NULL);
/* Count the same count and distance of the original candidate in PinYin string and Encoding String. */
if (candidate < name_num_index->name_index.used_count)
{
phb_compare_by_alpha_id(
&name_num_index->data_entry_table,
alpha_id,
&name_num_index->name_index.table[candidate],
&result);
if (!phb_compare_by_alpha_id_by_encoding(
&name_num_index->data_entry_table,
alpha_id,
&name_num_index->name_index.table[candidate],
&char_result))
{
char_result.same_count = 0; /* Not a UCS2 encoding */
}
}
/* Compare new candidate, if same count is larger or distance is smaller, replace with original candidate. */
new_candidate = candidate + 1;
while (new_candidate < name_num_index->name_index.used_count)
{
if (phb_compare_by_alpha_id_by_encoding(
&name_num_index->data_entry_table,
alpha_id,
&name_num_index->name_index.table[new_candidate],
&new_char_result))
{
phb_compare_by_alpha_id(
&name_num_index->data_entry_table,
alpha_id,
&name_num_index->name_index.table[new_candidate],
&new_result);
if (new_result.same_count != result.same_count)
{
break;
}
if (new_char_result.same_count > char_result.same_count)
{
candidate = new_candidate;
char_result.same_count = new_char_result.same_count;
char_result.distance = new_char_result.distance;
}
/*
* else if ((new_char_result.same_count == char_result.same_count) &&
* (abs(new_char_result.distance) < abs(char_result.distance)))
* {
* candidate = new_candidate;
* char_result.distance = new_char_result.distance;
* }
*/
}
new_candidate++;
}
return candidate;
} /* end of phb_name_num_index_find_index_by_alpha_id */
/* END MTK 2003-12-30 Wilson */
/*****************************************************************************
* FUNCTION
* phb_name_num_index_find_index_by_alpha_id_storage
* DESCRIPTION
* Search the index of name_num_index->name_index by alpha_id and storage
* PARAMETERS
* name_num_index [?]
* alpha_id [?]
* storage [IN]
* RETURNS
* index to name_num_index->name_index
*****************************************************************************/
kal_uint16 phb_name_num_index_find_index_by_alpha_id_storage(
name_num_index_type *name_num_index,
alpha_id_type *alpha_id,
phb_storage_enum storage)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
alpha_id_storage_type alpha_id_storage;
kal_uint16 candidate;
compare_result_type result;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_FUNC, FUNC_PHB_NAME_NUM_INDEX_FIND_INDEX_BY_ALPHA_ID_STORAGE);
ASSERT(name_num_index != NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -