annotate CbC-scripts/make_headers.py2 @ 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 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
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 = 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
10 #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
11 PATTERN = r"([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
12 # TODO: 関数パラメータ内にコメントがあると正しく動かない!
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 def truncate_comments(data):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 pass
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 check_reserved_word(decl):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 """ 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
20
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 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
22 return False
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 return True
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 def read_decls(file):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 declarators = []
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 # 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
29 try:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 fo = open(file, 'r')
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 lines = fo.readlines()
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 data = "".join(lines)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 truncate_comments(data)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 except IOError:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 print "cannot read file %s" % file
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 # find all matched strings.
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 # moiter is iterator of MatchObject.
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 moiter = PROG.finditer(data)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 for mo in moiter:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 tmp = { "type": mo.group(1),
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 "name": mo.group(2),
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 "parms": mo.group(3),
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 "offset": mo.start() }
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 if check_reserved_word(tmp):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 declarators.append(tmp)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 return declarators
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 def debug_print(decl):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 for (key,value) in decl.items():
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 if isinstance(value, str):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 decl[key] = value.replace("\n"," ").replace("\t"," ")
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 print "Type:\t%s" % decl["type"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 print "Name:\t%s" % decl["name"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 print "Params:\t%s" % decl["parms"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 print "offset:\t%d" % decl["offset"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 print ""
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 #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
61 #print s, "/* offset: %d */" % decl["offset"]
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 def format_print(decl, file):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 for (key,value) in decl.items():
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 if isinstance(value, str):
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 decl[key] = value.replace("\n"," ").replace("\t"," ")
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 print "/* defined in file %s at offset %d */" % (file,decl["offset"])
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 print "%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
70 print ""
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 def main():
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 for file in sys.argv[1:]:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 decls = read_decls(file)
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 if decls==None or len(decls)==0:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 print "%s have no function definition!" % file
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 continue
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 for decl in decls:
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 #debug_print(decl)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 format_print(decl, file)
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 #print decls[0]
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
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 main()
b388631e4738 add make_headers script.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86