From 697842f58cfa15e86e92fa1c2733d7d9908a340e Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Mon, 10 Sep 2001 22:00:39 +0000 Subject: Replaced PyMac_FullPath by PyMac_FullPathname, which has an extra 'length' parameter for the return string (as unix pathnames are not limited by the 255 char pstring limit). Implemented the function for MachO-Python, where it returns unix pathnames. --- Mac/Include/macglue.h | 1 - Mac/Modules/macfsmodule.c | 15 ++++++++------- Mac/Modules/macosmodule.c | 12 ++++++++---- Mac/Python/macgetargv.c | 30 ++++++++++-------------------- Mac/Python/macgetpath.c | 9 +++++++-- Python/mactoolboxglue.c | 42 +++++++++++++++++++++++++++++++++++++++++- 6 files changed, 74 insertions(+), 35 deletions(-) diff --git a/Mac/Include/macglue.h b/Mac/Include/macglue.h index 8057c28..eb0c9a1 100644 --- a/Mac/Include/macglue.h +++ b/Mac/Include/macglue.h @@ -62,7 +62,6 @@ extern short PyMac_AppRefNum; /* RefNum of application rsrcfork (from macmain. extern FSSpec PyMac_ApplicationFSSpec; /* Application location (from macargv.c) */ extern char PyMac_ApplicationPath[]; /* Application location (from macargv.c) */ extern OSErr PyMac_init_application_location(void); /* Init the above */ -extern OSErr PyMac_GetFullPath(FSSpec *, char *); /* convert fsspec->path (macargv.c) */ extern int PyMac_GetArgv(char ***, int); /* Get argc, argv (from macargv.c) */ extern int PyMac_AppearanceCompliant; /* True if in appearance support mode */ diff --git a/Mac/Modules/macfsmodule.c b/Mac/Modules/macfsmodule.c index 2c20e89..15d9f30 100644 --- a/Mac/Modules/macfsmodule.c +++ b/Mac/Modules/macfsmodule.c @@ -51,6 +51,12 @@ extern PyObject *_PyMac_BuildFSRef(FSRef *); #endif static PyObject *ErrorObject; +#ifdef TARGET_API_MAC_OSX +#define PATHNAMELEN 1024 +#else +#define PATHNAMELEN 256 +#endif + /* ----------------------------------------------------- */ /* Declarations for objects of type Alias */ @@ -449,22 +455,17 @@ PyMac_SetFileDates(FSSpec *fss, unsigned long crdat, unsigned long mddat, static PyObject * mfss_as_pathname(mfssobject *self, PyObject *args) { -#if TARGET_API_MAC_OSX - PyErr_SetString(PyExc_NotImplementedError, "FSSpec.as_pathname not supported on this platform"); - return 0; -#else - char strbuf[257]; + char strbuf[PATHNAMELEN]; OSErr err; if (!PyArg_ParseTuple(args, "")) return NULL; - err = PyMac_GetFullPath(&self->fsspec, strbuf); + err = PyMac_GetFullPathname(&self->fsspec, strbuf, PATHNAMELEN); if ( err ) { PyErr_Mac(ErrorObject, err); return NULL; } return PyString_FromString(strbuf); -#endif } static PyObject * diff --git a/Mac/Modules/macosmodule.c b/Mac/Modules/macosmodule.c index 0b8d856..6b8b87d 100644 --- a/Mac/Modules/macosmodule.c +++ b/Mac/Modules/macosmodule.c @@ -40,6 +40,12 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. static PyObject *MacOS_Error; /* Exception MacOS.Error */ +#ifdef TARGET_API_MAC_OSX +#define PATHNAMELEN 1024 +#else +#define PATHNAMELEN 256 +#endif + #ifdef MPW #define bufferIsSmall -607 /*error returns from Post and Accept */ #endif @@ -596,15 +602,14 @@ MacOS_openrf(PyObject *self, PyObject *args) err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum); -#if !TARGET_API_MAC_OSX if ( err == fnfErr ) { /* In stead of doing complicated things here to get creator/type ** correct we let the standard i/o library handle it */ FILE *tfp; - char pathname[257]; + char pathname[PATHNAMELEN]; - if ( err=PyMac_GetFullPath(&fss, pathname) ) { + if ( err=PyMac_GetFullPathname(&fss, pathname, PATHNAMELEN) ) { PyMac_Error(err); Py_DECREF(fp); return NULL; @@ -618,7 +623,6 @@ MacOS_openrf(PyObject *self, PyObject *args) fclose(tfp); err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum); } -#endif if ( err ) { Py_DECREF(fp); PyMac_Error(err); diff --git a/Mac/Python/macgetargv.c b/Mac/Python/macgetargv.c index c5af0ec..8fdbad5 100644 --- a/Mac/Python/macgetargv.c +++ b/Mac/Python/macgetargv.c @@ -54,10 +54,16 @@ typedef unsigned long refcontype; #include "Python.h" #include "macglue.h" +#ifdef TARGET_API_MAC_OSX +#define PATHNAMELEN 1024 +#else +#define PATHNAMELEN 256 +#endif + static int arg_count; static char *arg_vector[256]; FSSpec PyMac_ApplicationFSSpec; -char PyMac_ApplicationPath[256]; +char PyMac_ApplicationPath[PATHNAMELEN]; /* Duplicate a string to the heap. We also export this since it isn't standard ** and others use it @@ -73,22 +79,6 @@ strdup(const char *src) } #endif -#if TARGET_API_MAC_OSX -OSErr -PyMac_GetFullPath(FSSpec *fss, char *path) -{ - FSRef fsr; - OSErr err; - - *path = '\0'; - err = FSpMakeFSRef(fss, &fsr); - if ( err ) return err; - err = (OSErr)FSRefMakePath(&fsr, path, 1024); - if ( err ) return err; - return 0; -} -#endif /* TARGET_API_MAC_OSX */ - #if !TARGET_API_MAC_OSX /* Initialize FSSpec and full name of current application */ @@ -109,7 +99,7 @@ PyMac_init_process_location(void) info.processAppSpec = &PyMac_ApplicationFSSpec; if ( err=GetProcessInformation(¤tPSN, &info)) return err; - if ( err=PyMac_GetFullPath(&PyMac_ApplicationFSSpec, PyMac_ApplicationPath) ) + if ( err=PyMac_GetFullPathname(&PyMac_ApplicationFSSpec, PyMac_ApplicationPath, PATHNAMELEN) ) return err; applocation_inited = 1; return 0; @@ -170,7 +160,7 @@ handle_open_doc(const AppleEvent *theAppleEvent, AppleEvent *reply, refcontype r DescType rttype; long i, ndocs, size; FSSpec fss; - char path[1024]; + char path[PATHNAMELEN]; got_one = 1; if ((err = AEGetParamDesc(theAppleEvent, @@ -185,7 +175,7 @@ handle_open_doc(const AppleEvent *theAppleEvent, AppleEvent *reply, refcontype r &keywd, &rttype, &fss, sizeof(fss), &size); if (err) break; - PyMac_GetFullPath(&fss, path); + PyMac_GetFullPathname(&fss, path, PATHNAMELEN); arg_vector[arg_count++] = strdup(path); } return err; diff --git a/Mac/Python/macgetpath.c b/Mac/Python/macgetpath.c index 83117ed..e087023 100644 --- a/Mac/Python/macgetpath.c +++ b/Mac/Python/macgetpath.c @@ -38,6 +38,11 @@ PERFORMANCE OF THIS SOFTWARE. #include #endif +#ifdef TARGET_API_MAC_OSX +#define PATHNAMELEN 1024 +#else +#define PATHNAMELEN 256 +#endif /* Return the initial python search path. This is called once from ** initsys() to initialize sys.path. @@ -244,7 +249,7 @@ char * PyMac_GetPythonDir() { static int diditbefore = 0; - static char name[256] = {':', '\0'}; + static char name[PATHNAMELEN] = {':', '\0'}; AliasHandle handle; FSSpec dirspec; Boolean modified = 0; @@ -285,7 +290,7 @@ PyMac_GetPythonDir() if ( prefrh != -1 ) CloseResFile(prefrh); UseResFile(oldrh); - if ( PyMac_GetFullPath(&dirspec, name) == 0 ) { + if ( PyMac_GetFullPathname(&dirspec, name, PATHNAMELEN) == 0 ) { strcat(name, ":"); } else { /* If all fails, we return the current directory */ diff --git a/Python/mactoolboxglue.c b/Python/mactoolboxglue.c index 0781a3b..52ff00b 100644 --- a/Python/mactoolboxglue.c +++ b/Python/mactoolboxglue.c @@ -93,7 +93,7 @@ PyObject *PyMac_OSErrException; /* Initialize and return PyMac_OSErrException */ PyObject * -PyMac_GetOSErrException() +PyMac_GetOSErrException(void) { if (PyMac_OSErrException == NULL) PyMac_OSErrException = PyString_FromString("MacOS.Error"); @@ -127,6 +127,46 @@ PyMac_Error(OSErr err) return PyErr_Mac(PyMac_GetOSErrException(), err); } + +#if TARGET_API_MAC_OSX +OSErr +PyMac_GetFullPathname(FSSpec *fss, char *path, int len) +{ + FSRef fsr; + OSErr err; + + *path = '\0'; + err = FSpMakeFSRef(fss, &fsr); + if ( err == fnfErr ) { + /* FSSpecs can point to non-existing files, fsrefs can't. */ + FSSpec fss2; + int tocopy; + + err = FSMakeFSSpec(fss->vRefNum, fss->parID, "", &fss2); + if ( err ) return err; + err = FSpMakeFSRef(&fss2, &fsr); + if ( err ) return err; + err = (OSErr)FSRefMakePath(&fsr, path, len-1); + if ( err ) return err; + /* This part is not 100% safe: we append the filename part, but + ** I'm not sure that we don't run afoul of the various 8bit + ** encodings here. Will have to look this up at some point... + */ + strcat(path, "/"); + tocopy = fss->name[0]; + if ( strlen(path) + tocopy >= len ) + tocopy = len - strlen(path) - 1; + if ( tocopy > 0 ) + strncat(path, fss->name+1, tocopy); + } else { + if ( err ) return err; + err = (OSErr)FSRefMakePath(&fsr, path, len); + if ( err ) return err; + } + return 0; +} + +#endif /* TARGET_API_MAC_OSX */ /* Convert a 4-char string object argument to an OSType value */ int PyMac_GetOSType(PyObject *v, OSType *pr) -- cgit v0.12