工作要求设计一个翻译引擎,主要是负责VPN日志的翻译,原始日志利用PCRE分段然后替换相应字段,即翻译成需要的格式字符串。引擎简单示意图如下:
这边利用到PCRE,PCRE只提供按照标准正则表达式进行匹配分段,并不提供字符串替换的功能。所以翻译引擎除了调用PCRE进行匹配外,还需要自己写替换程序。 对于PCRE,我们只需要调用简单的两个函数pcre_compile和pcre_exec就可以了,只要匹配成功,就可以返回相应的数值。这里主要解释下pcre_exec这个函数,实际写这个引擎时,这个函数出了不少bug。 函数原型: int pcre_exec(const pcre *code, const pcre_extra *extra, code Points to the compiled pattern 注意到 ovector这个in 数组, 如果pcre执行匹配分段后, 比如abc123bac用正则表达式进行分段后取得三个段:abc、123、bac,那么pcre_exec返回值应该是4,那么ovector这个int类型数组定义时,容量应该定义大于4*3=12,这样pcre_exec调用才不会出错,除了要大于12这个数外,还要注意到ovecsize应该是3的倍数。 在这个翻译引擎实际编码测试中就吃了这个亏,原来只定义ovecsize=30,出现了一些日志翻译失败的情况,查了下是分段过多,后来直接定义ovecsize=100,又出现原来可以翻译的一些日志变得不能翻译,最后查文档仔细看了下才知道这个值应该>分段*3,而且还要是3的倍数。 O(∩_∩)O哈哈~,本来一天写好的翻译引擎,最后测试花了一周时间来找bug除bug
|