urc.c文件如下
/***************urc.c文件*********************/
//-------------------------------- URC table begin -------------------------------------------------
#define SECTION_START(name) name##$$Base
#define SECTION_END(name) name##$$Limit
#define AT_URC_TAB_START SECTION_START(at_urc_tab)
#define AT_URC_TAB_END SECTION_END(at_urc_tab)
extern const struct at_urc AT_URC_TAB_START;
extern const struct at_urc AT_URC_TAB_END;
const struct at_urc *get_urc_obj(const char *buffer, size_t bufsz)
{
size_t prefix_len, suffix_len;
const struct at_urc *urc;
for (urc = &AT_URC_TAB_START; urc < &AT_URC_TAB_END; urc++)
{
prefix_len = strlen(urc->cmd_prefix);
suffix_len = strlen(urc->cmd_suffix);
if (bufsz < prefix_len + suffix_len)
{
continue;
}
if ((prefix_len ? !strncmp(buffer, urc->cmd_prefix, prefix_len) : 1)
&& (suffix_len ? !strncmp(buffer + bufsz - suffix_len, urc->cmd_suffix, suffix_len) : 1))
{
return urc;
}
}
return NULL;
}
//-------------------------------- URC table end ---------------------------------------------------
urc.h文件如下
//-------------------------------- URC table begin -------------------------------------------------
typedef void *(*urc_func_t)(const char *data, size_t size);
struct at_urc
{
const char *cmd_prefix; // URC 数据前缀
const char *cmd_suffix; // URC 数据后缀
const urc_func_t func; // URC 数据执行函数
};
#define AT_URC_DEF(urc_prefix, urc_suffix, urc_func) static const struct at_urc __urc_tab_##urc_func __attribute__((section("at_urc_tab"), __aligned__(sizeof(char *)))) = {urc_prefix, urc_suffix, urc_func}
const struct at_urc *get_urc_obj(const char *buffer, size_t bufsz);
//-------------------------------- URC table end ---------------------------------------------------