免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3082 | 回复: 1
打印 上一主题 下一主题

生成转换字节序函数的工具 [复制链接]

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-13 13:29 |只看该作者 |倒序浏览
可用于网络编程时有很多结构体头文件,自动生成转换函数声明和定义,自己用Perl用写的,大家有时可能用得到


  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %to_net = (
  5.         "short" => "htons",
  6.         "int"        => "htonl",
  7.         "long"        => "htonl",
  8.         "INT16" => "htons",
  9.         "UINT16" => "htons",
  10.         "INT32" => "htonl",
  11.         "UINT32" => "htonl",
  12. );
  13. my %to_host = (
  14.         "short" => "ntohs",
  15.         "int"        => "ntohl",
  16.         "long"        => "ntohl",
  17.         "INT16" => "ntohs",
  18.         "UINT16" => "ntohs",
  19.         "INT32" => "ntohl",
  20.         "UINT32" => "ntohl",
  21. );
  22. my $definition = shift @ARGV;
  23. my $header        = "ByteOrderTrans.h";
  24. my $source  = "ByteOrderTrans.cpp";
  25. open DEF, "< $definition" or die "Can't open $definition: $!";
  26. open HEAD, "+> $header" or die "Can't open $header: $!";
  27. open BODY, "+> $source" or die "Can't open $source: $!";
  28. local $/;
  29. my $text = <DEF>;
  30. close DEF;

  31. my $var_re = qr/
  32.                    ^\s*
  33.                    (?:typedef\s+)?
  34.                    struct\s+
  35.                    (\w+)\s*        #struct variable name
  36.                    \{
  37.                        ([^}]+)     #member variables
  38.                    \}
  39.                    \s*\1?\s*;
  40.                /x;
  41. my $mem_re = qr{
  42.                    (\w+)\s+       #member variable type
  43.                    (\w+)\s*$      #member variable name
  44.                }x;
  45. my $hton_func;
  46. my $ntoh_func;
  47. while ( $text =~ /$var_re/msg ) {
  48.         print HEAD "void hton_$1( $1 *p );\n"."void ntoh_$1( $1 *p );\n\n";
  49.         $hton_func = "void hton_$1( $1 *p )\n{\n";
  50.         $ntoh_func = "void ntoh_$1( $1 *p )\n{\n";
  51.         foreach ( split /;/, $2 ) {
  52.                 if ( /$mem_re/ and exists $to_host{$1} ){
  53.                         $hton_func .= "\t p->$2 = $to_net{$1}(p->$2);\n";
  54.                         $ntoh_func .= "\t p->$2 = $to_host{$1}(p->$2);\n";
  55.                 }
  56.         }
  57.         print BODY $hton_func."}\n".$ntoh_func."}\n\n";
  58. }
  59. close HEAD;
  60. close BODY;
复制代码

[ 本帖最后由 timespace 于 2008-8-19 16:07 编辑 ]

ByteOrderTrans.rar

730 Bytes, 下载次数: 57

评分

参与人数 1可用积分 +9 收起 理由
MMMIX + 9 多谢分享。

查看全部评分

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2008-08-13 20:46 |只看该作者
要是提供代码的可下载版本就更完美了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP