幻想小说网 酷文学 深夜书屋 叮当小说网 找小说网 无限小说网 红尘小说网

一个用bash(awk)写的代码产生器

一个用bash(awk)写的代码产生器

 

转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

作者联系方式:Li XianJing <xianjimli at hotmail dot com>

更新时间:2007-1-3

 

在所有脚本语言中,我对bash情有独钟。原因是它简单易用,即使很久没有用过了,看看帮助马上就可以想起来。另外,它作为shell,自然对其它应用程序有较好的亲和力,特别是与find/grep/sed/awk等小工具组合起来,威力更是非同小可。

 

今天用bash写了一个代码产生器,类似的手法我至少用过数十次了,其简单但很实用,放在这里供新手参考吧。

 

需求简述:在http://www.iana.org/assignments/character-sets文档中,描述了各种charset的名称和ID。我需要从charset的名称查询到它的ID,或者从charsetID查询到它的名称。

 

文档正文部分的格式类似于:

Name: BOCU-1                                                   [Scherer]

MIBenum: 1020

Source: http://www.unicode.org/notes/tn6/

Alias: csBOCU-1

 

Name: UTF-8                                                    [RFC3629]

MIBenum: 106

Source: RFC 3629

Alias: None

 

从容易看出,我们只要把Name后面的内容和MIBenum后面的内容对应起来,生成一张表就行了,然后通过查表来完成ID和名称之间的转换。为了便于引用ID,我们还要定义一组枚举值。

 

脚本如下:

1 #!/bin/bash

2 grep "Name:/|MIBenum:" character-sets | awk '

3

4 BEGIN{

  5     key="";

  6     print "#ifndef MIB_CHARSET_H"

  7     print "#define MIB_CHARSET_H"

  8     print "#define CHARSET_LIST //"

  9 }

  10

  11 /Name/{

  12     key=$2;

  13 }

  14

  15 /MIBenum/{

  16     printf "    CHARSET_DEF(CHARSET_"

  17     system("echo -n /"" key "/" |tr /"a-z/" /"A-Z/"|tr /"().://-/" /"_/"");

  18     print ", /"" key "/", " $2 ")//";

  19 }

  20

  21 END{

  22     print ""

  23     print "#undef CHARSET_DEF"

  24     print "#define CHARSET_DEF(id, name, value) id=value,"

  25     print "enum {CHARSET_LIST};"

  26     print "#undef CHARSET_DEF"

  27    

  28     print ""

  29     print "int         mib_charset_name_to_id(const char* name);"

  30     print "const char* mib_charset_id_to_name(int id);"

  31     print ""

  32     print "#endif/*MIB_CHARSET_H*/"

  33 }

  34 '

 

程序很简单:

2: grep过滤出包含NameMIBenum的内容。

11-13: 保存Name的内容。

15-19: 产生CHARSET_DEF

24-26: 产生枚举定义。

29-30:产生函数原型。

 

关于CHARSET_DEF可以参考神奇的xx

 

~~end~~

 

posted on 2007-01-03 21:12  张云临  阅读(119)  评论(0编辑  收藏  举报

导航