mkestrres.py 3.3 KB
Newer Older
1 2
"""Parse sys/errno.h and Errors.h and create Estr resource"""

Jack Jansen's avatar
Jack Jansen committed
3
import re
4
import macfs
5
import string
6
from Carbon import Res
7
import os
8 9 10 11 12

READ = 1
WRITE = 2
smAllScripts = -3

13
ERRNO_PROG="#define[ \t]+" \
Jack Jansen's avatar
Jack Jansen committed
14
		   "([A-Z0-9a-z_]+)" \
15
		   "[ \t]+" \
Jack Jansen's avatar
Jack Jansen committed
16
		   "([0-9]+)" \
17
		   "[ \t]*/\*[ \t]*" \
Jack Jansen's avatar
Jack Jansen committed
18
		   "(.*)" \
19 20 21
		   "[ \t]*\*/"
		   
ERRORS_PROG="[ \t]*" \
Jack Jansen's avatar
Jack Jansen committed
22
			"([A-Z0-9a-z_]+)" \
23
			"[ \t]*=[ \t]*" \
Jack Jansen's avatar
Jack Jansen committed
24
			"([-0-9]+)" \
25
			"[, \t]*/\*[ \t]*" \
Jack Jansen's avatar
Jack Jansen committed
26
			"(.*)" \
27
			"[ \t]*\*/"
28 29
		   
ERRORS_PROG_2="[ \t]*" \
Jack Jansen's avatar
Jack Jansen committed
30
			"([A-Z0-9a-z_]+)" \
31
			"[ \t]*=[ \t]*" \
Jack Jansen's avatar
Jack Jansen committed
32
			"([-0-9]+)" \
33
			"[, \t]*"
34

35 36 37 38 39 40 41 42
def Pstring(str):
	if len(str) > 255:
		raise ValueError, 'String too large'
	return chr(len(str))+str
	
def writeestr(dst, edict):
	"""Create Estr resource file given a dictionary of errors."""
	
43 44 45 46
	os.unlink(dst.as_pathname())
	Res.FSpCreateResFile(dst, 'RSED', 'rsrc', smAllScripts)
	output = Res.FSpOpenResFile(dst, WRITE)
	Res.UseResFile(output)
47
	for num in edict.keys():
48
		res = Res.Resource(Pstring(edict[num][0]))
49 50
		res.AddResource('Estr', num, '')
		res.WriteResource()
51 52 53 54 55 56 57 58 59 60
	Res.CloseResFile(output)
	
def writepython(fp, dict):
	k = dict.keys()
	k.sort()
	for i in k:
		fp.write("%s\t=\t%d\t#%s\n"%(dict[i][1], i, dict[i][0]))
	

def parse_errno_h(fp, dict):
Jack Jansen's avatar
Jack Jansen committed
61
	errno_prog = re.compile(ERRNO_PROG)
62
	for line in fp.readlines():
Jack Jansen's avatar
Jack Jansen committed
63 64 65 66 67
		m = errno_prog.match(line)
		if m:
			number = string.atoi(m.group(2))
			name = m.group(1)
			desc = string.strip(m.group(3))
68
			
69 70 71 72 73 74 75 76
			if not dict.has_key(number):
				dict[number] = desc, name
			else:
				print 'DUPLICATE', number
				print '\t', dict[number]
				print '\t', (desc, name)
								
def parse_errors_h(fp, dict):
Jack Jansen's avatar
Jack Jansen committed
77 78
	errno_prog = re.compile(ERRORS_PROG)
	errno_prog_2 = re.compile(ERRORS_PROG_2)
79
	for line in fp.readlines():
80
		match = 0
Jack Jansen's avatar
Jack Jansen committed
81 82 83 84 85 86
		m = errno_prog.match(line)
		m2 = errno_prog_2.match(line)
		if m:
			number = string.atoi(m.group(2))
			name = m.group(1)
			desc = string.strip(m.group(3))
87
			match=1
Jack Jansen's avatar
Jack Jansen committed
88 89 90
		elif m2:
			number = string.atoi(m2.group(2))
			name = m2.group(1)
91 92 93
			desc = name
			match=1
		if match:
94 95 96 97 98 99 100 101
			if number > 0: continue
			
			if not dict.has_key(number):
				dict[number] = desc, name
			else:
				print 'DUPLICATE', number
				print '\t', dict[number]
				print '\t', (desc, name)
102 103 104
				if len(desc) > len(dict[number][0]):
					print 'Pick second one'
					dict[number] = desc, name
105 106 107
			
def main():
	dict = {}
108
	fss, ok = macfs.PromptGetFile("Where is GUSI sys/errno.h?")
109 110 111 112 113
	if not ok: return
	fp = open(fss.as_pathname())
	parse_errno_h(fp, dict)
	fp.close()
	
114
	fss, ok = macfs.PromptGetFile("Select cerrno (MSL) or cancel")
115 116 117 118 119
	if not ok: return
	fp = open(fss.as_pathname())
	parse_errno_h(fp, dict)
	fp.close()
	
120
	fss, ok = macfs.PromptGetFile("Where is MacErrors.h?")
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
	if not ok: return
	fp = open(fss.as_pathname())
	parse_errors_h(fp, dict)
	fp.close()
	
	if not dict:
		return
		
	fss, ok = macfs.StandardPutFile("Resource output file?", "errors.rsrc")
	if ok:
		writeestr(fss, dict)
	
	fss, ok = macfs.StandardPutFile("Python output file?", "macerrors.py")
	if ok:
		fp = open(fss.as_pathname(), "w")
		writepython(fp, dict)
		fp.close()
		fss.SetCreatorType('Pyth', 'TEXT')

	fss, ok = macfs.StandardPutFile("Text output file?", "errors.txt")
	if ok:
		fp = open(fss.as_pathname(), "w")
		
		k = dict.keys()
		k.sort()
		for i in k:
			fp.write("%d\t%s\t%s\n"%(i, dict[i][1], dict[i][0]))
		fp.close()

150 151
	
if __name__ == '__main__':
152 153
	main()