使用awk命令将C/C++ 宏定义转换为Java定义
项目中Hal 层的头文件的宏定义数字需要被上层应用的Java使用到,这个为了避免手动的复制粘贴,在编译时就使用awk 命令转换为Java 文件
使用的命令如下
awk 'BEGIN{print("package com.xxx.xxx\n\n" "class MyHeader{")}/#define/&&$3~/[0-9]/ {print("\tpublic static int ", $2 " = ", $3, ";")} END{print("\}//end")}' my_cmd.h > MyHeader.java
说明下这个文件为什么这么写
BEGIN{action}
在读取文件之前,首先执行的动作,注意该模式只执行一次,上述命令BEGIN 模式命令为
BEGIN{print("package com.xxx.xxx\n\n" "class MyHeader{")}
生成格式为
package com.xxx.xxx
class MyHeader{
END{action}
读完文件之后,最后执行的动作,注意该模式只执行一次,上述命令END 模式命令为
END{print("\}//end")}
生成格式为
}//end
pattern{action}
当目前读取的行符合pattern后,执行大括号里的动作,如果使用正则的话模式为
/regular pattern/{action}
当目前读取的行匹配该正则表达模式,则执行大括号里的action
compound pattern { action}
一个复合模式将表达式用 &&(AND), ||(OR), !(NOT), 以及括号组合起来; 当 compound pattern 为真时, 执行大括号里的action
上述命令使用了 compound pattern 模式
/#define/&&$3~/[0-9]/ {print("\tpublic static int ", $2 " = ", $3, ";")}
/#define/ 为匹配C 文件中的 #define 的匹配行
$3~/[0-9]/ 为使用了正则表达式,匹配第三列中的包含0-9数字所在的行
同时使用了 && ,用来判断这是一个宏定义的数字类型
输出格式 \t 为tab, 声明 public static int 类型,$2 变量名, $3 变量值
这里的pattern 输出为
public static int SYSTEM = 0001 ;
public static int SOURCE = 0x0002 ;
public static int VERSION = 0x0003 ;
public static int SN = 0x0004 ;
需要说明的的上述获取宏定义数字中的判断不一定正确,按照上述的判断 #define BUG “bug123” 这个就会被pattern 识别到了, 具体可以根据自己的情况修改
网友评论