blob: a1a6049ebc68ddd5052c94b7b92254af34e6bf97 [file] [log] [blame]
Jack Jansenac4d8691996-09-05 15:22:16 +00001"""Parse sys/errno.h and Errors.h and create Estr resource"""
2
3import regex
4import macfs
Guido van Rossum3c3eda21995-02-05 17:01:45 +00005import string
Jack Jansenac4d8691996-09-05 15:22:16 +00006import Res
7import os
Guido van Rossum3c3eda21995-02-05 17:01:45 +00008
9READ = 1
10WRITE = 2
11smAllScripts = -3
12
Jack Jansenac4d8691996-09-05 15:22:16 +000013ERRNO_PROG="#define[ \t]+" \
14 "\([A-Z0-9a-z_]+\)" \
15 "[ \t]+" \
16 "\([0-9]+\)" \
17 "[ \t]*/\*[ \t]*" \
18 "\(.*\)" \
19 "[ \t]*\*/"
20
21ERRORS_PROG="[ \t]*" \
22 "\([A-Z0-9a-z_]+\)" \
23 "[ \t]*=[ \t]*" \
24 "\([-0-9]+\)" \
25 "[, \t]*/\*[ \t]*" \
26 "\(.*\)" \
27 "[ \t]*\*/"
Jack Jansen955a2f51998-04-21 15:27:45 +000028
29ERRORS_PROG_2="[ \t]*" \
30 "\([A-Z0-9a-z_]+\)" \
31 "[ \t]*=[ \t]*" \
32 "\([-0-9]+\)" \
33 "[, \t]*"
Jack Jansenac4d8691996-09-05 15:22:16 +000034
Guido van Rossum3c3eda21995-02-05 17:01:45 +000035def Pstring(str):
36 if len(str) > 255:
37 raise ValueError, 'String too large'
38 return chr(len(str))+str
39
40def writeestr(dst, edict):
41 """Create Estr resource file given a dictionary of errors."""
42
Jack Jansenac4d8691996-09-05 15:22:16 +000043 os.unlink(dst.as_pathname())
44 Res.FSpCreateResFile(dst, 'RSED', 'rsrc', smAllScripts)
45 output = Res.FSpOpenResFile(dst, WRITE)
46 Res.UseResFile(output)
Guido van Rossum3c3eda21995-02-05 17:01:45 +000047 for num in edict.keys():
Jack Jansenac4d8691996-09-05 15:22:16 +000048 res = Res.Resource(Pstring(edict[num][0]))
Guido van Rossum3c3eda21995-02-05 17:01:45 +000049 res.AddResource('Estr', num, '')
50 res.WriteResource()
Jack Jansenac4d8691996-09-05 15:22:16 +000051 Res.CloseResFile(output)
Guido van Rossum3c3eda21995-02-05 17:01:45 +000052
Jack Jansenac4d8691996-09-05 15:22:16 +000053def writepython(fp, dict):
54 k = dict.keys()
55 k.sort()
56 for i in k:
57 fp.write("%s\t=\t%d\t#%s\n"%(dict[i][1], i, dict[i][0]))
58
59
60def parse_errno_h(fp, dict):
61 errno_prog = regex.compile(ERRNO_PROG)
62 for line in fp.readlines():
63 if errno_prog.match(line) > 0:
64 number = string.atoi(errno_prog.group(2))
65 name = errno_prog.group(1)
66 desc = string.strip(errno_prog.group(3))
Guido van Rossum3c3eda21995-02-05 17:01:45 +000067
Jack Jansenac4d8691996-09-05 15:22:16 +000068 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
75def parse_errors_h(fp, dict):
76 errno_prog = regex.compile(ERRORS_PROG)
Jack Jansen955a2f51998-04-21 15:27:45 +000077 errno_prog_2 = regex.compile(ERRORS_PROG_2)
Jack Jansenac4d8691996-09-05 15:22:16 +000078 for line in fp.readlines():
Jack Jansen955a2f51998-04-21 15:27:45 +000079 match = 0
Jack Jansenac4d8691996-09-05 15:22:16 +000080 if errno_prog.match(line) > 0:
81 number = string.atoi(errno_prog.group(2))
82 name = errno_prog.group(1)
83 desc = string.strip(errno_prog.group(3))
Jack Jansen955a2f51998-04-21 15:27:45 +000084 match=1
85 elif errno_prog_2.match(line) > 0:
86 number = string.atoi(errno_prog_2.group(2))
87 name = errno_prog_2.group(1)
88 desc = name
89 match=1
90 if match:
Jack Jansenac4d8691996-09-05 15:22:16 +000091 if number > 0: continue
92
93 if not dict.has_key(number):
94 dict[number] = desc, name
95 else:
96 print 'DUPLICATE', number
97 print '\t', dict[number]
98 print '\t', (desc, name)
Jack Jansen955a2f51998-04-21 15:27:45 +000099 if len(desc) > len(dict[number][0]):
100 print 'Pick second one'
101 dict[number] = desc, name
Jack Jansenac4d8691996-09-05 15:22:16 +0000102
103def main():
104 dict = {}
105 fss, ok = macfs.PromptGetFile("Where is errno.h?")
106 if not ok: return
107 fp = open(fss.as_pathname())
108 parse_errno_h(fp, dict)
109 fp.close()
110
Jack Jansenb83b46d1997-05-15 11:18:13 +0000111 fss, ok = macfs.PromptGetFile("Select 2nd errno.h or cancel")
112 if not ok: return
113 fp = open(fss.as_pathname())
114 parse_errno_h(fp, dict)
115 fp.close()
116
Jack Jansenac4d8691996-09-05 15:22:16 +0000117 fss, ok = macfs.PromptGetFile("Where is Errors.h?")
118 if not ok: return
119 fp = open(fss.as_pathname())
120 parse_errors_h(fp, dict)
121 fp.close()
122
123 if not dict:
124 return
125
126 fss, ok = macfs.StandardPutFile("Resource output file?", "errors.rsrc")
127 if ok:
128 writeestr(fss, dict)
129
130 fss, ok = macfs.StandardPutFile("Python output file?", "macerrors.py")
131 if ok:
132 fp = open(fss.as_pathname(), "w")
133 writepython(fp, dict)
134 fp.close()
135 fss.SetCreatorType('Pyth', 'TEXT')
136
137 fss, ok = macfs.StandardPutFile("Text output file?", "errors.txt")
138 if ok:
139 fp = open(fss.as_pathname(), "w")
140
141 k = dict.keys()
142 k.sort()
143 for i in k:
144 fp.write("%d\t%s\t%s\n"%(i, dict[i][1], dict[i][0]))
145 fp.close()
146
Guido van Rossum3c3eda21995-02-05 17:01:45 +0000147
148if __name__ == '__main__':
Jack Jansenac4d8691996-09-05 15:22:16 +0000149 main()
150