⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phb_name_num_index.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    /*----------------------------------------------------------------*/
    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 + -