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