最近看到一些代码中总是有者/* under construction !*/这样的注释,于是也想写出这样效果的脚本。

    如果原来的代码为:
#ifdef AAA//AAA
a = a + 1
#ifdef BBB//BBB
b = a + 1
#else //BBB
b = 100
#endif //BBB
c = 999
#endif //AAA

      想要达到的效果是:
#ifdef AAA//AAA
/* under construction !*/
#ifdef BBB//BBB
/* under construction !*/
#else //BBB
/* under construction !*/
#endif //BBB
/* under construction !*/
#endif //AAA

     最终的Python脚本程序如下,该脚本有一种情况下没有考虑,即同一行预编译语句中包含有多个宏控制下的处理,本脚本默认是不将代码修改为注释。

# -*- coding: cp936 -*-

def fileEncode(sourceFile,key,bForce = False):
    """replace the line in the scope of micro
        para1:the target file
        para2:the micro
        para3:if force to parse
    """
      
    try:
        fp = open(sourceFile,'r')
        lines = fp.readlines()
        fp.close()
    except:
        print "Can't open File %s." % sourceFile
        return       
       
    find = False
    text = ""
    replaceString = "/* under construction !*/\n"
    numofMicro = 0
       
    micro_start = "#if"
    micro_mid = "#el"
    micro_end = "#endif"
    orStr = "||"
    andStr = "&&"
  
    for line in lines:
        if find == False:
            if micro_start in line:
                if (key in line):
                    if not(andStr in line) and not(orStr in line) or bForce:
                        find = True
                        numofMicro += 1
            text += line
        else:
            if micro_end in line:
                numofMicro -= 1
                if numofMicro == 0:
                    find = False
                text += line
            else:               
                if micro_start in line or micro_mid in line:
                    numofMicro += 1
                    text += line
                else:
                    text += replaceString
       
    #rewrite the file
    try:
        fp2 = open(sourceFile,'w')
        fp2.write(text)
        fp2.close
    except:
        print "Can't write file %s" % sourceFile   

if __name__ == "__main__":
    key = '__MMI_VIDEO_PLAYER__'
    sourceFile = '复件 1.c'
   
    fileEncode(sourceFile,key)