Added keys() and mapping interface to shared-library objects, allowing
iteration over all symbols exported
This commit is contained in:
parent
a39f1b0ce2
commit
e8b9b9f15b
|
@ -779,7 +779,49 @@ static PyTypeObject Cdctype = {
|
||||||
/* End of code for callable objects */
|
/* End of code for callable objects */
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static char cdf_keys__doc__[] =
|
||||||
|
"Return list of symbol names in fragment";
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
cdf_keys(self, args)
|
||||||
|
cdfobject *self;
|
||||||
|
PyObject *args;
|
||||||
|
{
|
||||||
|
long symcount;
|
||||||
|
PyObject *rv, *obj;
|
||||||
|
Str255 symname;
|
||||||
|
Ptr dummy1;
|
||||||
|
CFragSymbolClass dummy2;
|
||||||
|
int i;
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, ""))
|
||||||
|
return NULL;
|
||||||
|
if ( (err=CountSymbols(self->conn_id, &symcount)) < 0 )
|
||||||
|
return PyMac_Error(err);
|
||||||
|
if ( (rv=PyList_New(symcount)) == NULL )
|
||||||
|
return NULL;
|
||||||
|
for (i=0; i<symcount; i++) {
|
||||||
|
if ((err=GetIndSymbol(self->conn_id, i, symname, &dummy1, &dummy2)) < 0 ) {
|
||||||
|
Py_XDECREF(rv);
|
||||||
|
return PyMac_Error(err);
|
||||||
|
}
|
||||||
|
if ((obj=PyString_FromStringAndSize((char *)symname+1, symname[0])) == NULL ) {
|
||||||
|
Py_XDECREF(rv);
|
||||||
|
return PyMac_Error(err);
|
||||||
|
}
|
||||||
|
if (PyList_SetItem(rv, i, obj) < 0 ) {
|
||||||
|
Py_XDECREF(rv);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct PyMethodDef cdf_methods[] = {
|
static struct PyMethodDef cdf_methods[] = {
|
||||||
|
{"keys", (PyCFunction)cdf_keys, METH_VARARGS,
|
||||||
|
cdf_keys__doc__},
|
||||||
|
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
@ -828,7 +870,7 @@ cdf_repr(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
cdf_getattr(self, name)
|
cdf_getattr_helper(self, name)
|
||||||
cdfobject *self;
|
cdfobject *self;
|
||||||
char *name;
|
char *name;
|
||||||
{
|
{
|
||||||
|
@ -853,6 +895,65 @@ cdf_getattr(self, name)
|
||||||
|
|
||||||
return (PyObject *)newcdrobject(rtn_name, rtn);
|
return (PyObject *)newcdrobject(rtn_name, rtn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
cdf_getattr(self, name)
|
||||||
|
cdfobject *self;
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
PyObject *rv;
|
||||||
|
|
||||||
|
if ((rv=Py_FindMethod(cdf_methods, (PyObject *)self, name)))
|
||||||
|
return rv;
|
||||||
|
PyErr_Clear();
|
||||||
|
return cdf_getattr_helper(self, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------- */
|
||||||
|
/* Code to access cdf objects as mappings */
|
||||||
|
|
||||||
|
static int
|
||||||
|
cdf_length(self)
|
||||||
|
cdfobject *self;
|
||||||
|
{
|
||||||
|
long symcount;
|
||||||
|
OSErr err;
|
||||||
|
|
||||||
|
err = CountSymbols(self->conn_id, &symcount);
|
||||||
|
if ( err ) {
|
||||||
|
PyMac_Error(err);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return symcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
cdf_subscript(self, key)
|
||||||
|
cdfobject *self;
|
||||||
|
PyObject *key;
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
if ((name=PyString_AsString(key)) == 0 )
|
||||||
|
return 0;
|
||||||
|
return cdf_getattr_helper(self, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
cdf_ass_sub(self, v, w)
|
||||||
|
cdfobject *self;
|
||||||
|
PyObject *v, *w;
|
||||||
|
{
|
||||||
|
/* XXXX Put w in self under key v */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyMappingMethods cdf_as_mapping = {
|
||||||
|
(inquiry)cdf_length, /*mp_length*/
|
||||||
|
(binaryfunc)cdf_subscript, /*mp_subscript*/
|
||||||
|
(objobjargproc)cdf_ass_sub, /*mp_ass_subscript*/
|
||||||
|
};
|
||||||
|
|
||||||
/* -------------------------------------------------------- */
|
/* -------------------------------------------------------- */
|
||||||
|
|
||||||
static char Cdftype__doc__[] =
|
static char Cdftype__doc__[] =
|
||||||
|
@ -874,7 +975,7 @@ static PyTypeObject Cdftype = {
|
||||||
(reprfunc)cdf_repr, /*tp_repr*/
|
(reprfunc)cdf_repr, /*tp_repr*/
|
||||||
0, /*tp_as_number*/
|
0, /*tp_as_number*/
|
||||||
0, /*tp_as_sequence*/
|
0, /*tp_as_sequence*/
|
||||||
0, /*tp_as_mapping*/
|
&cdf_as_mapping, /*tp_as_mapping*/
|
||||||
(hashfunc)0, /*tp_hash*/
|
(hashfunc)0, /*tp_hash*/
|
||||||
(ternaryfunc)0, /*tp_call*/
|
(ternaryfunc)0, /*tp_call*/
|
||||||
(reprfunc)0, /*tp_str*/
|
(reprfunc)0, /*tp_str*/
|
||||||
|
|
Loading…
Reference in New Issue