from subprocess import call from glob import glob; from os.path import * toRemove=[] renamePackages=[ # src Pac package Target Package ["pcap_h", "Pcap.Low_Level.Impl"], ["pcap_bpf_h", "Pcap.Low_Level.BPF"] ] renameTypedefs=[ # src type Target Type ["winsock2_h.u_short", "Interfaces.C.unsigned_short"], ["pcap_bpf_h.bpf_u_int32", "Interfaces.C.unsigned"], ["winsock2_h.u_int", "Interfaces.C.unsigned"], ["pcap_bpf_h.bpf_int32", "Interfaces.C.int"], ["winsock2_h.u_char", "Interfaces.C.unsigned_char"], ] withRemovals=[ # File import ["pcap_bpf_h", "winsock2_h"], ["pcap_h", "winsock2_h"] ] lineRemovals=[ "subtype pcap_if_t is pcap_if;", "subtype pcap_addr_t is pcap_addr;" ] def getRawSpecs(): call(["rm", "-rf", "*_h.ads"]) f=open("generate.h","w") f.write("#include \n") f.close() call(["g++", "-I", "../Include", "generate.h", "-fdump-ada-spec"]) call(["rm", "-rf", "*.gch", "generate.h"]) for i in toRemove: call(["rm",i]) def renameSimple(buffer): for i in renamePackages: buffer=buffer.replace(" " + i[0]+ " ", " " + i[1]+ " ") buffer=buffer.replace(" " + i[0]+ ";", " " + i[1]+ ";") buffer=buffer.replace(" " + i[0]+ ".", " " + i[1]+ ".") for i in renameTypedefs: buffer=buffer.replace(i[0],i[1]) for i in lineRemovals: buffer=buffer.replace(i,"-- " + i); return buffer def doRenameAll(): for i in glob("*_h.ads"): f=open(i) buffer=f.read() f.close() buffer=renameSimple(buffer) f=open(i + ".out","w") for tryRemove in withRemovals: if splitext(i)[0] == tryRemove[0]: for name in tryRemove[1:]: buffer=buffer.replace("with "+name + ";", "-- with "+name + ";") f.write(buffer) f.close() call(["gnatchop","-w",i+".out"]) def addRootpackages(packages): for i in packages: fname=i.lower().replace(".","-") + ".ads" if not exists(fname): f=open(fname,"w") f.write("package %(name)s is \n" + "end %(name)s;\n" % {"name" : i}) f.close() def cleanUp(): call(["rm" ,"*_h.ads", "*.out"]) projectTemplate="""project %(name)s is for Object_Dir use "obj"; package Builder is for Default_Switches ("ada") use ("-k", "-j4", "-g"); end Builder; package Compiler is for Default_Switches ("ada") use ("-g", "-gnatQ", "-gnatf", "-gnat05"); end Compiler; end %(name); """ def addProject(name): fname=name.lower().replace(".","-") + ".gpr" if not exists(fname): f=open(fname,"w") f.write(projectTemplate % {"name" : name}) f.close() # getRawSpecs() doRenameAll() # addRootpackages(["PCap","PCap.Low_Level"]) # addProject("PCap")