PageRenderTime 92ms CodeModel.GetById 39ms app.highlight 20ms RepoModel.GetById 30ms app.codeStats 0ms

/Tools/bgen/bgen/macsupport.py

http://unladen-swallow.googlecode.com/
Python | 197 lines | 189 code | 5 blank | 3 comment | 0 complexity | a2895c9b35516be8899308036a0ed407 MD5 | raw file
  1"""\
  2Augment the "bgen" package with definitions that are useful on the Apple Macintosh.
  3
  4Intended usage is "from macsupport import *" -- this implies all bgen's goodies.
  5"""
  6
  7
  8# Import everything from bgen (for ourselves as well as for re-export)
  9from bgen import *
 10
 11
 12# Simple types
 13Boolean = Type("Boolean", "b")
 14SignedByte = Type("SignedByte", "b")
 15Size = Type("Size", "l")
 16Style = Type("Style", "b")
 17StyleParameter = Type("StyleParameter", "h")
 18CharParameter = Type("CharParameter", "h")
 19TextEncoding = Type("TextEncoding", "l")
 20ByteCount = Type("ByteCount", "l")
 21Duration = Type("Duration", "l")
 22ByteOffset = Type("ByteOffset", "l")
 23OptionBits = Type("OptionBits", "l")
 24ItemCount = Type("ItemCount", "l")
 25PBVersion = Type("PBVersion", "l")
 26ScriptCode = Type("ScriptCode", "h")
 27LangCode = Type("LangCode", "h")
 28RegionCode = Type("RegionCode", "h")
 29
 30UInt8 = Type("UInt8", "b")
 31SInt8 = Type("SInt8", "b")
 32UInt16 = Type("UInt16", "H")
 33SInt16 = Type("SInt16", "h")
 34UInt32 = Type("UInt32", "l")
 35SInt32 = Type("SInt32", "l")
 36Float32 = Type("Float32", "f")
 37
 38wide = OpaqueByValueType("wide", "PyMac_Buildwide", "PyMac_Getwide")
 39wide_ptr = OpaqueType("wide", "PyMac_Buildwide", "PyMac_Getwide")
 40
 41# Pascal strings
 42ConstStr255Param = OpaqueArrayType("Str255", "PyMac_BuildStr255", "PyMac_GetStr255")
 43Str255 = OpaqueArrayType("Str255", "PyMac_BuildStr255", "PyMac_GetStr255")
 44StringPtr = OpaqueByValueType("StringPtr", "PyMac_BuildStr255", "PyMac_GetStr255")
 45ConstStringPtr = StringPtr
 46
 47# File System Specifications
 48FSSpec_ptr = OpaqueType("FSSpec", "PyMac_BuildFSSpec", "PyMac_GetFSSpec")
 49FSSpec = OpaqueByValueStructType("FSSpec", "PyMac_BuildFSSpec", "PyMac_GetFSSpec")
 50FSRef_ptr = OpaqueType("FSRef", "PyMac_BuildFSRef", "PyMac_GetFSRef")
 51FSRef = OpaqueByValueStructType("FSRef", "PyMac_BuildFSRef", "PyMac_GetFSRef")
 52
 53# OSType and ResType: 4-byte character strings
 54def OSTypeType(typename):
 55    return OpaqueByValueType(typename, "PyMac_BuildOSType", "PyMac_GetOSType")
 56OSType = OSTypeType("OSType")
 57ResType = OSTypeType("ResType")
 58FourCharCode = OSTypeType("FourCharCode")
 59
 60# Version numbers
 61NumVersion = OpaqueByValueType("NumVersion", "PyMac_BuildNumVersion", "BUG")
 62
 63# Handles (always resources in our case)
 64Handle = OpaqueByValueType("Handle", "ResObj")
 65MenuHandle = OpaqueByValueType("MenuHandle", "MenuObj")
 66MenuRef = MenuHandle
 67ControlHandle = OpaqueByValueType("ControlHandle", "CtlObj")
 68ControlRef = ControlHandle
 69
 70# Windows and Dialogs
 71WindowPtr = OpaqueByValueType("WindowPtr", "WinObj")
 72WindowRef = WindowPtr
 73DialogPtr = OpaqueByValueType("DialogPtr", "DlgObj")
 74DialogRef = DialogPtr
 75ExistingWindowPtr = OpaqueByValueType("WindowPtr", "WinObj_WhichWindow", "BUG")
 76ExistingDialogPtr = OpaqueByValueType("DialogPtr", "DlgObj_WhichDialog", "BUG")
 77
 78# NULL pointer passed in as optional storage -- not present in Python version
 79NullStorage = FakeType("(void *)0")
 80
 81# More standard datatypes
 82Fixed = OpaqueByValueType("Fixed", "PyMac_BuildFixed", "PyMac_GetFixed")
 83
 84# Quickdraw data types
 85Rect = Rect_ptr = OpaqueType("Rect", "PyMac_BuildRect", "PyMac_GetRect")
 86Point = OpaqueByValueType("Point", "PyMac_BuildPoint", "PyMac_GetPoint")
 87Point_ptr = OpaqueType("Point", "PyMac_BuildPoint", "PyMac_GetPoint")
 88
 89# Event records
 90EventRecord = OpaqueType("EventRecord", "PyMac_BuildEventRecord", "PyMac_GetEventRecord")
 91EventRecord_ptr = EventRecord
 92
 93# CoreFoundation datatypes
 94CFTypeRef = OpaqueByValueType("CFTypeRef", "CFTypeRefObj")
 95CFStringRef = OpaqueByValueType("CFStringRef", "CFStringRefObj")
 96CFMutableStringRef = OpaqueByValueType("CFMutableStringRef", "CFMutableStringRefObj")
 97CFArrayRef = OpaqueByValueType("CFArrayRef", "CFArrayRefObj")
 98CFMutableArrayRef = OpaqueByValueType("CFMutableArrayRef", "CFMutableArrayRefObj")
 99CFDictionaryRef = OpaqueByValueType("CFDictionaryRef", "CFDictionaryRefObj")
100CFMutableDictionaryRef = OpaqueByValueType("CFMutableDictionaryRef", "CFMutableDictionaryRefObj")
101CFURLRef = OpaqueByValueType("CFURLRef", "CFURLRefObj")
102OptionalCFURLRef = OpaqueByValueType("CFURLRef", "OptionalCFURLRefObj")
103
104# OSErr is special because it is turned into an exception
105# (Could do this with less code using a variant of mkvalue("O&")?)
106class OSErrType(Type):
107    def errorCheck(self, name):
108        Output("if (%s != noErr) return PyMac_Error(%s);", name, name)
109        self.used = 1
110OSErr = OSErrType("OSErr", 'h')
111OSStatus = OSErrType("OSStatus", 'l')
112
113
114# Various buffer types
115
116InBuffer = VarInputBufferType('char', 'long', 'l')      # (buf, len)
117UcharInBuffer  = VarInputBufferType('unsigned char', 'long', 'l')       # (buf, len)
118OptionalInBuffer = OptionalVarInputBufferType('char', 'long', 'l')      # (buf, len)
119
120InOutBuffer = HeapInputOutputBufferType('char', 'long', 'l')    # (inbuf, outbuf, len)
121VarInOutBuffer = VarHeapInputOutputBufferType('char', 'long', 'l') # (inbuf, outbuf, &len)
122
123OutBuffer = HeapOutputBufferType('char', 'long', 'l')       # (buf, len)
124VarOutBuffer = VarHeapOutputBufferType('char', 'long', 'l') # (buf, &len)
125VarVarOutBuffer = VarVarHeapOutputBufferType('char', 'long', 'l') # (buf, len, &len)
126
127# Unicode arguments sometimes have reversed len, buffer (don't understand why Apple did this...)
128class VarUnicodeInputBufferType(VarInputBufferType):
129
130    def getargsFormat(self):
131        return "u#"
132
133class VarUnicodeReverseInputBufferType(ReverseInputBufferMixin, VarUnicodeInputBufferType):
134    pass
135
136UnicodeInBuffer = VarUnicodeInputBufferType('UniChar', 'UniCharCount', 'l')
137UnicodeReverseInBuffer = VarUnicodeReverseInputBufferType('UniChar', 'UniCharCount', 'l')
138UniChar_ptr = InputOnlyType("UniCharPtr", "u")
139
140
141# Predefine various pieces of program text to be passed to Module() later:
142
143# Stuff added immediately after the system include files
144includestuff = """
145#include "pymactoolbox.h"
146
147/* Macro to test whether a weak-loaded CFM function exists */
148#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\\
149        PyErr_SetString(PyExc_NotImplementedError, \\
150        "Not available in this shared library/OS version"); \\
151        return NULL; \\
152    }} while(0)
153
154"""
155
156# Stuff added just before the module's init function
157finalstuff = """
158"""
159
160# Stuff added inside the module's init function
161initstuff = """
162"""
163
164
165# Generator classes with a twist -- if the function returns OSErr,
166# its mode is manipulated so that it turns into an exception or disappears
167# (and its name is changed to _err, for documentation purposes).
168# This requires that the OSErr type (defined above) has a non-trivial
169# errorCheck method.
170class OSErrMixIn:
171    "Mix-in class to treat OSErr/OSStatus return values special"
172    def makereturnvar(self):
173        if self.returntype.__class__ == OSErrType:
174            return Variable(self.returntype, "_err", ErrorMode)
175        else:
176            return Variable(self.returntype, "_rv", OutMode)
177
178class OSErrFunctionGenerator(OSErrMixIn, FunctionGenerator): pass
179class OSErrMethodGenerator(OSErrMixIn, MethodGenerator): pass
180
181class WeakLinkMixIn:
182    "Mix-in to test the function actually exists (!= NULL) before calling"
183
184    def precheck(self):
185        Output('#ifndef %s', self.name)
186        Output('PyMac_PRECHECK(%s);', self.name)
187        Output('#endif')
188
189class WeakLinkFunctionGenerator(WeakLinkMixIn, FunctionGenerator): pass
190class WeakLinkMethodGenerator(WeakLinkMixIn, MethodGenerator): pass
191class OSErrWeakLinkFunctionGenerator(OSErrMixIn, WeakLinkMixIn, FunctionGenerator): pass
192class OSErrWeakLinkMethodGenerator(OSErrMixIn, WeakLinkMixIn, MethodGenerator): pass
193
194class MacModule(Module):
195    "Subclass which gets the exception initializer from macglue.c"
196    def exceptionInitializer(self):
197        return "PyMac_GetOSErrException()"