diff --git a/cpp2python.py b/cpp2python.py index 5888b27..22bb5d1 100755 --- a/cpp2python.py +++ b/cpp2python.py @@ -37,6 +37,9 @@ import os.path import re +class_lines = {'_function_':[]} +class_name = None + def is_source(filename): suffixes = ('.cpp', '.c', '.cxx', '.c++', '.cc', '.h', '.hpp', '.hxx', '.h++') for s in suffixes: @@ -45,6 +48,9 @@ def is_source(filename): return False def process_line(line): + global class_name + + line = re.sub('([^\w]+)(from)([^\w]+)', '\\1_from\\3', line) """ remove semicolons @@ -187,6 +193,13 @@ def process_line(line): -bool pMonkeyStudio::isSameFile( const QString& left, const QString& right ) +pMonkeyStudio::isSameFile( const QString& left, const QString& right ): """ + + matches = re.findall('^[\w:&<>\*]+\s+((\w+)::)?(\w+)\(([^\)]*\))$', line) + if len(matches) > 0: + class_name = matches[0][1] + if not class_lines.has_key(class_name): + class_lines[class_name] = [] + print class_name, matches line = re.sub('^[\w:&<>\*]+\s+([\w:]+)\(([^\)]*\))$', 'def \\1(self, \\2:', line) """ after previous replacement fix "(self, )" to "(self)" @@ -224,6 +237,9 @@ def process_line(line): """ line = re.sub('::', '.', line) + # remove & (reference opeartor or address-of opeartor) + line = re.sub('&', '', line) + """ replace 'else if' with 'elif' else if (blabla) @@ -257,6 +273,9 @@ def process_line(line): """ line = re.sub('([^\w])this([^\w])', '\\1self\\2', line) + # convert for loop to while loop (need improvement: indentation, the third part cannot include another parentheses) + line = re.sub('(\s*)for\s*\(([^;]*?);([^;]*?);\s*([^\)]*?)\)', '\\1# generated while loop\n\\1 \\2\n\\1 while(\\3):\n\\1 \\4', line) + """ Replace Qt foreach macro with Python for -foreach ( QMdiSubWindow* window, a.subWindowList() ) +foreach ( QMdiSubWindow* window, a.subWindowList() ) @@ -279,7 +298,12 @@ def process_line(line): 'S[A-Z]+\s*\(\s*([\w\d]+)[^\)]+\)\s*\)\s*\)', '\\1.\\2.connect(\\3.\\4)', line) - return line + if class_name is not None: + # because in above code there are many rules which will produce empty lines, and they will produce incorrect identation in generated code + if len(line)>0: + class_lines[class_name].append(line) + else: + class_lines['_function_'].append(line) def process_file(in_filename, out_filename): """ @@ -289,8 +313,12 @@ def process_file(in_filename, out_filename): lines = file.readlines() # probably would die on sources more than 100 000 lines :D with open(out_filename, 'w+') as file: for line in lines: - file.write(process_line(line)) - + process_line(line) + for c in class_lines.keys(): + file.write('class %s:\r\n' % c) + for line in class_lines[c]: + file.write(' '+line) + print class_lines def main(): if '--help' in sys.argv or \ @@ -300,7 +328,7 @@ def main(): print(help) sys.exit(0) if len (sys.argv) != 2: - print('Invalid parameters count. Must be 1', file=sys.stderr) + print >> sys.stderr, 'Invalid parameters count. Must be 1' print(help) sys.exit(-1) if os.path.isdir(sys.argv[1]): @@ -313,7 +341,7 @@ def main(): elif os.path.isfile(sys.argv[1]): process_file(sys.argv[1], sys.argv[1] + '.py') else: - print('Not a file or directory', sys.argv[1], file=sys.stderr) + print >> sys.stderr, 'Not a file or directory', sys.argv[1] sys.exit(-1) if __name__ == '__main__':