这年头好像继续做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 2015Auto-generated source. Don't change it manually.
Contact with hhao020@gmail.com for bug reporting and supporting.
*/#ifndef EXAMPLE_MAP
#define EXAMPLE_MAP#ifdef __cplusplusextern "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*/

View Code

/*
FILE: example_map.c
This file was created at Fri Dec 11 16:40:56 CST 2015Auto-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=0; i<nSize; i++){if(arr[i].e == e) return arr[i].name;}return 0;
}static int zName2Enum(char* name, zEnum2NameMap_t arr[], int nSize, int bAppro)
{int i;for(i=0; 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 -1;
}static int zEnumMapShow(zEnum2NameMap_t arr[], int nSize)
{int i;for(i=0; i<nSize; i++){printf("%3d %d-> %s \n", i, arr[i].e, arr[i].name);}return 0;
}
#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));
};

View Code

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。

转载于:https://www.cnblogs.com/hhao020/p/5044159.html

C代码工具--自动生成enum值和名字映射代码相关推荐

  1. 根据Word表格自动生成SQL数据库脚本的VBScript代码

    这是几年前写的根据Word表格自动生成SQL数据库脚本的VBScript代码,最近修改了下(原来只支持单个Word表格)使其支持一个Word文档中的多个表格,生成的SQL文件名以Word文件名+.SQ ...

  2. 【R语言】可视化:ggplot代码的自动生成

    [R语言]可视化:ggplot代码的自动生成 前言: 准备 1. 设置 Settings 2. 面板和背景 Panel & Backgroud 3. 坐标轴 Axis 4. 标题与标签 Tit ...

  3. Eclipse自动生成返回值对象与补全与加注释

    1.Eclipse自动生成返回值对象,将光标放在;后面按ctrl+1,弹出 Assign statement to new local varible,enter即可. 2.移动代码块快捷键:Alt+ ...

  4. 振弦采集模块配置工具VMTool生成寄存器值

    振弦采集模块配置工具VMTool生成寄存器值 生成寄存器值 VMXXX 有很多按位使用的寄存器, 使用 VMTool 工具可进行方便的设置,当需要知道寄存器的实际值时,可通过以下两种方法获取. (保持 ...

  5. 代码全部自动生成,程序员还有什么用?

    前端干着干着,就把自己干没了 ...... what? 刚看到这种言论的时候深深的为后端的我担心了以后会不会哪天后端的代码也自动生成了? 就事论事,我们今天就来分析一下程序员会不会干着干着,就把自己干 ...

  6. 解决IDEA中自动生成返回值带final修饰的问题

    解决IDEA中自动生成返回值带final修饰的问题 参考文章: (1)解决IDEA中自动生成返回值带final修饰的问题 (2)https://www.cnblogs.com/andrew-303/p ...

  7. Java代码实现自动生成产品标签图片(升级版)

    上次写过一次Java代码实现自动生成产品标签图片的案例,今天工作中又用到了,再来补充一下. 要求,生成的标签戴上logo标志,也就是加上图片:直接上代码: public static void cre ...

  8. 一个自动生成web和微服务项目代码工具sponge

    sponge 是一个快速生成web和微服务项目代码工具,也是一个基于gin和grpc封装的微服务框架.sponge拥有丰富的生成代码命令,一共生成12种不同功能代码,这些功能代码可以组合成完整的服务( ...

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

    若采用mybatis框架,数据库新建表,手动编写的话,需要编写大量的实体类.mapper文件.mapper.xml文件,都是一些重复且有规律的工作. 我们可以引用插件,然后做配置,自动生成这些文件,提 ...

最新文章

  1. 指纹锁就安全了?防火防盗还得防AI
  2. R语言glm拟合logistic回归模型实战:基于glm构建逻辑回归模型及模型系数统计显著性分析、每个预测因子对响应变量的贡献
  3. 标准浏览器的选择器封装
  4. react生命周期-新增与替换
  5. 8.7 程序示例--异常检测-机器学习笔记-斯坦福吴恩达教授
  6. struts2文件上传一个错误的解决
  7. 【NLP】深度学习文本分类|模型代码技巧
  8. 操作系统上机作业--根据莱布尼兹级数计算PI(2)(多线程)
  9. 赛程安排 单循环赛 matlab程序
  10. 用计算机求和公式,全国计算机一级等考excel之sum求和函数
  11. 青龙自动薅羊毛—【万年历】秒到
  12. 国内首台商用人形双足机器人发展史
  13. JavaScript学习(七)——对象与数组、内部对象(1)
  14. node版本管理工具nvm
  15. 修改jupyter Notebook默认保存路径
  16. 新攻击使黑客可以解密VoLTE加密以监视电话
  17. I2C验证的上拉电路逻辑问题
  18. UKF VS EKF
  19. mrctf2020_easy_equation
  20. 碳达峰、碳中和计算原理

热门文章

  1. zabbix报错cannot set resource limit: [13] Permission denied解决方法
  2. 解决IE、firefox浏览器下JS的new Date()的值为Invalid Date、NaN-NaN的问题
  3. ViewResult()和ActionResult()之间的区别
  4. 如何为iPhone 5屏幕分辨率开发或迁移应用程序?
  5. 如何清除/删除终端中的当前行?
  6. hdfs mv命令_Hadoop2.x HDFS shell命令
  7. SharedPreferences的使用,android
  8. Solr中的数据导入
  9. dataframe切片_Kaggle:识别淋巴结病理切片有无癌细胞(logistic+svm+rf+CNN)
  10. phpinfo 有imagick php artisan 没有_WordPress 上传图片时 async-upload.php出现520 Bug的原因及解决方案...