/Mac/Modules/mlte/mltesupport.py

http://unladen-swallow.googlecode.com/ · Python · 202 lines · 151 code · 29 blank · 22 comment · 3 complexity · 7c4a01d4845b11ba50616ff744c3db32 MD5 · raw file

  1. # This script generates a Python interface for an Apple Macintosh Manager.
  2. # It uses the "bgen" package to generate C code.
  3. # The function specifications are generated by scanning the mamager's header file,
  4. # using the "scantools" package (customized for this particular manager).
  5. #error missing SetActionFilter
  6. import string
  7. # Declarations that change for each manager
  8. MODNAME = '_Mlte' # The name of the module
  9. # The following is *usually* unchanged but may still require tuning
  10. MODPREFIX = 'Mlte' # The prefix for module-wide routines
  11. INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
  12. OUTPUTFILE = MODNAME + "module.c" # The file generated by this program
  13. from macsupport import *
  14. # Create the type objects
  15. includestuff = includestuff + """
  16. #include <Carbon/Carbon.h>
  17. /* For now we declare them forward here. They'll go to mactoolbox later */
  18. static PyObject *TXNObj_New(TXNObject);
  19. static int TXNObj_Convert(PyObject *, TXNObject *);
  20. static PyObject *TXNFontMenuObj_New(TXNFontMenuObject);
  21. static int TXNFontMenuObj_Convert(PyObject *, TXNFontMenuObject *);
  22. // ADD declarations
  23. #ifdef NOTYET_USE_TOOLBOX_OBJECT_GLUE
  24. //extern PyObject *_CFTypeRefObj_New(CFTypeRef);
  25. //extern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *);
  26. //#define CFTypeRefObj_New _CFTypeRefObj_New
  27. //#define CFTypeRefObj_Convert _CFTypeRefObj_Convert
  28. #endif
  29. /*
  30. ** Parse an optional fsspec
  31. */
  32. static int
  33. OptFSSpecPtr_Convert(PyObject *v, FSSpec **p_itself)
  34. {
  35. static FSSpec fss;
  36. if (v == Py_None)
  37. {
  38. *p_itself = NULL;
  39. return 1;
  40. }
  41. *p_itself = &fss;
  42. return PyMac_GetFSSpec(v, *p_itself);
  43. }
  44. /*
  45. ** Parse an optional rect
  46. */
  47. static int
  48. OptRectPtr_Convert(PyObject *v, Rect **p_itself)
  49. {
  50. static Rect r;
  51. if (v == Py_None)
  52. {
  53. *p_itself = NULL;
  54. return 1;
  55. }
  56. *p_itself = &r;
  57. return PyMac_GetRect(v, *p_itself);
  58. }
  59. /*
  60. ** Parse an optional GWorld
  61. */
  62. static int
  63. OptGWorldObj_Convert(PyObject *v, GWorldPtr *p_itself)
  64. {
  65. if (v == Py_None)
  66. {
  67. *p_itself = NULL;
  68. return 1;
  69. }
  70. return GWorldObj_Convert(v, p_itself);
  71. }
  72. """
  73. initstuff = initstuff + """
  74. // PyMac_INIT_TOOLBOX_OBJECT_NEW(xxxx);
  75. """
  76. TXNObject = OpaqueByValueType("TXNObject", "TXNObj")
  77. TXNFontMenuObject = OpaqueByValueType("TXNFontMenuObject", "TXNFontMenuObj")
  78. TXNFrameID = Type("TXNFrameID", "l")
  79. TXNVersionValue = Type("TXNVersionValue", "l")
  80. TXNFeatureBits = Type("TXNFeatureBits", "l")
  81. TXNInitOptions = Type("TXNInitOptions", "l")
  82. TXNFrameOptions = Type("TXNFrameOptions", "l")
  83. TXNContinuousFlags = Type("TXNContinuousFlags", "l")
  84. TXNMatchOptions = Type("TXNMatchOptions", "l")
  85. TXNFileType = OSTypeType("TXNFileType")
  86. TXNFrameType = Type("TXNFrameType", "l")
  87. TXNDataType = OSTypeType("TXNDataType")
  88. TXNControlTag = OSTypeType("TXNControlTag")
  89. TXNActionKey = Type("TXNActionKey", "l")
  90. TXNTabType = Type("TXNTabType", "b")
  91. TXNScrollBarState = Type("TXNScrollBarState", "l")
  92. TXNOffset = Type("TXNOffset", "l")
  93. TXNObjectRefcon = FakeType("(TXNObjectRefcon)0") # XXXX For now...
  94. TXNErrors = OSErrType("TXNErrors", "l")
  95. TXNTypeRunAttributes = OSTypeType("TXNTypeRunAttributes")
  96. TXNTypeRunAttributeSizes = Type("TXNTypeRunAttributeSizes", "l")
  97. TXNPermanentTextEncodingType = Type("TXNPermanentTextEncodingType", "l")
  98. TXTNTag = OSTypeType("TXTNTag")
  99. TXNBackgroundType = Type("TXNBackgroundType", "l")
  100. DragReference = OpaqueByValueType("DragReference", "DragObj")
  101. DragTrackingMessage = Type("DragTrackingMessage", "h")
  102. RgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
  103. OptRgnHandle = OpaqueByValueType("RgnHandle", "OptResObj")
  104. GWorldPtr = OpaqueByValueType("GWorldPtr", "GWorldObj")
  105. OptGWorldPtr = OpaqueByValueType("GWorldPtr", "OptGWorldObj")
  106. MlteInBuffer = VarInputBufferType('void *', 'ByteCount', 'l')
  107. OptFSSpecPtr = OpaqueByValueType("FSSpec *", "OptFSSpecPtr")
  108. OptRectPtr = OpaqueByValueType("Rect *", "OptRectPtr")
  109. UniChar = Type("UniChar", "h") # XXXX For now...
  110. # ADD object type here
  111. execfile("mltetypetest.py")
  112. # Our (opaque) objects
  113. class TXNObjDefinition(PEP253Mixin, GlobalObjectDefinition):
  114. def outputCheckNewArg(self):
  115. Output("if (itself == NULL) return PyMac_Error(resNotFound);")
  116. class TXNFontMenuObjDefinition(PEP253Mixin, GlobalObjectDefinition):
  117. def outputCheckNewArg(self):
  118. Output("if (itself == NULL) return PyMac_Error(resNotFound);")
  119. # ADD object class here
  120. # From here on it's basically all boiler plate...
  121. # Create the generator groups and link them
  122. module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
  123. TXNObject_object = TXNObjDefinition("TXNObject", "TXNObj", "TXNObject")
  124. TXNFontMenuObject_object = TXNFontMenuObjDefinition("TXNFontMenuObject", "TXNFontMenuObj", "TXNFontMenuObject")
  125. # ADD object here
  126. module.addobject(TXNObject_object)
  127. module.addobject(TXNFontMenuObject_object)
  128. # ADD addobject call here
  129. # Create the generator classes used to populate the lists
  130. Function = OSErrWeakLinkFunctionGenerator
  131. Method = OSErrWeakLinkMethodGenerator
  132. # Create and populate the lists
  133. functions = []
  134. TXNObject_methods = []
  135. TXNFontMenuObject_methods = []
  136. # ADD _methods initializer here
  137. execfile(INPUTFILE)
  138. # add the populated lists to the generator groups
  139. # (in a different wordl the scan program would generate this)
  140. for f in functions: module.add(f)
  141. for f in TXNObject_methods: TXNObject_object.add(f)
  142. for f in TXNFontMenuObject_methods: TXNFontMenuObject_object.add(f)
  143. # ADD Manual generators here
  144. inittextension_body = """
  145. OSStatus _err;
  146. TXNMacOSPreferredFontDescription * iDefaultFonts = NULL;
  147. ItemCount iCountDefaultFonts = 0;
  148. TXNInitOptions iUsageFlags;
  149. PyMac_PRECHECK(TXNInitTextension);
  150. if (!PyArg_ParseTuple(_args, "l", &iUsageFlags))
  151. return NULL;
  152. _err = TXNInitTextension(iDefaultFonts,
  153. iCountDefaultFonts,
  154. iUsageFlags);
  155. if (_err != noErr) return PyMac_Error(_err);
  156. Py_INCREF(Py_None);
  157. _res = Py_None;
  158. return _res;
  159. """
  160. f = ManualGenerator("TXNInitTextension", inittextension_body);
  161. f.docstring = lambda: "(TXNInitOptions) -> None"
  162. module.add(f)
  163. # generate output (open the output file as late as possible)
  164. SetOutputFileName(OUTPUTFILE)
  165. module.generate()