#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import re reserved_words = [ "if", "for", "switch", "return", "while", "else", ] #PATTERN = r"([a-zA-Z_]\w*)\s+([a-zA-Z_]\w*)\s*\(([^;]*)\)\s*\{" #PATTERN = r"((?:[a-zA-Z_]\w*)\s+)+?([a-zA-Z_]\w*)\s*\(([^;]*)\)\s*\{" PATTERN = r"([a-zA-Z_][\w\s]*\**)\s([a-zA-Z_]\w*)\s*\(([^/;]*)\)\s*\{" # TODO: 関数パラメータ内にコメントがあると正しく動かない! PROG = re.compile(PATTERN, re.S) def truncate_comments(data): pass def check_reserved_word(decl): """ return true if decl's type and name is not reserved word. """ if decl["name"] in reserved_words or decl["type"] in reserved_words: return False return True def read_decls(file): declarators = [] # open the file and read all lines into a string. try: fo = open(file, 'r') lines = fo.readlines() data = "".join(lines) truncate_comments(data) except IOError: print "cannot read file %s" % file # find all matched strings. # moiter is iterator of MatchObject. moiter = PROG.finditer(data) for mo in moiter: tmp = { "type": mo.group(1), "name": mo.group(2), "parms": mo.group(3), "offset": mo.start() } if check_reserved_word(tmp): declarators.append(tmp) return declarators def debug_print(decl): for (key,value) in decl.items(): if isinstance(value, str): decl[key] = value.replace("\n"," ").replace("\t"," ") print "Type:\t%s" % decl["type"] print "Name:\t%s" % decl["name"] print "Params:\t%s" % decl["parms"] print "offset:\t%d" % decl["offset"] print "" #s = "%s %s ( %s );" % (decl["type"], decl["name"], decl["parms"]) #print s, "/* offset: %d */" % decl["offset"] def format_print(decl, file): for (key,value) in decl.items(): if isinstance(value, str): decl[key] = value.replace("\n"," ").replace("\t"," ") print "/* defined in file %s at offset %d */" % (file,decl["offset"]) print "%s %s (%s);" % (decl["type"],decl["name"],decl["parms"]) print "" def main(): for file in sys.argv[1:]: decls = read_decls(file) if decls==None or len(decls)==0: print "%s have no function definition!" % file continue for decl in decls: #debug_print(decl) format_print(decl, file) #print decls[0] main()