summaryrefslogtreecommitdiff
path: root/scripts/qdebug-odebug.py
blob: cc1b7ca589c808612541e25dfa1efb60b8c438db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/env python

"""
qdebug-odebug.py (C) 2004 Michael 'Mickey' Lauer <mickey@Vanille.de>
This script helps to convert from the Qt debugging framework to the Opie debugging framework
Though it will take care of the most common usages, it may not recognize uncommon ones, hence
manual work may be needed after applying the script.
"""

import sys, sre

qDebugExpression = sre.compile( '(.*)(qDebug)\(\s*(.*)\s*\);(.*)' )
qWarningExpression = sre.compile( '(.*)(qWarning)\(\s*(.*)\s*\);(.*)' )
qErrorExpression = sre.compile( '(.*)(qError)\(\s*(.*)\s*\);(.*)' )
qFatalExpression = sre.compile( '(.*)(qFatal)\(\s*(.*)\s*\);(.*)' )

debugTable = { "qDebug" : "odebug",
               "qWarning" : "owarn",
               "qError" : "oerr",
               "qFatal" : "ofatal" }

allExpressions = ( qDebugExpression, qWarningExpression, qErrorExpression, qFatalExpression )

####################################################################################################

def convert( fname ):
    print >>sys.stderr, "<NOTE>: Dealing with %s..." % fname

    for line in file( fname ):
        match = False
        for expr in allExpressions:
            m = expr.match( line )
            if m is None:
                continue
            else:
                match = True
                head, debug, content, tail = m.groups()
                print >>sys.stderr, "<NOTE>: Groups = ", m.groups()
                sys.stdout.write( head.strip() )
                sys.stdout.write( debugTable[debug.strip()] )
                sys.stdout.write( " << " )
                sys.stdout.write( transform( content ).strip() )
                sys.stdout.write( " << oendl; " )
                sys.stdout.write( tail + "\n" )
                continue
        # nothing applies
        if not match:
            sys.stdout.write( line + "\n" )

####################################################################################################

def transform( s ):
    print >>sys.stderr, "<NOTE>: Transforming '%s'..." % s

    # check if there is one or more comma's outside of strings
    groups = []
    i = 0
    instring = False
    group = ""
    while i < len( s ):
        if s[i] == '"':
            instring = not instring
        elif s[i] == "," and not instring:
            groups.append( group.strip() )
            group = ""
            i += 1
            continue
        group += s[i]
        i += 1
        continue

    groups.append( group.strip() )

    # check for easy case
    if len( groups ) < 2: return s.replace( "%%", "%" )

    # damn. it gets complicated...
    print >>sys.stderr, "<NOTE>: Comma's outside of strings = %d" % ( len( groups ) -1 )

    formatstring, substitutions = groups[0], groups[1:]
    result = ""

    # iterator over formatstring and substitute format directives (e.g. '%d') with the substitutions
    subst = 0
    i = 0
    indirective = False
    while i < len( formatstring ):
        if formatstring[i] != "%":
            result += formatstring[i]
            i += 1
            continue
        else: # % in formatstring
            indirective = True
            i += 1
            while i < len( formatstring ) and formatstring[i] not in "%dDiouxXfegEscpn":
                i += 1
            if formatstring[i] == "%":
                result += "%"
            else:
                result += '" << %s << "' % substitutions[0]
                del substitutions[0]
            indirective = False
            i += 1

    print >>sys.stderr, "<NOTE>: Result seems to be '%s'" % result
    return result.replace( "%%", "%" )

####################################################################################################

if __name__ == "__main__":
    try:
        fname = sys.argv[1]
    except:
        print >>sys.stderr, "Usage: %s <filename>\n" % sys.argv[0]
    else:
        convert( fname )