C语言中的表驱动实例

2 篇文章 0 订阅
2 篇文章 0 订阅

最近在一个blog中看到说表驱动编程,想到在项目中也用到了很多关于表驱动的用法,就想记录下来。也好供其他未用过的朋友做个参考。


现在很多手机类终端,都有一些待机界面的暗码处理, 比如查看IMEI的暗码 *#06#

首先在 xino_argot.h 中进行类型定义

typedef BOOLEAN (* P_ARGOT_FUNC)(const char * argot, uint8 argot_len);

然后在 xino_argot.c文件中添加 函数表

//暗码处理函数列表
const P_ARGOT_FUNC g_argot_func[] =
{
    xino_Business_menu,  //维护菜单暗码处理

    xino_display_imei,       //查看IMEI   *#06#
    xino_assert,            //ASSERT
    PNULL
};


在 xino_argot.c文件中添加 函数实现如下

/**
 *
 *函数名称:xino_Business_menu
 *功能描述:暗码打开菜单
 *返回值:成功-TRUE 失败-FALSE
 *
 **/
BOOLEAN xino_Business_menu(const char * argot, uint8 argot_len)
{
    BOOLEAN b_invalid_argot = FALSE;

    if (0x00 == strcmp(argot, "*#1234567#"))
    {
        SCI_TRACE_LOW("\r\n>>>lcs >> argot = *#1234567#");
        
        XINO_CreateModifyLoginWin();   //打开维护菜单窗口
        
        b_invalid_argot = TRUE;
    }
    
    
    return b_invalid_argot;
}

/**
 *
 *函数名称:xino_assert
 *功能描述:ASSERT *#13328665749#
 *返回值:成功-TRUE 失败-FALSE
 *
 **/
BOOLEAN xino_assert(const char * argot, uint8 argot_len)
{
    BOOLEAN b_invalid_argot = FALSE;

    if (0x00 == strcmp(argot, "*#13328665749#"))
    {
        SCI_ASSERT(FALSE);

        b_invalid_argot = TRUE;
    }

    return b_invalid_argot;
}

/**
 *
 *函数名称:xino_display_imei
 *功能描述:查看imei码 *#06#
 *返回值:成功-TRUE 失败-FALSE
 * 创建  :  徐金鹏  20090814
 **/
BOOLEAN xino_display_imei(const char * argot, uint8 argot_len)
{
    BOOLEAN b_invalid_argot = FALSE;
        
    if (0x00 == strcmp(argot, "*#06#"))
    {
      
            show_IMEI();  // 显示本机 IMEI
                    
            b_invalid_argot = TRUE;
    }
        
        return b_invalid_argot;
}


下面接口是查找函数表 看输入的暗码是否在函数表中 如果在,进行处理并退出,如果不在, 继续后面的查找,直到找到的函数返回null

/**
 *
 *函数名称:xino_argot_entry
 *功能描述:暗码解析入口
 *返回值:成功-TRUE 失败-FALSE
 *
 **/
BOOLEAN xino_argot_entry(const char * argot, uint8 argot_len)
{
    STR_NUM m_argot_str;
    BOOLEAN b_invalid_argot = FALSE;
    uint8 func_index = 0x00;

    if (argot_len > 40)//MMIDIAL_PHONENUM_LEN 40
    {
        return FALSE;
    }

    memcpy(m_argot_str.num, argot, argot_len);

    m_argot_str.num[argot_len] = 0x00;
    m_argot_str.len = argot_len;

    while(PNULL != g_argot_func[func_index])
    {
        if((g_argot_func[func_index])(m_argot_str.num, m_argot_str.len) == TRUE)
        {
            b_invalid_argot = TRUE;

            break;
        }

        func_index++;
    }

    return b_invalid_argot;
}


调用示例

//维护菜单 暗码入口
                if(xino_argot_entry((const char * )(str_info.str_ptr), str_info.str_len))
                {
                    return ;
                }

其中 str_info.str_ptr 为输入的内容 比如 ×#06#  str_info.str_len 为输入内容的长度 本例为 5


这样操作的好处在于

如果新增一个 查看IMSI的 暗码 ×#07#  那么可以在表g_argot_func中添加   xino_display_imsi,       //查看IMSI   *#07#  一项

然后写xino_display_imsi 的实现

BOOLEAN xino_display_imsi(const char * argot, uint8 argot_len)
{
    BOOLEAN b_invalid_argot = FALSE;
        
    if (0x00 == strcmp(argot, "*#07#"))
    {
      
            show_IMSI();  // 显示本机 IMSI
                    
            b_invalid_argot = TRUE;
    }
        
        return b_invalid_argot;
}


到此即新增了暗码*#07# 暗码的功能, 非常方便以后的功能扩展。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值