summaryrefslogtreecommitdiffstats
path: root/Mac/Modules/calldll.c
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2003-11-19 14:34:18 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2003-11-19 14:34:18 (GMT)
commit28ecf70db57828db2ca279643bf9aeca7662f35c (patch)
tree09b7767bbc411f85313b58d6fe7e5e67d9392973 /Mac/Modules/calldll.c
parent6045b9c93511c767f6cfa2d2fa299c76181acd9b (diff)
downloadcpython-28ecf70db57828db2ca279643bf9aeca7662f35c.zip
cpython-28ecf70db57828db2ca279643bf9aeca7662f35c.tar.gz
cpython-28ecf70db57828db2ca279643bf9aeca7662f35c.tar.bz2
Getting rid of support for MacOS9 and earlier. This is the first step,
and the biggest in size, but probably the easiest. Hunting through the source code comes next.
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