这年头好像继续做C语言的人不多了,年轻人大多去互联网和移动应用。确实,那两个领域现在来钱快,且总是供不应求。就说刚刚在一个旧同事的微信群里,有人刚放出自己有团队可以做App几分钟,哇塞,好几个人说有项目,要求加好友私聊。我也想过转行,可惜人老珠黄,没有互联网或是应用团队愿意接收。估计再过些年,C程序世界里就只有我这样的小老头们继续自娱自乐了,羡慕死年轻人了!

平常工作中,经常要做一些打印,或是日志。而这里面,enum类型的数据就很多,如果只是打印出它的整数值,显然会让测试人员很恼火,鬼知道那数字说的是什么。就算你给他个文档对着看,也丝毫不能得到原谅。最后,都得乖乖的把这个enum对应的名字打印出来才能平息。

今天说的这个,就是帮忙搞定这个转换问题的。

比如,有这么个example.h文件:

enum InfoStateE{
eInfoStateIdle,
eInfoStateIniting,
eInfoStateInited,
eInfoStateReady,
eInfoStateActive,
eInfoStateStandby,
eInfoStateRelease,
};

我们需要个函数,把enum值翻译成字符串;另外也要个函数,能查找字符串对应的enum值;可以提供名字的一部分。p_enum.pl就是做这个的,只需要执行:

perl p_enum.pl example.h -o:example_map
p_enum.pl接受目录,通配符,或是多个文件。-o:example_map是指定输出的文件名。这里我们得到了example_map.h和example_map.c两个文件:

/*
FILE: example_map.h
This file was created at Fri Dec 11 16:40:56 CST 2015 Auto-generated source. Don't change it manually.
Contact with hhao020@gmail.com for bug reporting and supporting.
*/ #ifndef EXAMPLE_MAP
#define EXAMPLE_MAP #ifdef __cplusplus
extern "C" {
#endif #include "zType_Def.h"
extern const char* InfoStateE2Name(dword_t e);
extern dword_t InfoStateE2Value(char* name, int bAppro);
extern int InfoStateEMapShow(); #ifdef __cplusplus
}
#endif #endif /*EXAMPLE_MAP*/
/*
FILE: example_map.c
This file was created at Fri Dec 11 16:40:56 CST 2015 Auto-generated source. Don't change it manually.
Contact with hhao020@gmail.com for bug reporting and supporting.
*/ #define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
#include <stdlib.h> #include "zAutoCodeApi.h"
#ifndef ENUM_PRIMARY_FUNCTIONS
static char *zEnum2Name(dword_t e, zEnum2NameMap_t arr[], int nSize)
{
int i; for(i=; i<nSize; i++)
{
if(arr[i].e == e) return arr[i].name;
} return ;
} static int zName2Enum(char* name, zEnum2NameMap_t arr[], int nSize, int bAppro)
{
int i; for(i=; i<nSize; i++)
{
if(bAppro)
{
if(strcasestr(arr[i].name, name)) return arr[i].e;
}
else
{
if(!strcmp(arr[i].name, name)) return arr[i].e;
}
} return -;
} static int zEnumMapShow(zEnum2NameMap_t arr[], int nSize)
{
int i;
for(i=; i<nSize; i++)
{
printf("%3d %d-> %s \n", i, arr[i].e, arr[i].name);
} return ;
}
#endif /*ENUM_PRIMARY_FUNCTIONS*/ #include "example_map.h" #include "example.h" zEnum2NameMap_t InfoStateE_map_t[]=
{
{eInfoStateIdle, "eInfoStateIdle"},
{eInfoStateIniting, "eInfoStateIniting"},
{eInfoStateInited, "eInfoStateInited"},
{eInfoStateReady, "eInfoStateReady"},
{eInfoStateActive, "eInfoStateActive"},
{eInfoStateStandby, "eInfoStateStandby"},
{eInfoStateRelease, "eInfoStateRelease"},
}; /*InfoStateE_map_t*/ const char* InfoStateE2Name(dword_t e)
{
char* pName = zEnum2Name(e, InfoStateE_map_t, TBL_SIZE(InfoStateE_map_t)); if(pName) return pName;
return "*NA*";
} dword_t InfoStateE2Value(char* name, int bAppro)
{
return zName2Enum(name, InfoStateE_map_t, TBL_SIZE(InfoStateE_map_t), bAppro);
}; int InfoStateEMapShow()
{
return zEnumMapShow(InfoStateE_map_t, TBL_SIZE(InfoStateE_map_t));
};

p_enum.pl是用了我自己做的lex和yacc库。本来是学习编译原理时的一些实验代码,后来发现它对于文本提取还是很强大,于是有了enum相关的自动生成工具。有兴趣的,可以参考,或者有问题留言。

嗯,还有一点,p_enum.pl不支持enum定义里包含编译控制宏。如果你有这个需求,需要自己修改enum.lex和enum.yacc文件来支持。我非常厌恶编译宏,因此不会做这个更新。

如何设置使用环境的补充说明:
linux环境,perl_zlib建议解压在你的home目录下。然后在你的用户配置文件.bashrc(或是.profile,不同linux略有差别)里面添加zlib的路径。我的配置里是这样的:
export PATH="$HOME/perl/Debug:$PATH"
export PERL5LIB="$HOME/perl/zLib:$HOME/perl5/lib/perl5"
PERL_MB_OPT="--install_base \"$HOME/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=$HOME/perl5"; export PERL_MM_OPT;
这当中只有PERL5LIB里的zLib路径是必须的。perl5是我用来装额外的perl库用的,一起贴出来供参考。

windows环境,需要先运行zlib.bat来设置环境变量,然后才能运行p_enum.pl。当然,你还要确认安装了activeperl。

C代码工具--自动生成enum值和名字映射代码的更多相关文章

  1. 使用mybatis-generator工具自动生成mybatis代码

    使用mybatis-generator工具自动生成mybatis代码 步骤如下: 1.引入maven  依赖,在项目pom.xml文件中添加 <plugin> <groupId> ...

  2. JAVA 自动生成对应数据库表的JPA代码工具

    http://blog.csdn.net/zheng2008hua/article/details/6274659 关键词:JPA 数据库表代码自动生成,JPA代码生成     自动生成对应数据库表的 ...

  3. mybatis-generator-core自动生成do、mapping、dao 代码

    使用mybatis配置映射文件,有点麻烦,容易出错,可以使用jar工具自动生成代码,即高效又方便 一.下载两个jar,并放置在G:\tool\maven\generator目录下(自己定义) myba ...

  4. 试试使用 eolinker 扫描 GitLab 代码注释自动生成 API 文档?

    前言: 一般写完代码之后,还要将各类参数注解写入API文档,方便后续进行对接和测试,这个过程通常都很麻烦,如果有工具可以读取代码注释直接生成API文档的话,那会十分方便. 此前一直都是在使用eolin ...

  5. Solr4.0 如何配置使用UUID自动生成id值

    原文链接http://blog.csdn.net/keepthinking_/article/details/8501058#comments 最近学习了Lucene,随便也学习了Solr,Solr规 ...

  6. 工具——代码中自动生成SVN版本号

    本节和大家讨论一下程序集版本最后一位使用SVN版本号的自动生成方法,这里就向大家简单介绍一下.在进行自动部署的时候,经常需要用脚本获取程序的最新版本号.现在我们定义每个程序集的版本信息的最末段表示SV ...

  7. java DMO及增删改查代码的自动生成

    在web开发过程中,尤其是后台管理系统的开发中,少不了增删改成的基础操作,原来我自己的做法是一份一份的拷贝粘贴,然后修改其中的不同,然而这样既枯燥无味又浪费了大量的时间,所以根据自己项目结构的特点写了 ...

  8. mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  9. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

随机推荐

  1. tp框架实现防止非法登录

    <?phpnamespace Admin\Controller;use Think\Controller;class UserController extends Controller {//登 ...

  2. Spring整合jdbc

    首先web.xml文件跟往常一样,加载spring容器和加载org.springframework.web.context.ContextLoaderListener读取applicationCont ...

  3. Unity使用Windows弹窗保存图片

    此功能都在类EditorUtility中(using UnityEditor;) 包括 OpenFilePanel打开文件窗口Displays the "open file" di ...

  4. KVO

    •基本概念 Key Value Observing, 键值观察者.它提供一种机制,当指定的对象的属性被修改后,则对象就会接收到通知. 与NSNotification不同,键值观察中并没有中心对象来为所 ...

  5. 无cookie下载Oracle otn上的sun jdk等软件

    从Oracle下载sun jdk提示:In order to download products from Oracle Technology Network you must agree to th ...

  6. 统计黑ip的脚本

    #!/bin/bash > ] do cd /var/openresty/nginx/logs#统计nginx日志,将结果重定向到文件blackip.txt中 cat access.log|gr ...

  7. js中的call与apply深入浅出

    首先明确call()与apply()最大的区别,除了名字不同以外,就是参数不一样,call的参数需要一一列出,apply的第二个及其以后的参数需要组成一个数组传进来. 这两个函数的调用者不是对象,而是 ...

  8. oracle启动脚本 .

        .#!/bin/bash set -x su -oracle >>EON lsnrctl start sqlplus /nolog >>EOF conn / as sy ...

  9. oracle java SE

    http://www.oracle.com/technetwork/java/javase/downloads/index.html

  10. CoreOS Hyper-V 安装

    CoreOS Hyper-V 安装, Install to disck 准备 安装镜像 https://coreos.com/releases/ 选择版本, 点 Browse Images, 下载以下 ...