ยปCore Development>Code coverage>Mac/Modules/list/listsupport.py

Python code coverage for Mac/Modules/list/listsupport.py

#countcontent
1n/a# This script generates a Python interface for an Apple Macintosh Manager.
2n/a# It uses the "bgen" package to generate C code.
3n/a# The function specifications are generated by scanning the mamager's header file,
4n/a# using the "scantools" package (customized for this particular manager).
5n/a
6n/aimport string
7n/a
8n/a# Declarations that change for each manager
9n/aMACHEADERFILE = 'Lists.h' # The Apple header file
10n/aMODNAME = '_List' # The name of the module
11n/aOBJECTNAME = 'List' # The basic name of the objects used here
12n/aKIND = 'Handle' # Usually 'Ptr' or 'Handle'
13n/a
14n/a# The following is *usually* unchanged but may still require tuning
15n/aMODPREFIX = 'List' # The prefix for module-wide routines
16n/aOBJECTTYPE = "ListHandle" # The C type used to represent them
17n/aOBJECTPREFIX = MODPREFIX + 'Obj' # The prefix for object methods
18n/aINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
19n/aOUTPUTFILE = MODNAME + "module.c" # The file generated by this program
20n/a
21n/afrom macsupport import *
22n/a
23n/a# Create the type objects
24n/aListHandle = OpaqueByValueType("ListHandle", "ListObj")
25n/aListRef = ListHandle # Obsolete, but used in Lists.h
26n/aCell = Point
27n/aListBounds = Rect
28n/aListBounds_ptr = Rect_ptr
29n/a
30n/aListDefSpec = ListDefSpec_ptr = OpaqueType("ListDefSpec", "PyMac_BuildListDefSpec", "PyMac_GetListDefSpec")
31n/a
32n/aVarOutBufferShortsize = VarHeapOutputBufferType('char', 'short', 's') # (buf, &len)
33n/aInBufferShortsize = VarInputBufferType('char', 'short', 's') # (buf, len)
34n/a
35n/aRgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
36n/aDataHandle = OpaqueByValueType("DataHandle", "ResObj")
37n/aHandle = OpaqueByValueType("Handle", "ResObj")
38n/aCGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj")
39n/aEventModifiers = Type("EventModifiers", "H")
40n/a
41n/aincludestuff = includestuff + """
42n/a#include <Carbon/Carbon.h>
43n/a
44n/a#ifdef USE_TOOLBOX_OBJECT_GLUE
45n/aextern PyObject *_ListObj_New(ListHandle);
46n/aextern int _ListObj_Convert(PyObject *, ListHandle *);
47n/a
48n/a#define ListObj_New _ListObj_New
49n/a#define ListObj_Convert _ListObj_Convert
50n/a#endif
51n/a
52n/a#define as_List(x) ((ListHandle)x)
53n/a#define as_Resource(lh) ((Handle)lh)
54n/a
55n/astatic ListDefUPP myListDefFunctionUPP;
56n/a
57n/a"""
58n/a
59n/ainitstuff = initstuff + """
60n/amyListDefFunctionUPP = NewListDefUPP((ListDefProcPtr)myListDefFunction);
61n/a
62n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(ListHandle, ListObj_New);
63n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(ListHandle, ListObj_Convert);
64n/a"""
65n/a
66n/aclass ListMethodGenerator(MethodGenerator):
67n/a """Similar to MethodGenerator, but has self as last argument"""
68n/a
69n/a def parseArgumentList(self, args):
70n/a args, a0 = args[:-1], args[-1]
71n/a t0, n0, m0 = a0
72n/a if m0 != InMode:
73n/a raise ValueError, "method's 'self' must be 'InMode'"
74n/a self.itself = Variable(t0, "_self->ob_itself", SelfMode)
75n/a FunctionGenerator.parseArgumentList(self, args)
76n/a self.argumentList.append(self.itself)
77n/a
78n/aclass MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
79n/a # XXXX Should inherit from Resource
80n/a getsetlist = [(
81n/a 'listFlags',
82n/a 'return Py_BuildValue("l", (long)GetListFlags(self->ob_itself) & 0xff);',
83n/a 'if (!PyArg_Parse(v, "B", &(*self->ob_itself)->listFlags)) return -1;',
84n/a None,
85n/a ), (
86n/a 'selFlags',
87n/a 'return Py_BuildValue("l", (long)GetListSelectionFlags(self->ob_itself) & 0xff);',
88n/a 'if (!PyArg_Parse(v, "B", &(*self->ob_itself)->selFlags)) return -1;',
89n/a None,
90n/a ), (
91n/a 'cellSize',
92n/a 'return Py_BuildValue("O&", PyMac_BuildPoint, (*self->ob_itself)->cellSize);',
93n/a 'if (!PyArg_Parse(v, "O&", PyMac_GetPoint, &(*self->ob_itself)->cellSize)) return -1;',
94n/a None
95n/a )]
96n/a
97n/a def outputStructMembers(self):
98n/a ObjectDefinition.outputStructMembers(self)
99n/a Output("PyObject *ob_ldef_func;")
100n/a Output("int ob_must_be_disposed;")
101n/a
102n/a def outputCheckNewArg(self):
103n/a Output("""if (itself == NULL) {
104n/a PyErr_SetString(List_Error,"Cannot create null List");
105n/a return NULL;
106n/a }""")
107n/a
108n/a def outputInitStructMembers(self):
109n/a ObjectDefinition.outputInitStructMembers(self)
110n/a Output("it->ob_ldef_func = NULL;")
111n/a Output("it->ob_must_be_disposed = 1;")
112n/a Output("SetListRefCon(itself, (long)it);")
113n/a
114n/a def outputFreeIt(self, itselfname):
115n/a Output("Py_XDECREF(self->ob_ldef_func);")
116n/a Output("self->ob_ldef_func = NULL;")
117n/a Output("SetListRefCon(self->ob_itself, (long)0);")
118n/a Output("if (self->ob_must_be_disposed && %s) LDispose(%s);", itselfname, itselfname)
119n/a
120n/a# From here on it's basically all boiler plate...
121n/a
122n/afinalstuff = finalstuff + """
123n/astatic void myListDefFunction(SInt16 message,
124n/a Boolean selected,
125n/a Rect *cellRect,
126n/a Cell theCell,
127n/a SInt16 dataOffset,
128n/a SInt16 dataLen,
129n/a ListHandle theList)
130n/a{
131n/a PyObject *listDefFunc, *args, *rv=NULL;
132n/a ListObject *self;
133n/a
134n/a self = (ListObject*)GetListRefCon(theList);
135n/a if (self == NULL || self->ob_itself != theList)
136n/a return; /* nothing we can do */
137n/a listDefFunc = self->ob_ldef_func;
138n/a if (listDefFunc == NULL)
139n/a return; /* nothing we can do */
140n/a args = Py_BuildValue("hbO&O&hhO", message,
141n/a selected,
142n/a PyMac_BuildRect, cellRect,
143n/a PyMac_BuildPoint, theCell,
144n/a dataOffset,
145n/a dataLen,
146n/a self);
147n/a if (args != NULL) {
148n/a rv = PyEval_CallObject(listDefFunc, args);
149n/a Py_DECREF(args);
150n/a }
151n/a if (rv == NULL) {
152n/a PySys_WriteStderr("error in list definition callback:\\n");
153n/a PyErr_Print();
154n/a } else {
155n/a Py_DECREF(rv);
156n/a }
157n/a}
158n/a"""
159n/a
160n/a# Create the generator groups and link them
161n/amodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
162n/aobject = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE)
163n/amodule.addobject(object)
164n/a
165n/a# Create the generator classes used to populate the lists
166n/aFunction = FunctionGenerator
167n/aMethod = ListMethodGenerator
168n/a
169n/a# Create and populate the lists
170n/afunctions = []
171n/amethods = []
172n/aexecfile(INPUTFILE)
173n/a
174n/a# Function to convert any handle to a list and vv.
175n/a##f = Function(ListHandle, 'as_List', (Handle, 'h', InMode))
176n/aas_List_body = """
177n/aHandle h;
178n/aListObject *l;
179n/aif (!PyArg_ParseTuple(_args, "O&", ResObj_Convert, &h))
180n/a return NULL;
181n/al = (ListObject *)ListObj_New(as_List(h));
182n/al->ob_must_be_disposed = 0;
183n/a_res = Py_BuildValue("O", l);
184n/areturn _res;
185n/a"""
186n/af = ManualGenerator("as_List", as_List_body)
187n/af.docstring = lambda: "(Resource)->List.\nReturns List object (which is not auto-freed!)"
188n/afunctions.append(f)
189n/a
190n/af = Method(Handle, 'as_Resource', (ListHandle, 'lh', InMode))
191n/amethods.append(f)
192n/a
193n/a# Manual generator for CreateCustomList, due to callback ideosyncracies
194n/aCreateCustomList_body = """\
195n/aRect rView;
196n/aRect dataBounds;
197n/aPoint cellSize;
198n/a
199n/aPyObject *listDefFunc;
200n/aListDefSpec theSpec;
201n/aWindowPtr theWindow;
202n/aBoolean drawIt;
203n/aBoolean hasGrow;
204n/aBoolean scrollHoriz;
205n/aBoolean scrollVert;
206n/aListHandle outList;
207n/a
208n/aif (!PyArg_ParseTuple(_args, "O&O&O&(iO)O&bbbb",
209n/a PyMac_GetRect, &rView,
210n/a PyMac_GetRect, &dataBounds,
211n/a PyMac_GetPoint, &cellSize,
212n/a &theSpec.defType, &listDefFunc,
213n/a WinObj_Convert, &theWindow,
214n/a &drawIt,
215n/a &hasGrow,
216n/a &scrollHoriz,
217n/a &scrollVert))
218n/a return NULL;
219n/a
220n/a
221n/a/* Carbon applications use the CreateCustomList API */
222n/atheSpec.u.userProc = myListDefFunctionUPP;
223n/aCreateCustomList(&rView,
224n/a &dataBounds,
225n/a cellSize,
226n/a &theSpec,
227n/a theWindow,
228n/a drawIt,
229n/a hasGrow,
230n/a scrollHoriz,
231n/a scrollVert,
232n/a &outList);
233n/a
234n/a
235n/a_res = ListObj_New(outList);
236n/aif (_res == NULL)
237n/a return NULL;
238n/aPy_INCREF(listDefFunc);
239n/a((ListObject*)_res)->ob_ldef_func = listDefFunc;
240n/areturn _res;\
241n/a"""
242n/a
243n/af = ManualGenerator("CreateCustomList", CreateCustomList_body);
244n/af.docstring = lambda: "(Rect rView, Rect dataBounds, Point cellSize, ListDefSpec theSpec, WindowPtr theWindow, Boolean drawIt, Boolean hasGrow, Boolean scrollHoriz, Boolean scrollVert) -> (ListHandle outList)"
245n/amodule.add(f)
246n/a
247n/a# add the populated lists to the generator groups
248n/a# (in a different wordl the scan program would generate this)
249n/afor f in functions: module.add(f)
250n/afor f in methods: object.add(f)
251n/a
252n/a
253n/a# generate output (open the output file as late as possible)
254n/aSetOutputFileName(OUTPUTFILE)
255n/amodule.generate()