• 一个用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~~

     
  • 相关阅读:
    VS 2005 RDLC报表实现WEB客户端打印(2)
    VS 2005 RDLC报表实现WEB客户端打印(1)
    封装就是一个包装,将包装的内外分为两个空间
    以count或是sum为条件的查询
    DbRulesAuthorizationProvider for .net 2.0
    Asp.net Ajax 'Sys'未定义
    广州网球场地名录
    谷歌 寄语
    深圳市网球场地一览表
    .net 2.0 串口通讯一小例
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167765.html
Copyright © 2020-2023  润新知