diff options
Diffstat (limited to 'Mac/Python/macimport.c')
-rw-r--r-- | Mac/Python/macimport.c | 445 |
1 files changed, 0 insertions, 445 deletions
diff --git a/Mac/Python/macimport.c b/Mac/Python/macimport.c deleted file mode 100644 index e6c432b5d5..0000000000 --- a/Mac/Python/macimport.c +++ /dev/null @@ -1,445 +0,0 @@ -/*********************************************************** -Copyright 1991-1997 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 not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM 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. - -******************************************************************/ - - -#include "Python.h" - -#include "macglue.h" -#include "marshal.h" -#include "import.h" -#include "importdl.h" - -#include "pythonresources.h" - -#include <Types.h> -#include <Files.h> -#include <Resources.h> -#include <CodeFragments.h> -#include <StringCompare.h> - -typedef void (*dl_funcptr)(); -#define FUNCNAME_PATTERN "init%.200s" - -static int -fssequal(FSSpec *fs1, FSSpec *fs2) -{ - if ( fs1->vRefNum != fs2->vRefNum || fs1->parID != fs2->parID ) - return 0; - return EqualString(fs1->name, fs2->name, false, true); -} -/* -** findnamedresource - Common code for the various *ResourceModule functions. -** Check whether a file contains a resource of the correct name and type, and -** optionally return the value in it. -*/ -static int -findnamedresource( - PyStringObject *obj, - char *module, - char *filename, - OSType restype, - StringPtr dataptr) -{ - FSSpec fss; - FInfo finfo; - short oldrh, filerh; - int ok; - Handle h; - - /* - ** Find_module takes care of interning all - ** sys.path components. We then keep a record of all sys.path - ** components for which GetFInfo has failed (usually because the - ** component in question is a folder), and we don't try opening these - ** as resource files again. - */ -#define MAXPATHCOMPONENTS 32 - static PyStringObject *not_a_file[MAXPATHCOMPONENTS]; - static int max_not_a_file = 0; - int i; - - if (obj && PyString_Check(obj) && PyString_CHECK_INTERNED(obj) ) { - for( i=0; i< max_not_a_file; i++ ) - if ( obj == not_a_file[i] ) - return 0; - } - if ( FSMakeFSSpec(0, 0, Pstring(filename), &fss) != noErr ) { - /* doesn't exist or is folder */ - if ( obj && max_not_a_file < MAXPATHCOMPONENTS && PyString_Check(obj) && PyString_CHECK_INTERNED(obj) ) { - Py_INCREF(obj); - not_a_file[max_not_a_file++] = obj; - if (Py_VerboseFlag > 1) - PySys_WriteStderr("# %s is not a file\n", filename); - } - return 0; - } - if ( fssequal(&fss, &PyMac_ApplicationFSSpec) ) { - /* - ** Special case: the application itself. Use a shortcut to - ** forestall opening and closing the application numerous times - ** (which is dead slow when running from CDROM) - */ - oldrh = CurResFile(); - UseResFile(PyMac_AppRefNum); - filerh = -1; - } else { - if ( FSpGetFInfo(&fss, &finfo) != noErr ) { - /* doesn't exist or is folder */ - if ( obj && max_not_a_file < MAXPATHCOMPONENTS && PyString_Check(obj) && PyString_CHECK_INTERNED(obj) ) { - Py_INCREF(obj); - not_a_file[max_not_a_file++] = obj; - if (Py_VerboseFlag > 1) - PySys_WriteStderr("# %s is not a file\n", filename); - } - return 0; - } - oldrh = CurResFile(); - filerh = FSpOpenResFile(&fss, fsRdPerm); - if ( filerh == -1 ) - return 0; - UseResFile(filerh); - } - if ( dataptr == NULL ) - SetResLoad(0); - if (Py_VerboseFlag > 1) - PySys_WriteStderr("# Look for ('PYC ', %s) in %s\n", module, filename); - h = Get1NamedResource(restype, Pstring(module)); - SetResLoad(1); - ok = (h != NULL); - if ( ok && dataptr != NULL ) { - HLock(h); - /* XXXX Unsafe if resource not correctly formatted! */ - /* for ppc we take the first pstring */ - *dataptr = **h; - memcpy(dataptr+1, (*h)+1, (int)*dataptr); - HUnlock(h); - } - if ( filerh != -1 ) - CloseResFile(filerh); - UseResFile(oldrh); - return ok; -} - -/* -** Returns true if the argument has a resource fork, and it contains -** a 'PYC ' resource of the correct name -*/ -int -PyMac_FindResourceModule(obj, module, filename) -PyStringObject *obj; -char *module; -char *filename; -{ - int ok; - - ok = findnamedresource(obj, module, filename, 'PYC ', (StringPtr)0); - return ok; -} - -/* -** Returns true if the argument has a resource fork, and it contains -** a 'PYD ' resource of the correct name -*/ -int -PyMac_FindCodeResourceModule(obj, module, filename) -PyStringObject *obj; -char *module; -char *filename; -{ - int ok; - - ok = findnamedresource(obj, module, filename, 'PYD ', (StringPtr)0); - return ok; -} - - -/* -** Load the specified module from a code resource -*/ -PyObject * -PyMac_LoadCodeResourceModule(name, pathname) - char *name; - char *pathname; -{ - PyObject *m, *d, *s; - char funcname[258]; - char *lastdot, *shortname, *packagecontext; - dl_funcptr p = NULL; - Str255 fragmentname; - CFragConnectionID connID; - Ptr mainAddr; - Str255 errMessage; - OSErr err; - char buf[512]; - Ptr symAddr; - CFragSymbolClass class; - - if ((m = _PyImport_FindExtension(name, name)) != NULL) { - Py_INCREF(m); - return m; - } - lastdot = strrchr(name, '.'); - if (lastdot == NULL) { - packagecontext = NULL; - shortname = name; - } - else { - packagecontext = name; - shortname = lastdot+1; - } - PyOS_snprintf(funcname, sizeof(funcname), FUNCNAME_PATTERN, shortname); - if( !findnamedresource((PyStringObject *)0, name, pathname, 'PYD ', fragmentname)) { - PyErr_SetString(PyExc_ImportError, "PYD resource not found"); - return NULL; - } - - /* Load the fragment - (or return the connID if it is already loaded */ - err = GetSharedLibrary(fragmentname, kCompiledCFragArch, - kLoadCFrag, &connID, &mainAddr, - errMessage); - if ( err ) { - PyOS_snprintf(buf, sizeof(buf), "%.*s: %.200s", - errMessage[0], errMessage+1, - PyMac_StrError(err)); - PyErr_SetString(PyExc_ImportError, buf); - return NULL; - } - /* Locate the address of the correct init function */ - err = FindSymbol(connID, Pstring(funcname), &symAddr, &class); - if ( err ) { - PyOS_snprintf(buf, sizeof(buf), "%s: %.200s", - funcname, PyMac_StrError(err)); - PyErr_SetString(PyExc_ImportError, buf); - return NULL; - } - p = (dl_funcptr)symAddr; - if (p == NULL) { - PyErr_Format(PyExc_ImportError, - "dynamic module does not define init function (%.200s)", - funcname); - return NULL; - } - _Py_PackageContext = packagecontext; - (*p)(); - _Py_PackageContext = NULL; - if (PyErr_Occurred()) - return NULL; - if (_PyImport_FixupExtension(name, name) == NULL) - return NULL; - - m = PyDict_GetItemString(PyImport_GetModuleDict(), name); - if (m == NULL) { - PyErr_SetString(PyExc_SystemError, - "dynamic module not initialized properly"); - return NULL; - } - /* Remember the filename as the __file__ attribute */ - d = PyModule_GetDict(m); - s = PyString_FromString(pathname); - if (s == NULL || PyDict_SetItemString(d, "__file__", s) != 0) - PyErr_Clear(); /* Not important enough to report */ - Py_XDECREF(s); - if (Py_VerboseFlag) - PySys_WriteStderr("import %s # pyd fragment %#s loaded from %s\n", - name, fragmentname, pathname); - Py_INCREF(m); - return m; -} - -/* -** Load the specified module from a resource -*/ -PyObject * -PyMac_LoadResourceModule(module, filename) -char *module; -char *filename; -{ - FSSpec fss; - FInfo finfo; - short oldrh, filerh; - Handle h; - OSErr err; - PyObject *m, *co; - long num, size; - - if ( (err=FSMakeFSSpec(0, 0, Pstring(filename), &fss)) != noErr ) - goto error; - if ( fssequal(&fss, &PyMac_ApplicationFSSpec) ) { - /* - ** Special case: the application itself. Use a shortcut to - ** forestall opening and closing the application numerous times - ** (which is dead slow when running from CDROM) - */ - oldrh = CurResFile(); - UseResFile(PyMac_AppRefNum); - filerh = -1; - } else { - if ( (err=FSpGetFInfo(&fss, &finfo)) != noErr ) - goto error; - oldrh = CurResFile(); - filerh = FSpOpenResFile(&fss, fsRdPerm); - if ( filerh == -1 ) { - err = ResError(); - goto error; - } - UseResFile(filerh); - } - h = Get1NamedResource('PYC ', Pstring(module)); - if ( h == NULL ) { - err = ResError(); - goto error; - } - HLock(h); - /* - ** XXXX The next few lines are intimately tied to the format of pyc - ** files. I'm not sure whether this code should be here or in import.c -- Jack - */ - size = GetHandleSize(h); - if ( size < 8 ) { - PyErr_SetString(PyExc_ImportError, "Resource too small"); - co = NULL; - } else { - num = (*h)[0] & 0xff; - num = num | (((*h)[1] & 0xff) << 8); - num = num | (((*h)[2] & 0xff) << 16); - num = num | (((*h)[3] & 0xff) << 24); - if ( num != PyImport_GetMagicNumber() ) { - PyErr_SetString(PyExc_ImportError, "Bad MAGIC in resource"); - co = NULL; - } else { - co = PyMarshal_ReadObjectFromString((*h)+8, size-8); - /* - ** Normally, byte 4-7 are the time stamp, but that is not used - ** for 'PYC ' resources. We abuse byte 4 as a flag to indicate - ** that it is a package rather than an ordinary module. - ** See also py_resource.py. (jvr) - */ - if ((*h)[4] & 0xff) { - /* it's a package */ - /* Set __path__ to the package name */ - PyObject *d, *s; - int err; - - m = PyImport_AddModule(module); - if (m == NULL) { - co = NULL; - goto packageerror; - } - d = PyModule_GetDict(m); - s = PyString_InternFromString(module); - if (s == NULL) { - co = NULL; - goto packageerror; - } - err = PyDict_SetItemString(d, "__path__", s); - Py_DECREF(s); - if (err != 0) { - co = NULL; - goto packageerror; - } - } - } - } -packageerror: - HUnlock(h); - if ( filerh != -1 ) - CloseResFile(filerh); - else - ReleaseResource(h); - UseResFile(oldrh); - if ( co ) { - m = PyImport_ExecCodeModuleEx(module, co, "<pyc resource>"); - Py_DECREF(co); - } else { - m = NULL; - } - if (Py_VerboseFlag) - PySys_WriteStderr("import %s # pyc resource from %s\n", - module, filename); - return m; -error: - { - char buf[512]; - - PyOS_snprintf(buf, sizeof(buf), "%s: %s", filename, PyMac_StrError(err)); - PyErr_SetString(PyExc_ImportError, buf); - return NULL; - } -} - -/* -** Look for a module in a single folder. Upon entry buf and len -** point to the folder to search, upon exit they refer to the full -** pathname of the module found (if any). -*/ -struct filedescr * -PyMac_FindModuleExtension(char *buf, size_t *lenp, char *module) -{ - struct filedescr *fdp; - unsigned char fnbuf[64]; - int modnamelen = strlen(module); - FSSpec fss; - short refnum; - long dirid; - - /* - ** Copy the module name to the buffer (already :-terminated) - ** We also copy the first suffix, if this matches immedeately we're - ** lucky and return immedeately. - */ - if ( !_PyImport_Filetab[0].suffix ) - return 0; - - strcpy(buf+*lenp, _PyImport_Filetab[0].suffix); - if ( FSMakeFSSpec(0, 0, Pstring(buf), &fss) == noErr ) - return _PyImport_Filetab; - /* - ** We cannot check for fnfErr (unfortunately), it can mean either that - ** the file doesn't exist (fine, we try others) or the path leading to it. - */ - refnum = fss.vRefNum; - dirid = fss.parID; - if ( refnum == 0 || dirid == 0 ) /* Fail on nonexistent dir */ - return 0; - /* - ** We now have the folder parameters. Setup the field for the filename - */ - if ( modnamelen > 54 ) return 0; /* Leave room for extension */ - strcpy((char *)fnbuf+1, module); - buf[*lenp] = '\0'; - - for( fdp = _PyImport_Filetab+1; fdp->suffix; fdp++ ) { - strcpy((char *)fnbuf+1+modnamelen, fdp->suffix); - fnbuf[0] = strlen((char *)fnbuf+1); - if (Py_VerboseFlag > 1) - PySys_WriteStderr("# trying %s%s\n", buf, fdp->suffix); - if ( FSMakeFSSpec(refnum, dirid, fnbuf, &fss) == noErr ) { - /* Found it. */ - strcpy(buf+*lenp, fdp->suffix); - return fdp; - } - } - return 0; -} |