这几天在写一个项目,其中有用到打包和解包的网络通信,相信有过网络编程经验的朋友应该都知道,无非就是 将一个结构体打包成一段buff,以及反向的过程。(这里我们不考虑直接memcpy的情况,因为结构体里的字段有可能只是指针,当然如果都是定长数据的话,那么memcpy当然是最快的)

而在这个过程中,很多代码只是改了很少一部分,但是却要分别写两个函数,严重浪费了人力,而且容易出错。现在让我们看一下,能否用vim来替我们自动完成这件枯燥的事情。
我们来看这样一段示例代码:

int Output(unsigned int ver,char*& buf,int& iLen,int iMaxLen)
{
    int needLen = sizeof(char)*3+sizeof(short)+sizeof(int);
    if(needLen>iMaxLen)
    {
        return FBErrSystemNoMem;
    }
    char *t_Buff = buff;
    *(unsigned char*)t_Buff = placeId;
    t_Buff+=sizeof(unsigned char);
    *(unsigned char*)t_Buff = bitmap;
    t_Buff+=sizeof(unsigned char);
    *(unsigned short*)t_Buff = cId;
    t_Buff+=sizeof(unsigned short);
    *(unsigned char*)t_Buff = harvestTimes;
    t_Buff+=sizeof(unsigned char);
    *(unsigned int*)t_Buff = plantTime;
    t_Buff+=sizeof(unsigned int);
    iLen = t_Buff - buff;
    return 0;
}

而,我们希望能够自动生成这样一个对应代码:

int Input(unsigned int ver,char *buf,int& iLen,int iMaxLen)
 {
  int needLen = sizeof(char)*3+sizeof(short)+sizeof(int);
  if(needLen>iMaxLen)
  {
   return FBErrSystemNoMem;
  }
  char *t_Buff = buff;
  placeId = *(unsigned char*)t_Buff;
  t_Buff+=sizeof(unsigned char);
  bitmap = *(unsigned char*)t_Buff;
  t_Buff+=sizeof(unsigned char);
  cId = *(unsigned short*)t_Buff;
  t_Buff+=sizeof(unsigned short);
  harvestTimes = *(unsigned char*)t_Buff;
  t_Buff+=sizeof(unsigned char);
  plantTime = *(unsigned int*)t_Buff;
  t_Buff+=sizeof(unsigned int);
  iLen = t_Buff - buff;
  return 0;
 }

仔细观察就会发现,实际就是 *(unsigned char*)t_Buff = placeId; 这样的赋值语句等号左右两边的数据换一下~
OK,那么现在就好做啦,vim的脚本如下:

%s/\(^\s*\)\(.*[^+]\) = \(.*\);$/\1\3 = \2;/gc

实际上很简单,首先将

    *(unsigned char*)t_Buff = placeId;

这一句分段匹配,即最前面的空白部分是\1,等号左边(不包括紧挨等号左边的空格)是\2,等号右边(不包括紧挨等号右边的空格);之前是\3,所以只要替换成

\1\3 = \2;

即可啦,等号两边的空格是因为之前并没有匹配空格进去,所以为了美观,在等号两边分别加了个空格。

结果截图如下:

OK,正在写代码呢,突然觉得这个命令很有用,所以就放在这里啦,希望对大家也有用处~~~

版权所有,转载请注明出处.http://www.vimer.cn

最近的一些技术整理(20120109)

前段时间一直没写博客,昨天更新了一篇,今天突然又来了兴致,那就再更新一篇吧(所以说啊,治疗拖延症最好的方法就是现在开始做) 这篇还是一些技术的整理,...

阅读全文

C++模板的几个应用

C++的模板其实是个挺纠结的东西,用的不好的话,编译的一堆错误够你调到崩溃,但要是用的好呢,又确实非常方便,我们来看看 一.获取数组长度 比如 ...

阅读全文

又见C++诡异问题

用C++越久,越是觉得C++太多陷阱,真是防不胜防。 我们看这样一段代码: C++ #include <stdio.h> using namespace std; ...

阅读全文

发表评论