annotate CbC-scripts/make_headers.py2 @ 27:f9b1a53df341

implemented indirect sibcall for ppc.
author kent@teto.cr.ie.u-ryukyu.ac.jp
date Tue, 10 Nov 2009 16:34:29 +0900
parents b388631e4738
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #!/usr/bin/env python
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 import sys
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 import re
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
6 import getopt
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 reserved_words = [ "if", "for", "switch", "return", "while", "else", ]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
10 PATTERN = r"([a-zA-Z_][\w\s]*\**)\s([a-zA-Z_]\w*)\s*\(([^\{/;]*)\)\s*\{"
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 #PATTERN = r"([a-zA-Z_]\w*)\s+([a-zA-Z_]\w*)\s*\(([^;]*)\)\s*\{"
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 #PATTERN = r"((?:[a-zA-Z_]\w*)\s+)+?([a-zA-Z_]\w*)\s*\(([^;]*)\)\s*\{"
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 # TODO: 関数パラメータ内にコメントがあると正しく動かない!
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 PROG = re.compile(PATTERN, re.S)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
16 omit_static=False
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
17 add_extern=""
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
18
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 def truncate_comments(data):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 pass
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 def check_reserved_word(decl):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 """ return true if decl's type and name is not reserved word. """
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 if decl["name"] in reserved_words or decl["type"] in reserved_words:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 return False
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 return True
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 def read_decls(file):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 declarators = []
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 # open the file and read all lines into a string.
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 try:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 fo = open(file, 'r')
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 lines = fo.readlines()
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 data = "".join(lines)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 truncate_comments(data)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 except IOError:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 print "cannot read file %s" % file
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
40 return None
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 # find all matched strings.
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 # moiter is iterator of MatchObject.
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 moiter = PROG.finditer(data)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 for mo in moiter:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 tmp = { "type": mo.group(1),
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 "name": mo.group(2),
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 "parms": mo.group(3),
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 "offset": mo.start() }
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 if check_reserved_word(tmp):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 declarators.append(tmp)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 return declarators
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 def debug_print(decl):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 for (key,value) in decl.items():
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 if isinstance(value, str):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 decl[key] = value.replace("\n"," ").replace("\t"," ")
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 print "Type:\t%s" % decl["type"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 print "Name:\t%s" % decl["name"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 print "Params:\t%s" % decl["parms"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 print "offset:\t%d" % decl["offset"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 print ""
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 #s = "%s %s ( %s );" % (decl["type"], decl["name"], decl["parms"])
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 #print s, "/* offset: %d */" % decl["offset"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 def format_print(decl, file):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 for (key,value) in decl.items():
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 if isinstance(value, str):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 decl[key] = value.replace("\n"," ").replace("\t"," ")
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 print "/* defined in file %s at offset %d */" % (file,decl["offset"])
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
74 print "%s%s %s (%s);" % (add_extern, decl["type"],decl["name"],decl["parms"])
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 print ""
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
77 def getoptions():
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
78 global omit_static, add_extern
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
79
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
80 try:
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
81 opts, args = getopt.getopt(sys.argv[1:], 'se', [ 'omit-static', 'add-extern' ])
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
82 except getopt.GetoptError:
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
83 print(err)
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
84 usage()
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
85 sys.exit(2)
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
86
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
87 for opt,a in opts:
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
88 if opt in ("-s", "--omit-static"):
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
89 omit_static=True
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
90 elif opt in ("-e", "--add-extern"):
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
91 add_extern="extern "
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
92 else:
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
93 print("unhandled option {0}".format(opt))
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
94 usage()
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
95
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
96 return args
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
97
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
98 def usage():
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
99 print( """\
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
100 Usage: {0:s} OPION... [FILE]...
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
101 OPTIONS:
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
102 -s, --omit-static omit static functions
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
103 -e, --add-extern add extern to all function declarations
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
104 """.format(sys.argv[0]))
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
105
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 def main():
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
107 # option handling.
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
108 args = getoptions()
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
109
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
110 for file in args:
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
111 # read function declaration from each file.
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 decls = read_decls(file)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 if decls==None or len(decls)==0:
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
114 # no function found.
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 print "%s have no function definition!" % file
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 continue
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
117
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 for decl in decls:
27
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
119 if omit_static and 0 <= decl["type"].find("static"):
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
120 # static function is ignored.
f9b1a53df341 implemented indirect sibcall for ppc.
kent@teto.cr.ie.u-ryukyu.ac.jp
parents: 26
diff changeset
121 continue
26
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 #debug_print(decl)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 format_print(decl, file)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 main()
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126