annotate CbC-scripts/make_headers.py @ 144:8f4e72ab4e11

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