1 | """Parse sys/errno.h and Errors.h and create Estr resource"""
|
---|
2 |
|
---|
3 | import re
|
---|
4 | import string
|
---|
5 | from Carbon import Res
|
---|
6 | import os
|
---|
7 |
|
---|
8 | READ = 1
|
---|
9 | WRITE = 2
|
---|
10 | smAllScripts = -3
|
---|
11 |
|
---|
12 | ERRNO_PROG="#define[ \t]+" \
|
---|
13 | "([A-Z0-9a-z_]+)" \
|
---|
14 | "[ \t]+" \
|
---|
15 | "([0-9]+)" \
|
---|
16 | "[ \t]*/\*[ \t]*" \
|
---|
17 | "(.*)" \
|
---|
18 | "[ \t]*\*/"
|
---|
19 |
|
---|
20 | ERRORS_PROG="[ \t]*" \
|
---|
21 | "([A-Z0-9a-z_]+)" \
|
---|
22 | "[ \t]*=[ \t]*" \
|
---|
23 | "([-0-9]+)" \
|
---|
24 | "[, \t]*/\*[ \t]*" \
|
---|
25 | "(.*)" \
|
---|
26 | "[ \t]*\*/"
|
---|
27 |
|
---|
28 | ERRORS_PROG_2="[ \t]*" \
|
---|
29 | "([A-Z0-9a-z_]+)" \
|
---|
30 | "[ \t]*=[ \t]*" \
|
---|
31 | "([-0-9]+)" \
|
---|
32 | "[, \t]*"
|
---|
33 |
|
---|
34 | def Pstring(str):
|
---|
35 | if len(str) > 255:
|
---|
36 | raise ValueError, 'String too large'
|
---|
37 | return chr(len(str))+str
|
---|
38 |
|
---|
39 | def writeestr(dst, edict):
|
---|
40 | """Create Estr resource file given a dictionary of errors."""
|
---|
41 |
|
---|
42 | os.unlink(dst.as_pathname())
|
---|
43 | Res.FSpCreateResFile(dst, 'RSED', 'rsrc', smAllScripts)
|
---|
44 | output = Res.FSpOpenResFile(dst, WRITE)
|
---|
45 | Res.UseResFile(output)
|
---|
46 | for num in edict.keys():
|
---|
47 | res = Res.Resource(Pstring(edict[num][0]))
|
---|
48 | res.AddResource('Estr', num, '')
|
---|
49 | res.WriteResource()
|
---|
50 | Res.CloseResFile(output)
|
---|
51 |
|
---|
52 | def writepython(fp, dict):
|
---|
53 | k = dict.keys()
|
---|
54 | k.sort()
|
---|
55 | for i in k:
|
---|
56 | fp.write("%s\t=\t%d\t#%s\n"%(dict[i][1], i, dict[i][0]))
|
---|
57 |
|
---|
58 |
|
---|
59 | def parse_errno_h(fp, dict):
|
---|
60 | errno_prog = re.compile(ERRNO_PROG)
|
---|
61 | for line in fp.readlines():
|
---|
62 | m = errno_prog.match(line)
|
---|
63 | if m:
|
---|
64 | number = string.atoi(m.group(2))
|
---|
65 | name = m.group(1)
|
---|
66 | desc = string.strip(m.group(3))
|
---|
67 |
|
---|
68 | if not dict.has_key(number):
|
---|
69 | dict[number] = desc, name
|
---|
70 | else:
|
---|
71 | print 'DUPLICATE', number
|
---|
72 | print '\t', dict[number]
|
---|
73 | print '\t', (desc, name)
|
---|
74 |
|
---|
75 | def parse_errors_h(fp, dict):
|
---|
76 | errno_prog = re.compile(ERRORS_PROG)
|
---|
77 | errno_prog_2 = re.compile(ERRORS_PROG_2)
|
---|
78 | for line in fp.readlines():
|
---|
79 | match = 0
|
---|
80 | m = errno_prog.match(line)
|
---|
81 | m2 = errno_prog_2.match(line)
|
---|
82 | if m:
|
---|
83 | number = string.atoi(m.group(2))
|
---|
84 | name = m.group(1)
|
---|
85 | desc = string.strip(m.group(3))
|
---|
86 | match=1
|
---|
87 | elif m2:
|
---|
88 | number = string.atoi(m2.group(2))
|
---|
89 | name = m2.group(1)
|
---|
90 | desc = name
|
---|
91 | match=1
|
---|
92 | if match:
|
---|
93 | if number > 0: continue
|
---|
94 |
|
---|
95 | if not dict.has_key(number):
|
---|
96 | dict[number] = desc, name
|
---|
97 | else:
|
---|
98 | print 'DUPLICATE', number
|
---|
99 | print '\t', dict[number]
|
---|
100 | print '\t', (desc, name)
|
---|
101 | if len(desc) > len(dict[number][0]):
|
---|
102 | print 'Pick second one'
|
---|
103 | dict[number] = desc, name
|
---|
104 |
|
---|
105 | def main():
|
---|
106 | dict = {}
|
---|
107 | pathname = EasyDialogs.AskFileForOpen(message="Where is GUSI sys/errno.h?")
|
---|
108 | if pathname:
|
---|
109 | fp = open(pathname)
|
---|
110 | parse_errno_h(fp, dict)
|
---|
111 | fp.close()
|
---|
112 |
|
---|
113 | pathname = EasyDialogs.AskFileForOpen(message="Select cerrno (MSL) or cancel")
|
---|
114 | if pathname:
|
---|
115 | fp = open(pathname)
|
---|
116 | parse_errno_h(fp, dict)
|
---|
117 | fp.close()
|
---|
118 |
|
---|
119 | pathname = EasyDialogs.AskFileForOpen(message="Where is MacErrors.h?")
|
---|
120 | if pathname:
|
---|
121 | fp = open(pathname)
|
---|
122 | parse_errors_h(fp, dict)
|
---|
123 | fp.close()
|
---|
124 |
|
---|
125 | pathname = EasyDialogs.AskFileForOpen(message="Where is mkestrres-MacErrors.h?")
|
---|
126 | if pathname:
|
---|
127 | fp = open(pathname)
|
---|
128 | parse_errors_h(fp, dict)
|
---|
129 | fp.close()
|
---|
130 |
|
---|
131 | if not dict:
|
---|
132 | return
|
---|
133 |
|
---|
134 | pathname = EasyDialogs.AskFileForSave(message="Resource output file?", savedFileName="errors.rsrc")
|
---|
135 | if pathname:
|
---|
136 | writeestr(fss, dict)
|
---|
137 |
|
---|
138 | pathname = EasyDialogs.AskFileForSave(message="Python output file?", savedFileName="macerrors.py")
|
---|
139 | if pathname:
|
---|
140 | fp = open(pathname, "w")
|
---|
141 | writepython(fp, dict)
|
---|
142 | fp.close()
|
---|
143 | fss.SetCreatorType('Pyth', 'TEXT')
|
---|
144 |
|
---|
145 | pathname = EasyDialogs.AskFileForSave(message="Text output file?", savedFileName="errors.txt")
|
---|
146 | if pathname:
|
---|
147 | fp = open(pathname, "w")
|
---|
148 |
|
---|
149 | k = dict.keys()
|
---|
150 | k.sort()
|
---|
151 | for i in k:
|
---|
152 | fp.write("%d\t%s\t%s\n"%(i, dict[i][1], dict[i][0]))
|
---|
153 | fp.close()
|
---|
154 |
|
---|
155 |
|
---|
156 | if __name__ == '__main__':
|
---|
157 | main()
|
---|