annotate CbC-scripts/make_headers.py @ 26:b388631e4738

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