一种源代码中硬编码字符串的提取和集中方法

文档序号:6604260阅读:696来源:国知局
专利名称:一种源代码中硬编码字符串的提取和集中方法
技术领域
本发明属于源代码处理工具领域,尤其指一种基于定义规则,对源代码文件中硬编码字符串提取和替换的方法。
背景技术
在软件国际化的过程中,一般都需要经过两个步骤(1)处理源代码,消除其中的硬编码字符串,并且完成字符串的集中化处理;(2)将集中处理以后的字符串翻译为多国语言。其中,消除硬编码字符串,完成字符串的集中化处理这一步最为关键,但是该步骤的工作量大、很容易发生错误和遗漏。由于计算机编程语言的多样性和复杂性,对这一步骤,目前还没有特别有效的自动化处理方法,一般都是通过手工完成的。
在现有的技术中,通过手工处理完成该步骤存在以下问题1.可能出现不能完全发现所有硬编码字符串的情况,尤其是在源代码的代码量很大的情况下,这种情况更加突出。
2.完全依赖手工处理,处理的效率低下。
3.在工作量很大的情况下,执行这一过程的人员不同,可能会出现处理方式不相同的问题,以导致处理完成的代码风格各异,增加了代码的维护难度。
4.对执行这一过程的人员要求有较高的专业知识水平,大多数人不能完成此步骤。

发明内容
有鉴于此,本发明的主要目的在于提供一种硬编码字符串的提取和集中方法。该方法中,源代码文件处理器按照定义好的规则集处理源代码文件,从而使得硬编码字符串的漏检情况得以消除、处理源代码文件的处理效率得以大幅度的提高、对处理人员的专业性技术要求得以降低。
实现本方法需要以下步骤A、按照固定的格式配置得到规则集,源代码文件处理器装载该规则集,根据规则集中的内容确定替换规则中的自动变化的数字变量的初始值和文件集中方式,并得到待处理源代码文件目录表;B、源代码文件处理器处理目录表中的当前源代码文件,套用源代码文件处理器中的规则集,根据该文件的文件名后缀确定该源代码文件使用的编程语言、得到此种语言的适用的规则集;C、源代码文件处理器读取该源代码文件,在规则集规定的字符串开始标记与结束标记之间,按照规则集的规定提取读到的字符串,按照规则集中的替换规则,用自变量为字符串标识符的替换函数替换提取的字符串,并将提取的字符串与字符串标识符按照规则集中的文件集中方式集中至集中文件中;在规则集规定的注释开始标记与结束标记之间,不做提取、替换和集中;重复本步骤直至读取到该文件结束标记;D、在源代码文件处理器的目录表中删除该文件名,判断其中是否还有其它文件名,如果是,则返回步骤B,否则,结束整个处理过程。
其中,在步骤A中,所述根据规则集的内容确定文件集中方式包括根据规则集的规定确定所有待处理的源代码文件所提取的字符串均集中到用一个文件名确定的文件。
其中,在步骤A中,所述根据规则集的内容确定文件集中方式包括根据规则集的规定确定待处理的源代码文件分别将各自提取的字符串集中到与该源代码文件同名但扩展名不相同的文件中。
其中,在步骤C中,所述集中包括按照规则集的规定将所述提取的字符串与字符串标识符集中至文件类型为资源文件的集中文件中。
其中,该方法进一步包括将替换后的字符串标识符的宏定义写入一文件名与集中文件名相同的头文件中。
其中,在步骤C中,所述集中包括按照规则集的规定将所述提取的字符串与字符串标识符按照规则中定义的行模式集中至文件类型为文本文件的集中文件中。
其中,在步骤C中,所述按照规则集提取进一步包括提取其中包含规则集规定的特征字符的字符串,并忽略规则集规定的字符。
其中,在步骤C中,读取到所述开始标记或结束标记前有规则集规定的转义字符标记时,继续读取源代码文件,该开始标记或结束标记作为字符串被扫描。
其中,在步骤C中,获得所述字符串标识符包括将规则集中规定的数字变量前缀置于规则集中自动变化的数字变量前,将规则集中规定的数字变量后缀置于规则集中自动变化的数字变量之后,前缀、自动变化的数字变量和后缀构成字符串标识符,自动变化的数字变量自动变化,其中,自动变化满足数字变量自动变化后的结果唯一。
其中,所述自动变化包括数字变量自动加1。
其中,在步骤C中,所述提取、替换进一步包括判断所述提取出的字符串是否符合规则集中规定的过滤条件,如果是,则不对该提取出的字符串进行所述替换和集中。
其中,所述判断所述提取出的字符串是否符合规则集中规定的过滤条件包括判断提取出的字符串是否包括规则集中规定的过滤字符。
其中,所述判断所述提取出的字符串是否符合规则集中规定的过滤条件包括判断提取出的字符串是否与规则集规定的过滤字符完全匹配。
可见,该方法通过定义识别规则将所有符合提取条件的字符串提取出来,避免了遗漏现象的发生;通过定义统一的替换和集中规则使得处理后的代码和集中文件完全一致,减小了处理源代码文件的维护难度;通过采用按照编程语言分类定义规则集以及按照文件目录一次性处理所有待处理源代码文件这些手段,降低了对技术人员的要求并提高了工作效率。


图1为源代码文件处理器的处理流程图。
具体实施例方式
本发明采用定义的规则集对源代码文件进行处理,不同的编程语言套用不同的规则集,按照规则集中规定提取条件提取源代码文件中的字符串,按照替换规则对提取出的字符串进行替换,按照集中方式的规定将提取出的字符串及其替换后的字符串标识符集中至规定的集中文件中。
下面参照附图对本发明进行详细描述。
本发明采用XML文件来描述规则集配置文件,也可采用其它语言来描述规则集配置文件。
参见表1,几个特殊字符在规则集配置文件中必须写成符合XML语法规则的形式。

表1为了对包含硬编码字符的源代码文件进行替换,用户首先编写规则集配置文件,如下文件是一个样例配置文件,在该文件中定义了C/C++语言的字符识别、替换和集中规则
<pre listing-type="program-listing"><?xml version=”1.0”encoding=”gb2312”?><configuration>  <initiator>  <parameter_index value=”0”></parameter_index>  <result all_in_one=”yes”>mystring</result>  </initiator>  <language type=”C/C++”>  <file extension=”cpp”></file>  <file extension=”c”></file>  <comment begin=”//”end=”\r\n”></comment>  <comment begin=”#include”end=”\r\n”></comment>  <comment begin=”#define”end=”\r\n”></comment>  <comment begin=”/*”end=”*/”></comment>  <string begin=”&amp;amp;quot;”end=”&amp;amp;quot;”escape=”\”has_chinese=”yes”>  <macro begin=”_T(“end=”)”></macro>  <replacer begin=”Str(“end=”)”>   <parameter prefix=”IDS_”postfix=””></parameter>  </replacer>  <filter text=”黑体”match_type=”all”></fiter>  <filter text=”宋体”match_type=”contained”></filter>  </string>  <container type=”rc”header=”yes”></container>  </language></configuration></pre>在该配置文件中&lt;?xml version=”1.0”encoding=”gb2312”?&gt;是文件头,表示了整个文件符合的XML规范的版本号、文件采用的字符集编码。这一行是XML语法规则要求的,通常情况下不需改变。此处表示该文档符合XML1.0规范,使用GB2312字符集。
&lt;configuration&gt;和&lt;/configuration&gt;分别代表了配置文件内容的开始和结束位置,是这个配置文件经XML剖析器(Parser)转换以后生成的对象树的根结点,所有的配置信息都必须包含在这一对标记之间,每一个配置文件有且仅有一个这种结点。
&lt;initiator&gt;与&lt;/initiator&gt;之间的内容定义了对本工具进行初始化设置的信息,每一个信息有且只有一个这种结点。
&lt;parameter_index value=”0”&gt;&lt;/parameter_index&gt;定义了本工具生成表示字符串的标识符时,采用的自动变化数字变量的初始值;在处理源程序文件的时候,对每一个提取出来的字符串必须分配一个变量或者字符串标识符来代表,为了保证分配的标识符不重复,本工具采用在标识符中包含一个自动增加的数字变量的方法;value属性定义了这个自动增加的数字变量的初始值,每一个配置文件有且仅有一个这种结点,此处的规则表示自动增加数字变量的初始值为0。
&lt;result all_in_one=”yes”&gt;mystring&lt;/result&gt;定义了提取出来的字符串是否集中到一个文件中,以及该文件的文件名,其中all_in_one属性定义了字符串是否集中到一个文件中,仅能取值yes和no,yes代表集中到一个文件,此时标签之间定义了字符串集中文件的文件名(扩展名是根据字符串集中文件的类型来自动确定的);no代表每一个源文件中提取出来的字符串集中到一个独立的文件,此时该集中文件的文件名与源程序文件一致;每一个配置文件有且仅有一个这种结点,此处的规则表示所有提取出来的字符都集中到一个文件mystring中。
&lt;language type=”C/C++”&gt;与&lt;/language&gt;之间的部分代表一种特定编程语言的规则,type是这种语言的名称。每个配置文件可以有多个这种结点,对应多种语言。此处的规则表示&lt;language&gt;与&lt;/language&gt;之间的部分定义的是C/C++语言的规则。
&lt;file extension=”cpp”&gt;&lt;/file&gt;定义该编程语言的一种源程序文件,extension是这种文件的后缀名。每一种特定编程语言可以有多个这种结点。此处的规则表示后缀名为cpp的源程序文件是使用C/C++语言编写的。&lt;fileextension=”c”&gt;&lt;/file&gt;则表示后缀名为c的源程序文件是使用C/C++语言编写的。
&lt;comment begin=”//”end=”\r\n”&gt;&lt;/comment&gt;定义该编程语言的一种注释规则。begin是注释的开始,end是注释的结束。end可以识别\r(换行)\n(新行)。每一种特定编程语言可以有多个这种结点。此处的规则表示注释以“//”开始,以“\r\n”结束,即是C/C++中的行注释。
同理,&lt;comment begin=”#include”end=”\r\n”&gt;&lt;/comment&gt;定义该编程语言的一种注释规则,此处的规则表示注释以“#include”开始,以“\r\n”结束,即是C/C++中的包含头文件的代码行。&lt;comment begin=”#define”end=”\r\n”&gt;&lt;/comment&gt;定义该编程语言的一种注释规则,此处的规则表示注释以“#define”开始,以“\r\n”结束,即是C/C++中的宏定义代码行。&lt;comment begin=”/*”end=”*/”&gt;&lt;/comment&gt;定义该编程语言的一种注释规则,此处的规则表示注释以”/*”开始,以”*/”结束,即是C/C++中的块注释。
&lt;string begin=”&amp;quot;”end=”&amp;quot;”escape=”\”has_chinese=”yes”&gt;定义该编程语言的一种字符串定义规则。begin是字符串开始标记;end是字符串结束标记;escape是转义字符标记(如果字符串中包含有跟结束标记相同的字符时,用来表示该字符串不是结束标记);has_chinese是对该字符串的处理方式,仅能取值yes和no,yes表示仅在该字符串含有汉字时提取,no表示无论该字符串是否含有汉字都要提取。每一种特定编程语言可以有多个这种结点。如果在某一种特定的编程语言中包含超过一个&lt;string&gt;&lt;/string&gt;定义,在处理找到的字符串时,本工具会根据定义的规则判断出字符串中包含的子字符串。以SQL语言为例,以下的SQL语句exec(‘select“IWP框号”=b.iPhyFrameNo,title=“CDI通信端口配置表”‘)在运行的时候,如果定义了“’”和“””两种字符串定义规则,就会提取出以下的三个字符串“select=b.iPhyFrameNo,title=”、“IWF框号”、“CDI通信端口配置表”。如果“’”对应定义的has_chinese为yes,“””对应的定义has_chinese为yes,则第一个字符串不会被提取出来,其他两个字符串会被提取出来;如果“’”对应的定义的has_chinese为no,无论“””对应的定义的has_chinese为yes还是no,都只有第一个字符串被提取出来,因为该字符串已经包含了后两个字符串。此处的规则表示字符串以“””开始和结束,转义字符为“\”,仅在字符串中包含汉字时才提取该字符串。
&lt;macro begin=”_T(“end=”)”&gt;&lt;/marco&gt;定义该字符串定义中的一种字符串宏定义规则。begin是宏的开始部分;end是宏的结束部分。每一种字符串定义可以有多个这种结点。定义字符串宏主要是因为在某些编程语言中,有一些特定的字符串与一般的ascii字符串的处理方法不一样,比如对采用unicode编码方式的字符串,处理方法就与ascii字符串的处理方法不一样,因此,编程语言本身需要一些特殊的标志来表示这种差异。在进行源代码转换的时候,必须忽略掉这些特殊的标志字符。此处的规则表示在该种字符串定义中,“_T(”和“)”之间的部分才是需要提取的字符串,“_T(”和“)”需要被忽略。
&lt;replacer begin=”Str(“end=”)”&gt;&lt;/replacer&gt;定义该字符串的替换规则。begin表示替换该字符串开始部分的代码;end表示替换该字符串结束部分的代码。每一个字符串定义只能有一个replacer定义。此处的规则表示字符串用一个函数Str()来替换。
&lt;parameter prefix=”IDS_”postfix=””&gt;&lt;/parameter&gt;定义替换规则中字符串标识符的命名方式。prefix表示自动增加的数字变量的前缀;postfix表示自动增加的数字变量的后缀。字符串标识符最后就是由“prefix+自动增加的数字变量+postfix”构成。每一个字符串替换规则中只能包含一个这种结点。此处的规则表示字符串标识符的命名规则为“IDS_自动增加的数字变量”。
&lt;filter text=”黑体”match_type=”all”&gt;&lt;/filter&gt;定义了该种字符串定义中字符串的过滤规则。在某些情况下,提取到的某些字符串可能不需要替换和集中(比如表示对话框采用的字体的字符串),通过定义过滤规则可以实现这个特性。text表示要过滤的字符串;match_type表示过滤字符串时采用的匹配方式,可以取值all或者contained,all表示当前字符串与要过滤的字符串完全匹配时,当前字符串才过滤,contained表示当前字符串包含要过滤的字符串时,当前字符串就过滤。如果text为空,该过滤规则是没有作用的。每一个字符串定义规则可以包含多个这种结点。此处的规则表示提取出来的字符串如果是“黑体”就不用替换和集中化了。
同理,&lt;filter text=”-宋体”matcn_type=”contained”&gt;&lt;/filter&gt;表示提取出来的字符串中只要包括含“宋体”字符,就不用替换和集中化了。
&lt;container type=”rc”header=”yes”&gt;&lt;/container&gt;定义了特定编程语言中提取出来的字符串的存放方式。每一个特定编程语言只能包含一个这种结点。其中,type定义了文件类型,目前只能取值rc和file两种,rc是指资源定义文件,如果选择rc可以选择是否将字符串资源ID放在一个头文件中,如果需要,则将header指定为yes,否则指定为no;当container type=”file”时,指的是存放方式为文本文件,相应的,必须以行模式的格式定义一个集中模式,字符串集中时,按照该行模式集中文件至文本文件中。
下面详细描述对文件中硬编码的替换过程以源代码文件sample.cpp为例,源代码文件处理器按照上述配置文件所定义的规则对该文件进行硬编码替换,该文件的内容为<pre listing-type="program-listing">  sample.cpp  #include“stdio.h”  #define MESSAGE“This is a message.”  main()  {   printf(_T(“请输入一个数字”));   int iNum;   scanf(“%d”,&amp;amp;iNum);   printf(“这是一个宋体字符串”);   printf(“这是另一个字符串”);  }</pre>参见图1所示,完成硬编码替换需要以下步骤1、源代码文件处理器将所有待处理文件的文件名写入目录表,并根据配置文件完成初始化确定所有处理文件中提取出来字符串集中在一个名为mystring的文件中,替换规则中所应用的自动增加的数字变量的初始值为0。
2、源代码文件处理器处理目录表中的sample.cpp文件,根据配置文件中的语句&lt;language type=”C/C++”&gt;
&lt;file extension=”cpp”&gt;&lt;/file&gt;&lt;/language&gt;
确定源代码文件sample.cpp使用的编程语言为C++,由此确定对sample.cpp的识别、替换和集中规则都在配置文件定义的C++语言的节点下进行。
3、在配置文件定义的C++语言的节点下对sample.cpp文件进行识别、替换和集中3.1、读取sample.cpp文件中的第1行#include“stdio.h”,根据配置文件中&lt;comment begin=”#include”end=”\r\n”&gt;&lt;/comment&gt;所定义的规则,该语句被识别为注释语句,其中的字符串不作替换和集中。
3.2、读取sample.cpp文件中的第2行#define MESSAGE“This is amessage.”,根据配置文件中&lt;comment begin=”#define”end=”\r\n”&gt;&lt;/comment&gt;所定义的规则,该语句被识别为注释语句,其中的字符串不作替换和集中。
3.3、读取sample.cpp文件中的第5行printf(_T(“请输入一个数字”));,根据配置文件&lt;string begin=”&amp;quot;” end=”&amp;quot;”escape=”\”has_chinese=”yes”&gt;所定义的规则,该行语句中的字符串“请输入一个数字”被识别出来,再根据&lt;macro begin=”_T(“end=”)”&gt;&lt;/macro&gt;所定义的规则,将字符序列“_T(“请输入一个数字”)”识别为一个字符,并将字符串宏规则所定义的“_T(”和“)”忽略掉。
3.4、继续顺序读取sample.cpp文件的第6行和第7行,这两行中没有符合识别规则的字符,因此不做识别处理。
3.5、读取sample.cpp文件中的第8行printf(“这是一个宋体字符串”);,根据配置文件中&lt;string begin=”&amp;quot;”end=”&amp;quot;”escape=”\”has_chinese=”yes”&gt;所定义的规则,该行语句中的字符串“这是一个宋体字符串”被识别出来;同理,读取sample.cpp文件中的第9行printf(“这是另一个字符串”);,该行语句中的字符串“这是另一个字符串”被识别出来。
3.6、根据配置文件中&lt;filter text=”黑体”match_type=”all”&gt;&lt;/filter&gt;和&lt;fiter text=”宋体”match_type=”contained”&gt;&lt;/filter&gt;所定义的字符串过滤规则对识别出的字符串进行过滤处理。本实施例中,“请输入一个数字”和“这是另一个字符串”中没有字符串“宋体”或“黑体”,不满足该过滤规则中所规定的情况,因此,“请输入一个数字”不会被过滤掉,需要进行后续步骤所述的集中。然而,在“这是一个宋体字符串”中包含字符串“宋体”,符合过滤规则中&lt;filter text=”宋体”match_type=”contained”&gt;&lt;/filter&gt;的规定,因此,“这是一个宋体字符串”被过滤掉,不需要进行后续步骤所述的集中。
3.7、根据配置文件中&lt;replacer begin=”Str(“end=”)”&gt;所定义的字符串替换规则,将第5行中的“请输入一个数字”用函数Str()替换。根据配置文件中&lt;parameter prefix=”IDS_”postfix=””&gt;&lt;/parameter&gt;所定义的规则,将“请输入一个数字”字符序列替换为字符串标识符IDS_0,从而得到完整的替换代码“Str(IDS_0)”,其中,IDS_0由替换规则中定义的前缀“IDS_”、后缀“”以及初始化中所述的自动增加的数字变量的当前数值组成,因为该次替换为第一次替换,所以自动增加的数字变量的数值为0;按照替换规则的规定,本次替换后数字变量的数值自动加1,下一次应用替换规则时,采用加1后的当前数值,如此进行下去,保证每次得到的数字变量的数值唯一即可。依照上述方法,“这是另一个字符串”的完整替换代码为“Str(IDS_1)”。
3.8、根据配置文件&lt;container type=”rc”header=”yes”&gt;&lt;/container&gt;所定义的规则,将提取出来的字符串“请输入一个数字”及其字符串标识符IDS_0以及“这是另一个字符串”及其字符串标识符IDS_1存放在rc类型的集中文件中,根据配置文件初始化时定义的规则&lt;resultall_in_one=”yes”&gt;mystring&lt;/result&gt;,该集中文件名称为mystring.rc。根据配置文件中的header=”yes”所定义规则,将字符串标识符宏定义IDS_0、IDS_1存放在名称为mystring.h的头文件中。
继续读取文件,直到源代码文件处理器读到文件结束符,源代码文件处理器得到该结束条件结束对该文件的处理。
源代码文件处理器删除存储在目录表中的sample.cpp文件名,扫描表中是否还有其它文件名,由于目录表中没有其它文件名,因此,源代码文件处理器结束此次文件处理过程;如果目录表中还有其它文件的文件名,则源代码文件处理器按照处理sample.cpp的方式继续逐一处理这些文件,并在每处理完成一个文件后,将该文件的文件名从目录表中删除。
最后,源代码文件处理器生成集中文件mystring.rc和头文件mystring.h。
其中,集中文件mystring.rc的内容为STRINGTABLE DISCARDABLEBEGINIDS_0″请输入一个数字″IDS_1″这是另一个字符串″END其中,头文件mystring.h的内容为mystring.h#define IDS_0 0#define IDS_1 1源代码文件处理器在处理定义了多种字符串识别规则的编程语言,比如SQL语句,针对不同的提取规则会对应不同的提取结果,以处理以下的SQL语句为例exec(‘select“IWP框号”=b.iPhyFrameNo,title=“CDI通信端口配置表”‘)在配置文件中,如果定义的字符串定义规则为&lt;string begin=”&amp;quot;”end=”&amp;quot;”escape=”\”has_chinese=”yes”&gt;
&lt;string begin=”&amp;apos;”end=”&amp;apos;”escape=”\”has_chinese=”yes”&gt;
则,提取出“IWF框号”和“CDI通信端口配置表”;如果定义的字符串定义规则为&lt;string begin=”&amp;quot;”end=”&amp;quot;”escape=”\”has_chinese=”yes”&gt;
&lt;string begin=”&amp;apos;”end=”&amp;apos;”escape=”\”has_chinese=”no”&gt;
则,提取出“select“IWP框号”=b.iPhyFrameNo,title=“CDI通信端口配置表””;而且,只要单引号对应的定义的has_chinese为no,则不论双引号对应的has_chinese为yes或是no,提取结果均是“select“IWP框号”=b.iPhyFrameNo,title=“CDI通信端口配置表””。
可见,在本发明中,按照编程语言分类定义规则集,待处理的源代码文件置于文件目录中,源代码文件处理器对文件目录中的文件依次处理,通过文件名得到该文件适用的规则集,按照该规则集的规定提取字符、替换提取出的字符,再根据规则集中规定的方式将提取出的字符及其替换后的字符集中至集中文件中。重复上述步骤,直至处理完目录中的所有文件。本发明实现了针对不同的编程语言定义不同的规则集,对处理源代码文件人员的要求低;源代码文件处理器利用固定的规则集处理源代码文件,降低了工作强度,避免了处理源代码文件过程中遗漏部分硬编码字符串的发生;而且,利用统一的规则集处理源代码文件,使得针对同一源代码文件处理后的代码和集中文件完全一致,降低了维护难度。本发明实现起来高效、稳定,能大大提高处理源代码文件的效率。
权利要求
1.一种源代码中硬编码字符串的提取和集中方法,其特征在于该方法包括以下步骤A、按照固定的格式配置得到规则集,源代码文件处理器装载该规则集,根据规则集中的内容确定替换规则中的自动变化的数字变量的初始值和文件集中方式,并得到待处理源代码文件目录表;B、源代码文件处理器处理目录表中的当前源代码文件,套用源代码文件处理器中的规则集,根据该文件的文件名后缀确定该源代码文件使用的编程语言、得到此种语言的适用的规则集;C、源代码文件处理器读取该源代码文件,在规则集规定的字符串开始标记与结束标记之间,按照规则集的规定提取读到的字符串,按照规则集中的替换规则,用自变量为字符串标识符的替换函数替换提取的字符串,并将提取的字符串与字符串标识符按照规则集中的文件集中方式集中至集中文件中;在规则集规定的注释开始标记与结束标记之间,不做提取、替换和集中;重复本步骤直至读取到该文件结束标记;D、在源代码文件处理器的目录表中删除该文件名,判断其中是否还有其它文件名,如果是,则返回步骤B,否则,结束整个处理过程。
2.根据权利要求1所述的方法,其特征在于在步骤A中,所述根据规则集的内容确定文件集中方式包括根据规则集的规定确定所有待处理的源代码文件所提取的字符串均集中到用一个文件名确定的文件。
3.根据权利要求1所述的方法,其特征在于在步骤A中,所述根据规则集的内容确定文件集中方式包括根据规则集的规定确定待处理的源代码文件分别将各自提取的字符串集中到与该源代码文件同名但扩展名不相同的文件中。
4.根据权利要求2或3所述的方法,其特征在于在步骤C中,所述集中包括按照规则集的规定将所述提取的字符串与字符串标识符集中至文件类型为资源文件的集中文件中。
5.根据权利要求4所述的方法,其特征在于该方法进一步包括将替换后的字符串标识符的宏定义写入一文件名与集中文件名相同的头文件中。
6.根据权利要求2或3所述的方法,其特征在于在步骤C中,所述集中包括按照规则集的规定将所述提取的字符串与字符串标识符按照规则中定义的行模式集中至文件类型为文本文件的集中文件中。
7.根据权利要求1所述的方法,其特征在于在步骤C中,所述按照规则集提取进一步包括提取其中包含规则集规定的特征字符的字符串,并忽略规则集规定的字符。
8.根据权利要求1所述的方法,其特征在于在步骤C中,读取到所述开始标记或结束标记前有规则集规定的转义字符标记时,继续读取源代码文件,该开始标记或结束标记作为字符串被扫描。
9.根据权利要求1所述的方法,其特征在于在步骤C中,获得所述字符串标识符包括将规则集中规定的数字变量前缀置于规则集中自动变化的数字变量前,将规则集中规定的数字变量后缀置于规则集中自动变化的数字变量之后,前缀、自动变化的数字变量和后缀构成字符串标识符,自动变化的数字变量自动变化,其中,自动变化满足数字变量自动变化后的结果唯一。
10.根据权利要求9所述的方法,其特征在于所述自动变化包括数字变量自动加1。
11.根据权利要求1所述的方法,其特征在于在步骤C中,所述提取、替换进一步包括判断所述提取出的字符串是否符合规则集中规定的过滤条件,如果是,则不对该提取出的字符串进行所述替换和集中。
12.根据权利要求11所述的方法,其特征在于所述判断所述提取出的字符串是否符合规则集中规定的过滤条件包括判断提取出的字符串是否包括规则集中规定的过滤字符。
13.根据权利要求11所述的方法,其特征在于所述判断所述提取出的字符串是否符合规则集中规定的过滤条件包括判断提取出的字符串是否与规则集规定的过滤字符完全匹配。
全文摘要
本发明公开了一种源代码中硬编码字符串的提取和集中方法,在该方法中,源代码文件处理器装载不同编程语言对应的规则集,根据待处理源代码文件的文件名套用相应的规则集处理该文件读取该源代码文件,在规则集规定的提取字符串开始结束标记之间,按照规则集规定提取、替换读取到的字符串,并将提取的字符串与其相应的替换后的字符串集中至集中文件中;在规则集规定的注释开始结束标记之间,不做提取、替换、集中;重复本步骤直至读取该文件结束。该方法实现起来高效准确,能避免硬编码字符串漏检情况的发生,对处理人员的技术要求低,能大幅度的提高源代码文件的处理效率。
文档编号G06F9/45GK1510569SQ0215796
公开日2004年7月7日 申请日期2002年12月23日 优先权日2002年12月23日
发明者杨波, 杨 波 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1