View difference between Paste ID: dQsFF3DL and Qp3YJ0S1
SHOW: | | - or go back to the newest paste.
1
import sys, os, re
2
from Tkinter import *
3
from tkSimpleDialog import askstring
4
5
if len( sys.argv ) < 2:
6
    sys.exit( "Usage: " + os.path.basename( sys.argv[ 0 ] ) + " <h-file> [impl-class-name]|[:ask]" )
7
8
inFileName = sys.argv[ 1 ]
9
10
doAsk = False
11
classImplName = ""
12
if len( sys.argv ) > 2:
13
    classImplName = sys.argv[ 2 ]
14
    if classImplName == ":ask":
15
        classImplName = ""
16
        doAsk = True
17
18
abstractFuncRe = re.compile( r"(\s*\=\s*0\s*)" )
19
funcNameRe = re.compile( r"(\w+\s*\()" )
20
21
inFile = open( inFileName, "rt" )
22
classStarted = False
23
className = ""
24
outFileLines_h = []
25
outFileLines_cpp = []
26
for line in inFile:
27
    line = line.strip( "\n\r" )
28
    tmp = line
29
    commentPos = tmp.find( "//" )
30
    if commentPos != -1:
31
        tmp = tmp[ 0 : commentPos ]
32
    tmp = tmp.replace( " ", "" )
33
    tmp = tmp.replace( "\t", "" )
34
    if tmp.startswith( "#" ) or tmp.startswith( "//" ):
35
        continue
36
    if tmp.startswith( "class" ) and not tmp.endswith( ";" ):
37
        classStarted = True
38
        words = line.split()
39
        className = words[ 1 ]
40
        if classImplName == "":
41
            if doAsk:
42
                r = Tk()
43
                r.withdraw()
44
                classImplName = askstring( "make_impl", "Enter impl-class-name:", initialvalue = className + "Impl" )
45
                r.destroy()
46
                if classImplName == None:
47
                    exit()
48
            else:
49
                classImplName = className + "Impl"
50
        outFileLines_h.append( "class " + classImplName + " : public " + className + "\n" )
51
        continue
52
    if not classStarted:
53
        continue
54
    isFunc = False
55
    funcName = ""
56
    m = abstractFuncRe.search( line )
57
    if m != None:
58
        isFunc = True
59
        a = m.group( 1 )
60
        line = line.replace( a, "" )
61
    if line.find( "~" + className ) != -1 or tmp.startswith( className ):
62
        continue
63
    outFileLines_h.append( line + "\n" )
64
    if isFunc:
65
        m = funcNameRe.search( line )
66
        if m != None:
67
            funcName = m.group( 1 )
68
            funcName = funcName.strip( " \t(" )
69
            print funcName
70
        cppLine = line.replace( funcName, classImplName + "::" + funcName, 1 )
71
        cppLine = cppLine.replace( "virtual ", "" )
72
        cppLine = cppLine.replace( "virtual\t", "" )
73
        cppLine = cppLine.lstrip()
74
        cppLine = cppLine.rstrip( ";" )
75
        outFileLines_cpp.append( cppLine + "\n" )
76
        outFileLines_cpp.append( "{\n" )
77
        outFileLines_cpp.append( "}\n" )
78
        outFileLines_cpp.append( "\n" )
79
80
81
outFileName_h = os.path.dirname( inFileName ) + "\\" + classImplName + ".h"
82
outFileName_cpp = os.path.dirname( inFileName ) + "\\" + classImplName + ".cpp"
83
outFile_h = open( outFileName_h, "wt" )
84
outFile_cpp = open( outFileName_cpp, "wt" )
85
defGuard = "_" + os.path.basename( outFileName_h ).replace( ".", "_" ).upper() + "_INCLUDED_"
86
outFile_h.write( "#if !defined( " + defGuard + " )\n" )
87
outFile_h.write( "#define " + defGuard + "\n" )
88
outFile_h.write( "\n" )
89
outFile_h.write( "#include \"" + os.path.basename( inFileName ) + "\"\n" )
90
outFile_h.write( "\n" )
91
outFile_cpp.write( "#include \"" + os.path.basename( outFileName_h ) + "\"\n" )
92
outFile_cpp.write( "\n" )
93
94
outFile_h.writelines( outFileLines_h )
95
outFile_cpp.writelines( outFileLines_cpp )
96
97
outFile_h.write( "\n" )
98
outFile_h.write( "#endif // !defined( " + defGuard + " )\n" )
99
outFile_h.close()
100
outFile_cpp.close()