summaryrefslogtreecommitdiffstats
path: root/Mac/Modules/calldll.c
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Modules/calldll.c')
-rw-r--r--Mac/Modules/calldll.c1194
1 files changed, 0 insertions, 1194 deletions
diff --git a/Mac/Modules/calldll.c b/Mac/Modules/calldll.c
deleted file mode 100644
index f390a9d..0000000
--- a/Mac/Modules/calldll.c
+++ /dev/null
@@ -1,1194 +0,0 @@
-/***********************************************************
-Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
-The Netherlands.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the names of Stichting Mathematisch
-Centrum or CWI or Corporation for National Research Initiatives or
-CNRI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior
-permission.
-
-While CWI is the initial source for this software, a modified version
-is made available by the Corporation for National Research Initiatives
-(CNRI) at the Internet address ftp://ftp.python.org.
-
-STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
-CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-******************************************************************/
-
-/* Sanity check */
-#ifndef __powerc
-#error Please port this code to your architecture first...
-#endif
-
-/*
-** Define to include testroutines (at the end)
-*/
-#define TESTSUPPORT
-
-#include "Python.h"
-#include "macglue.h"
-#include "macdefs.h"
-#include <CodeFragments.h>
-
-/* Prototypes for routines not in any include file (shame, shame) */
-extern PyObject *ResObj_New(Handle);
-extern int ResObj_Convert(PyObject *, Handle *);
-
-static PyObject *ErrorObject;
-
-/* Debugging macro */
-#ifdef TESTSUPPORT
-#define PARANOID(arg) \
- if ( arg == 0 ) {PyErr_SetString(ErrorObject, "Internal error: NULL arg!"); return 0; }
-#else
-#define PARANOID(arg) /*pass*/
-#endif
-
-/* Prototypes we use for routines and arguments */
-
-typedef long anything;
-typedef anything (*anyroutine)(...);
-
-/* Other constants */
-#define MAXNAME 31 /* Maximum size of names, for printing only */
-#define MAXARG 12 /* Maximum number of arguments */
-
-/*
-** Routines to convert arguments between Python and C.
-** Note return-value converters return NULL if this argument (or return value)
-** doesn't return anything. The call-wrapper code collects all return values,
-** and does the expected thing based on the number of return values: return None, a single
-** value or a tuple of values.
-**
-** Hence, optional return values are also implementable.
-*/
-typedef anything (*py2c_converter)(PyObject *);
-typedef PyObject *(*c2py_converter)(anything);
-typedef PyObject *(*rv2py_converter)(anything);
-
-
-/* Dummy routine for arguments that are output-only */
-static anything
-py2c_dummy(arg)
- PyObject *arg;
-{
- return 0;
-}
-
-/* Routine to allocate storage for output integers */
-static anything
-py2c_alloc(arg)
- PyObject *arg;
-{
- char *ptr;
-
- if( (ptr=malloc(sizeof(anything))) == 0 )
- PyErr_NoMemory();
- return (anything)ptr;
-}
-
-/* Dummy routine for arguments that are input-only */
-static PyObject *
-c2py_dummy(arg)
- anything arg;
-{
- return 0;
-}
-
-/* Dummy routine for void return value */
-static PyObject *
-rv2py_none(arg)
- anything arg;
-{
- return 0;
-}
-
-/* Routine to de-allocate storage for input-only arguments */
-static PyObject *
-c2py_free(arg)
- anything arg;
-{
- if ( arg )
- free((char *)arg);
- return 0;
-}
-
-/*
-** OSErr return value.
-*/
-static PyObject *
-rv2py_oserr(arg)
- anything arg;
-{
- OSErr err = (OSErr)arg;
-
- if (err)
- return PyMac_Error(err);
- return 0;
-}
-
-/*
-** Input integers of all sizes (PPC only)
-*/
-static anything
-py2c_in_int(arg)
- PyObject *arg;
-{
- return PyInt_AsLong(arg);
-}
-
-/*
-** Integer return values of all sizes (PPC only)
-*/
-static PyObject *
-rv2py_int(arg)
- anything arg;
-{
- return PyInt_FromLong((long)arg);
-}
-
-/*
-** Integer output parameters
-*/
-static PyObject *
-c2py_out_long(arg)
- anything arg;
-{
- PyObject *rv;
-
- PARANOID(arg);
- rv = PyInt_FromLong(*(long *)arg);
- free((char *)arg);
- return rv;
-}
-
-static PyObject *
-c2py_out_short(arg)
- anything arg;
-{
- PyObject *rv;
-
- PARANOID(arg);
- rv = PyInt_FromLong((long)*(short *)arg);
- free((char *)arg);
- return rv;
-}
-
-static PyObject *
-c2py_out_byte(arg)
- anything arg;
-{
- PyObject *rv;
-
- PARANOID(arg);
- rv = PyInt_FromLong((long)*(char *)arg);
- free((char *)arg);
- return rv;
-}
-
-/*
-** Strings
-*/
-static anything
-py2c_in_string(arg)
- PyObject *arg;
-{
- return (anything)PyString_AsString(arg);
-}
-
-/*
-** Pascal-style strings
-*/
-static anything
-py2c_in_pstring(arg)
- PyObject *arg;
-{
- unsigned char *p;
- int size;
-
- if( (size = PyString_Size(arg)) < 0)
- return 0;
- if ( size > 255 ) {
- PyErr_SetString(ErrorObject, "Pstring must be <= 255 chars");
- return 0;
- }
- if( (p=(unsigned char *)malloc(256)) == 0 ) {
- PyErr_NoMemory();
- return 0;
- }
- p[0] = size;
- memcpy(p+1, PyString_AsString(arg), size);
- return (anything)p;
-}
-
-static anything
-py2c_out_pstring(arg)
- PyObject *arg;
-{
- unsigned char *p;
-
- if( (p=(unsigned char *)malloc(256)) == 0 ) {
- PyErr_NoMemory();
- return 0;
- }
- p[0] = 0;
- return (anything)p;
-}
-
-static PyObject *
-c2py_out_pstring(arg)
- anything arg;
-{
- unsigned char *p = (unsigned char *)arg;
- PyObject *rv;
-
- PARANOID(arg);
- rv = PyString_FromStringAndSize((char *)p+1, p[0]);
- free(p);
- return rv;
-}
-
-static PyObject *
-rv2py_pstring(arg)
- anything arg;
-{
- unsigned char *p = (unsigned char *)arg;
- PyObject *rv;
-
- if ( arg == NULL ) return NULL;
- rv = PyString_FromStringAndSize((char *)p+1, p[0]);
- return rv;
-}
-
-/*
-** C objects.
-*/
-static anything
-py2c_in_cobject(arg)
- PyObject *arg;
-{
- if ( arg == Py_None )
- return 0;
- return (anything)PyCObject_AsVoidPtr(arg);
-}
-
-static PyObject *
-c2py_out_cobject(arg)
- anything arg;
-{
- void **ptr = (void **)arg;
- PyObject *rv;
-
- PARANOID(arg);
- if ( *ptr == 0 ) {
- Py_INCREF(Py_None);
- rv = Py_None;
- } else {
- rv = PyCObject_FromVoidPtr(*ptr, 0);
- }
- free((char *)ptr);
- return rv;
-}
-
-static PyObject *
-rv2py_cobject(arg)
- anything arg;
-{
- void *ptr = (void *)arg;
- PyObject *rv;
-
- if ( ptr == 0 ) return NULL;
- rv = PyCObject_FromVoidPtr(ptr, 0);
- return rv;
-}
-
-/*
-** Handles.
-*/
-static anything
-py2c_in_handle(arg)
- PyObject *arg;
-{
- Handle h = 0;
- ResObj_Convert(arg, &h);
- return (anything)h;
-}
-
-static PyObject *
-c2py_out_handle(arg)
- anything arg;
-{
- Handle *rv = (Handle *)arg;
- PyObject *prv;
-
- PARANOID(arg);
- if ( *rv == 0 ) {
- Py_INCREF(Py_None);
- prv = Py_None;
- } else {
- prv = ResObj_New(*rv);
- }
- free((char *)rv);
- return prv;
-}
-
-static PyObject *
-rv2py_handle(arg)
- anything arg;
-{
- Handle rv = (Handle)arg;
-
- if ( rv == NULL ) return NULL;
- return ResObj_New(rv);
-}
-
-typedef struct {
- char *name; /* Name */
- py2c_converter get; /* Get argument */
- int get_uses_arg; /* True if the above consumes an argument */
- c2py_converter put; /* Put result value */
-} conventry;
-
-static conventry converters[] = {
- {"InByte", py2c_in_int, 1, c2py_dummy},
- {"InShort", py2c_in_int, 1, c2py_dummy},
- {"InLong", py2c_in_int, 1, c2py_dummy},
- {"OutLong", py2c_alloc, 0, c2py_out_long},
- {"OutShort", py2c_alloc, 0, c2py_out_short},
- {"OutByte", py2c_alloc, 0, c2py_out_byte},
- {"InString", py2c_in_string, 1, c2py_dummy},
- {"InPstring", py2c_in_pstring,1, c2py_free},
- {"OutPstring", py2c_out_pstring,0, c2py_out_pstring},
- {"InCobject", py2c_in_cobject,1, c2py_dummy},
- {"OutCobject", py2c_alloc, 0, c2py_out_cobject},
- {"InHandle", py2c_in_handle, 1, c2py_dummy},
- {"OutHandle", py2c_alloc, 0, c2py_out_handle},
- {0, 0, 0, 0}
-};
-
-typedef struct {
- char *name;
- rv2py_converter rtn;
-} rvconventry;
-
-static rvconventry rvconverters[] = {
- {"None", rv2py_none},
- {"OSErr", rv2py_oserr},
- {"Byte", rv2py_int},
- {"Short", rv2py_int},
- {"Long", rv2py_int},
- {"Pstring", rv2py_pstring},
- {"Cobject", rv2py_cobject},
- {"Handle", rv2py_handle},
- {0, 0}
-};
-
-static conventry *
-getconverter(name)
- char *name;
-{
- int i;
- char buf[256];
-
- for(i=0; converters[i].name; i++ )
- if ( strcmp(name, converters[i].name) == 0 )
- return &converters[i];
- sprintf(buf, "Unknown argtype: %s", name);
- PyErr_SetString(ErrorObject, buf);
- return 0;
-}
-
-static rvconventry *
-getrvconverter(name)
- char *name;
-{
- int i;
- char buf[256];
-
- for(i=0; rvconverters[i].name; i++ )
- if ( strcmp(name, rvconverters[i].name) == 0 )
- return &rvconverters[i];
- sprintf(buf, "Unknown return value type: %s", name);
- PyErr_SetString(ErrorObject, buf);
- return 0;
-}
-
-static int
-argparse_conv(obj, ptr)
- PyObject *obj;
- conventry **ptr;
-{
- char *name;
- int i;
- conventry *item;
-
- if( (name=PyString_AsString(obj)) == NULL )
- return 0;
- if( (item=getconverter(name)) == NULL )
- return 0;
- *ptr = item;
- return 1;
-}
-
-static int
-argparse_rvconv(obj, ptr)
- PyObject *obj;
- rvconventry **ptr;
-{
- char *name;
- int i;
- rvconventry *item;
-
- if( (name=PyString_AsString(obj)) == NULL )
- return 0;
- if( (item=getrvconverter(name)) == NULL )
- return 0;
- *ptr = item;
- return 1;
-}
-
-/* ----------------------------------------------------- */
-
-/* Declarations for objects of type fragment */
-
-typedef struct {
- PyObject_HEAD
- CFragConnectionID conn_id;
- char name[MAXNAME+1];
-} cdfobject;
-
-static PyTypeObject Cdftype;
-
-
-
-/* ---------------------------------------------------------------- */
-
-/* Declarations for objects of type routine */
-
-typedef struct {
- PyObject_HEAD
- anyroutine rtn;
- char name[MAXNAME+1];
-} cdrobject;
-
-static PyTypeObject Cdrtype;
-
-
-
-/* ---------------------------------------------------------------- */
-
-/* Declarations for objects of type callable */
-
-
-typedef struct {
- PyObject_HEAD
- cdrobject *routine; /* The routine to call */
- int npargs; /* Python argument count */
- int ncargs; /* C argument count + 1 */
- rvconventry *rvconv; /* Return value converter */
- conventry *argconv[MAXARG]; /* Value converter list */
-} cdcobject;
-
-static PyTypeObject Cdctype;
-
-
-
-/* -------------------------------------------------------- */
-
-
-static struct PyMethodDef cdr_methods[] = {
-
- {NULL, NULL} /* sentinel */
-};
-
-/* ---------- */
-
-
-static cdrobject *
-newcdrobject(name, routine)
- unsigned char *name;
- anyroutine routine;
-{
- cdrobject *self;
- int nlen;
-
- self = PyObject_NEW(cdrobject, &Cdrtype);
- if (self == NULL)
- return NULL;
- if ( name[0] > MAXNAME )
- nlen = MAXNAME;
- else
- nlen = name[0];
- memcpy(self->name, name+1, nlen);
- self->name[nlen] = '\0';
- self->rtn = routine;
- return self;
-}
-
-static void
-cdr_dealloc(self)
- cdrobject *self;
-{
- PyObject_DEL(self);
-}
-
-static PyObject *
-cdr_repr(self)
- cdrobject *self;
-{
- PyObject *s;
- char buf[256];
-
- sprintf(buf, "<Calldll routine %s address 0x%x>", self->name, self->rtn);
- s = PyString_FromString(buf);
- return s;
-}
-
-static char Cdrtype__doc__[] =
-"C Routine address"
-;
-
-static PyTypeObject Cdrtype = {
- PyObject_HEAD_INIT(&PyType_Type)
- 0, /*ob_size*/
- "calldll.routine", /*tp_name*/
- sizeof(cdrobject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- /* methods */
- (destructor)cdr_dealloc, /*tp_dealloc*/
- (printfunc)0, /*tp_print*/
- (getattrfunc)0, /*tp_getattr*/
- (setattrfunc)0, /*tp_setattr*/
- (cmpfunc)0, /*tp_compare*/
- (reprfunc)cdr_repr, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- (hashfunc)0, /*tp_hash*/
- (ternaryfunc)0, /*tp_call*/
- (reprfunc)0, /*tp_str*/
-
- /* Space for future expansion */
- 0L,0L,0L,0L,
- Cdrtype__doc__ /* Documentation string */
-};
-
-/* End of code for routine objects */
-/* -------------------------------------------------------- */
-
-
-static struct PyMethodDef cdc_methods[] = {
-
- {NULL, NULL} /* sentinel */
-};
-
-/* ---------- */
-
-
-static cdcobject *
-newcdcobject(routine, npargs, ncargs, rvconv, argconv)
- cdrobject *routine;
- int npargs;
- int ncargs;
- rvconventry *rvconv;
- conventry *argconv[];
-{
- cdcobject *self;
- int i;
-
- self = PyObject_NEW(cdcobject, &Cdctype);
- if (self == NULL)
- return NULL;
- self->routine = routine;
- Py_INCREF(routine);
- self->npargs = npargs;
- self->ncargs = ncargs;
- self->rvconv = rvconv;
- for(i=0; i<MAXARG; i++)
- if ( i < ncargs )
- self->argconv[i] = argconv[i];
- else
- self->argconv[i] = 0;
- return self;
-}
-
-static void
-cdc_dealloc(self)
- cdcobject *self;
-{
- Py_XDECREF(self->routine);
- PyObject_DEL(self);
-}
-
-
-static PyObject *
-cdc_repr(self)
- cdcobject *self;
-{
- PyObject *s;
- char buf[256];
- int i;
-
- sprintf(buf, "<callable %s = %s(", self->rvconv->name, self->routine->name);
- for(i=0; i< self->ncargs; i++) {
- strcat(buf, self->argconv[i]->name);
- if ( i < self->ncargs-1 )
- strcat(buf, ", ");
- }
- strcat(buf, ") >");
-
- s = PyString_FromString(buf);
- return s;
-}
-
-/*
-** And this is what we all do it for: call a C function.
-*/
-static PyObject *
-cdc_call(self, args, kwargs)
- cdcobject *self;
- PyObject *args;
- PyObject *kwargs;
-{
- char buf[256];
- int i, pargindex;
- anything c_args[MAXARG] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- anything c_rv;
- conventry *cp;
- PyObject *curarg;
- anyroutine func;
- PyObject *returnvalues[MAXARG+1];
- PyObject *rv;
-
- if( kwargs ) {
- PyErr_SetString(PyExc_TypeError, "Keyword args not allowed");
- return 0;
- }
- if( !PyTuple_Check(args) ) {
- PyErr_SetString(PyExc_TypeError, "Arguments not in tuple");
- return 0;
- }
- if( PyTuple_Size(args) != self->npargs ) {
- sprintf(buf, "%d arguments, expected %d", PyTuple_Size(args), self->npargs);
- PyErr_SetString(PyExc_TypeError, buf);
- return 0;
- }
-
- /* Decode arguments */
- pargindex = 0;
- for(i=0; i<self->ncargs; i++) {
- cp = self->argconv[i];
- if ( cp->get_uses_arg ) {
- curarg = PyTuple_GET_ITEM(args, pargindex);
- pargindex++;
- } else {
- curarg = (PyObject *)NULL;
- }
- c_args[i] = (*cp->get)(curarg);
- }
- if (PyErr_Occurred())
- return 0;
-
- /* Call function */
- func = self->routine->rtn;
- c_rv = (*func)(c_args[0], c_args[1], c_args[2], c_args[3],
- c_args[4], c_args[5], c_args[6], c_args[7],
- c_args[8], c_args[9], c_args[10], c_args[11]);
-
- /* Decode return value, and store into returnvalues if needed */
- pargindex = 0;
- curarg = (*self->rvconv->rtn)(c_rv);
- if ( curarg )
- returnvalues[pargindex++] = curarg;
-
- /* Decode returnvalue parameters and cleanup any storage allocated */
- for(i=0; i<self->ncargs; i++) {
- cp = self->argconv[i];
- curarg = (*cp->put)(c_args[i]);
- if(curarg)
- returnvalues[pargindex++] = curarg;
- /* NOTE: We only check errors at the end (so we free() everything) */
- }
- if ( PyErr_Occurred() ) {
- /* An error did occur. Free the python objects created */
- for(i=0; i<pargindex; i++)
- Py_XDECREF(returnvalues[i]);
- return NULL;
- }
-
- /* Zero and one return values cases are special: */
- if ( pargindex == 0 ) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- if ( pargindex == 1 )
- return returnvalues[0];
-
- /* More than one return value: put in a tuple */
- rv = PyTuple_New(pargindex);
- for(i=0; i<pargindex; i++)
- if(rv)
- PyTuple_SET_ITEM(rv, i, returnvalues[i]);
- else
- Py_XDECREF(returnvalues[i]);
- return rv;
-}
-
-static char Cdctype__doc__[] =
-""
-;
-
-static PyTypeObject Cdctype = {
- PyObject_HEAD_INIT(&PyType_Type)
- 0, /*ob_size*/
- "calldll.callable", /*tp_name*/
- sizeof(cdcobject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- /* methods */
- (destructor)cdc_dealloc, /*tp_dealloc*/
- (printfunc)0, /*tp_print*/
- (getattrfunc)0, /*tp_getattr*/
- (setattrfunc)0, /*tp_setattr*/
- (cmpfunc)0, /*tp_compare*/
- (reprfunc)cdc_repr, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- (hashfunc)0, /*tp_hash*/
- (ternaryfunc)cdc_call, /*tp_call*/
- (reprfunc)0, /*tp_str*/
-
- /* Space for future expansion */
- 0L,0L,0L,0L,
- Cdctype__doc__ /* Documentation string */
-};
-
-/* 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[] = {
- {"keys", (PyCFunction)cdf_keys, METH_VARARGS,
- cdf_keys__doc__},
-
- {NULL, NULL} /* sentinel */
-};
-
-/* ---------- */
-
-
-static cdfobject *
-newcdfobject(conn_id, name)
- CFragConnectionID conn_id;
- unsigned char *name;
-{
- cdfobject *self;
- int nlen;
-
- self = PyObject_NEW(cdfobject, &Cdftype);
- if (self == NULL)
- return NULL;
- self->conn_id = conn_id;
- if ( name[0] > MAXNAME )
- nlen = MAXNAME;
- else
- nlen = name[0];
- strncpy(self->name, (char *)name+1, nlen);
- self->name[nlen] = '\0';
- return self;
-}
-
-static void
-cdf_dealloc(self)
- cdfobject *self;
-{
- PyObject_DEL(self);
-}
-
-static PyObject *
-cdf_repr(self)
- cdfobject *self;
-{
- PyObject *s;
- char buf[256];
-
- sprintf(buf, "<fragment %s connection, id 0x%x>", self->name, self->conn_id);
- s = PyString_FromString(buf);
- return s;
-}
-
-static PyObject *
-cdf_getattr_helper(self, name)
- cdfobject *self;
- char *name;
-{
- unsigned char *rtn_name;
- anyroutine rtn;
- OSErr err;
- Str255 errMessage;
- CFragSymbolClass class;
- char buf[256];
-
- rtn_name = Pstring(name);
- err = FindSymbol(self->conn_id, rtn_name, (Ptr *)&rtn, &class);
- if ( err ) {
- sprintf(buf, "%.*s: %s", rtn_name[0], rtn_name+1, PyMac_StrError(err));
- PyErr_SetString(ErrorObject, buf);
- return NULL;
- }
- if( class != kTVectorCFragSymbol ) {
- PyErr_SetString(ErrorObject, "Symbol is not a routine");
- return NULL;
- }
-
- 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__[] =
-"Code Fragment library symbol table"
-;
-
-static PyTypeObject Cdftype = {
- PyObject_HEAD_INIT(&PyType_Type)
- 0, /*ob_size*/
- "calldll.fragment", /*tp_name*/
- sizeof(cdfobject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- /* methods */
- (destructor)cdf_dealloc, /*tp_dealloc*/
- (printfunc)0, /*tp_print*/
- (getattrfunc)cdf_getattr, /*tp_getattr*/
- (setattrfunc)0, /*tp_setattr*/
- (cmpfunc)0, /*tp_compare*/
- (reprfunc)cdf_repr, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- &cdf_as_mapping, /*tp_as_mapping*/
- (hashfunc)0, /*tp_hash*/
- (ternaryfunc)0, /*tp_call*/
- (reprfunc)0, /*tp_str*/
-
- /* Space for future expansion */
- 0L,0L,0L,0L,
- Cdftype__doc__ /* Documentation string */
-};
-
-/* End of code for fragment objects */
-/* -------------------------------------------------------- */
-
-
-static char cdll_getlibrary__doc__[] =
-"Load a shared library fragment and return the symbol table"
-;
-
-static PyObject *
-cdll_getlibrary(self, args)
- PyObject *self; /* Not used */
- PyObject *args;
-{
- Str255 frag_name;
- OSErr err;
- Str255 errMessage;
- Ptr main_addr;
- CFragConnectionID conn_id;
- char buf[256];
-
- if (!PyArg_ParseTuple(args, "O&", PyMac_GetStr255, frag_name))
- return NULL;
-
- /* Find the library connection ID */
- err = GetSharedLibrary(frag_name, kCompiledCFragArch, kLoadCFrag, &conn_id, &main_addr,
- errMessage);
- if ( err ) {
- sprintf(buf, "%.*s: %s", errMessage[0], errMessage+1, PyMac_StrError(err));
- PyErr_SetString(ErrorObject, buf);
- return NULL;
- }
- return (PyObject *)newcdfobject(conn_id, frag_name);
-}
-
-static char cdll_getdiskfragment__doc__[] =
-"Load a fragment from a disk file and return the symbol table"
-;
-
-static PyObject *
-cdll_getdiskfragment(self, args)
- PyObject *self; /* Not used */
- PyObject *args;
-{
- FSSpec fsspec;
- Str255 frag_name;
- OSErr err;
- Str255 errMessage;
- Ptr main_addr;
- CFragConnectionID conn_id;
- char buf[256];
- Boolean isfolder, didsomething;
-
- if (!PyArg_ParseTuple(args, "O&O&", PyMac_GetFSSpec, &fsspec,
- PyMac_GetStr255, frag_name))
- return NULL;
- err = ResolveAliasFile(&fsspec, 1, &isfolder, &didsomething);
- if ( err )
- return PyErr_Mac(ErrorObject, err);
-
- /* Load the fragment (or return the connID if it is already loaded */
- err = GetDiskFragment(&fsspec, 0, 0, frag_name,
- kLoadCFrag, &conn_id, &main_addr,
- errMessage);
- if ( err ) {
- sprintf(buf, "%.*s: %s", errMessage[0], errMessage+1, PyMac_StrError(err));
- PyErr_SetString(ErrorObject, buf);
- return NULL;
- }
- return (PyObject *)newcdfobject(conn_id, frag_name);
-}
-
-static char cdll_newcall__doc__[] =
-""
-;
-
-static PyObject *
-cdll_newcall(self, args)
- PyObject *self; /* Not used */
- PyObject *args;
-{
- cdrobject *routine;
- conventry *argconv[MAXARG] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- rv2py_converter rvconv;
- int npargs, ncargs;
-
- /* Note: the next format depends on MAXARG */
- if (!PyArg_ParseTuple(args, "O!O&|O&O&O&O&O&O&O&O&O&O&O&O&", &Cdrtype, &routine,
- argparse_rvconv, &rvconv,
- argparse_conv, &argconv[0], argparse_conv, &argconv[1],
- argparse_conv, &argconv[2], argparse_conv, &argconv[3],
- argparse_conv, &argconv[4], argparse_conv, &argconv[5],
- argparse_conv, &argconv[6], argparse_conv, &argconv[7],
- argparse_conv, &argconv[8], argparse_conv, &argconv[9],
- argparse_conv, &argconv[10], argparse_conv, &argconv[11]))
- return NULL;
- npargs = 0;
- for(ncargs=0; ncargs < MAXARG && argconv[ncargs]; ncargs++) {
- if( argconv[ncargs]->get_uses_arg ) npargs++;
- }
- return (PyObject *)newcdcobject(routine, npargs, ncargs, rvconv, argconv);
-}
-
-/* List of methods defined in the module */
-
-static struct PyMethodDef cdll_methods[] = {
- {"getlibrary", (PyCFunction)cdll_getlibrary, METH_VARARGS,
- cdll_getlibrary__doc__},
- {"getdiskfragment", (PyCFunction)cdll_getdiskfragment, METH_VARARGS,
- cdll_getdiskfragment__doc__},
- {"newcall", (PyCFunction)cdll_newcall, METH_VARARGS,
- cdll_newcall__doc__},
-
- {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
-};
-
-
-/* Initialization function for the module (*must* be called initcalldll) */
-
-static char calldll_module_documentation[] =
-""
-;
-
-void
-initcalldll()
-{
- PyObject *m, *d;
-
- /* Create the module and add the functions */
- m = Py_InitModule4("calldll", cdll_methods,
- calldll_module_documentation,
- (PyObject*)NULL,PYTHON_API_VERSION);
-
- /* Add some symbolic constants to the module */
- d = PyModule_GetDict(m);
- ErrorObject = PyString_FromString("calldll.error");
- PyDict_SetItemString(d, "error", ErrorObject);
-
- /* XXXX Add constants here */
-
- /* Check for errors */
- if (PyErr_Occurred())
- Py_FatalError("can't initialize module calldll");
-}
-
-#ifdef TESTSUPPORT
-
-/* Test routine */
-int cdll_b_bbbbbbbb(char a1,char a2,char a3,char a4,char a5,char a6,char a7,char a8)
-{
- return a1+a2+a3+a4+a5+a6+a7+a8;
-}
-
-short cdll_h_hhhhhhhh(short a1,short a2,short a3,short a4,short a5,short a6,short a7,short a8)
-{
- return a1+a2+a3+a4+a5+a6+a7+a8;
-}
-
-int cdll_l_llllllll(int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8)
-{
- return a1+a2+a3+a4+a5+a6+a7+a8;
-}
-
-void cdll_N_ssssssss(char *a1,char *a2,char *a3,char *a4,char *a5,char *a6,char *a7,char *a8)
-{
- printf("cdll_N_ssssssss args: %s %s %s %s %s %s %s %s\n", a1, a2, a3, a4,
- a5, a6, a7, a8);
-}
-
-OSErr cdll_o_l(long l)
-{
- return (OSErr)l;
-}
-
-void cdll_N_pp(unsigned char *in, unsigned char *out)
-{
- out[0] = in[0] + 5;
- strcpy((char *)out+1, "Was: ");
- memcpy(out+6, in+1, in[0]);
-}
-
-void cdll_N_bb(char a1, char *a2)
-{
- *a2 = a1;
-}
-
-void cdll_N_hh(short a1, short *a2)
-{
- *a2 = a1;
-}
-
-void cdll_N_ll(long a1, long *a2)
-{
- *a2 = a1;
-}
-
-void cdll_N_sH(char *a1, Handle a2)
-{
- int len;
-
- len = strlen(a1);
- SetHandleSize(a2, len);
- HLock(a2);
- memcpy(*a2, a1, len);
- HUnlock(a2);
-}
-#endif