Commit eed60d8f authored by Jack Jansen's avatar Jack Jansen

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.
parent 0b5775a3
...@@ -62,7 +62,6 @@ extern short PyMac_AppRefNum; /* RefNum of application rsrcfork (from macmain. ...@@ -62,7 +62,6 @@ extern short PyMac_AppRefNum; /* RefNum of application rsrcfork (from macmain.
extern FSSpec PyMac_ApplicationFSSpec; /* Application location (from macargv.c) */ extern FSSpec PyMac_ApplicationFSSpec; /* Application location (from macargv.c) */
extern char PyMac_ApplicationPath[]; /* 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_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_GetArgv(char ***, int); /* Get argc, argv (from macargv.c) */
extern int PyMac_AppearanceCompliant; /* True if in appearance support mode */ extern int PyMac_AppearanceCompliant; /* True if in appearance support mode */
......
...@@ -51,6 +51,12 @@ extern PyObject *_PyMac_BuildFSRef(FSRef *); ...@@ -51,6 +51,12 @@ extern PyObject *_PyMac_BuildFSRef(FSRef *);
#endif #endif
static PyObject *ErrorObject; static PyObject *ErrorObject;
#ifdef TARGET_API_MAC_OSX
#define PATHNAMELEN 1024
#else
#define PATHNAMELEN 256
#endif
/* ----------------------------------------------------- */ /* ----------------------------------------------------- */
/* Declarations for objects of type Alias */ /* Declarations for objects of type Alias */
...@@ -449,22 +455,17 @@ PyMac_SetFileDates(FSSpec *fss, unsigned long crdat, unsigned long mddat, ...@@ -449,22 +455,17 @@ PyMac_SetFileDates(FSSpec *fss, unsigned long crdat, unsigned long mddat,
static PyObject * static PyObject *
mfss_as_pathname(mfssobject *self, PyObject *args) mfss_as_pathname(mfssobject *self, PyObject *args)
{ {
#if TARGET_API_MAC_OSX char strbuf[PATHNAMELEN];
PyErr_SetString(PyExc_NotImplementedError, "FSSpec.as_pathname not supported on this platform");
return 0;
#else
char strbuf[257];
OSErr err; OSErr err;
if (!PyArg_ParseTuple(args, "")) if (!PyArg_ParseTuple(args, ""))
return NULL; return NULL;
err = PyMac_GetFullPath(&self->fsspec, strbuf); err = PyMac_GetFullPathname(&self->fsspec, strbuf, PATHNAMELEN);
if ( err ) { if ( err ) {
PyErr_Mac(ErrorObject, err); PyErr_Mac(ErrorObject, err);
return NULL; return NULL;
} }
return PyString_FromString(strbuf); return PyString_FromString(strbuf);
#endif
} }
static PyObject * static PyObject *
......
...@@ -40,6 +40,12 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ...@@ -40,6 +40,12 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
static PyObject *MacOS_Error; /* Exception MacOS.Error */ static PyObject *MacOS_Error; /* Exception MacOS.Error */
#ifdef TARGET_API_MAC_OSX
#define PATHNAMELEN 1024
#else
#define PATHNAMELEN 256
#endif
#ifdef MPW #ifdef MPW
#define bufferIsSmall -607 /*error returns from Post and Accept */ #define bufferIsSmall -607 /*error returns from Post and Accept */
#endif #endif
...@@ -596,15 +602,14 @@ MacOS_openrf(PyObject *self, PyObject *args) ...@@ -596,15 +602,14 @@ MacOS_openrf(PyObject *self, PyObject *args)
err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum); err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
#if !TARGET_API_MAC_OSX
if ( err == fnfErr ) { if ( err == fnfErr ) {
/* In stead of doing complicated things here to get creator/type /* In stead of doing complicated things here to get creator/type
** correct we let the standard i/o library handle it ** correct we let the standard i/o library handle it
*/ */
FILE *tfp; FILE *tfp;
char pathname[257]; char pathname[PATHNAMELEN];
if ( err=PyMac_GetFullPath(&fss, pathname) ) { if ( err=PyMac_GetFullPathname(&fss, pathname, PATHNAMELEN) ) {
PyMac_Error(err); PyMac_Error(err);
Py_DECREF(fp); Py_DECREF(fp);
return NULL; return NULL;
...@@ -618,7 +623,6 @@ MacOS_openrf(PyObject *self, PyObject *args) ...@@ -618,7 +623,6 @@ MacOS_openrf(PyObject *self, PyObject *args)
fclose(tfp); fclose(tfp);
err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum); err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
} }
#endif
if ( err ) { if ( err ) {
Py_DECREF(fp); Py_DECREF(fp);
PyMac_Error(err); PyMac_Error(err);
......
...@@ -54,10 +54,16 @@ typedef unsigned long refcontype; ...@@ -54,10 +54,16 @@ typedef unsigned long refcontype;
#include "Python.h" #include "Python.h"
#include "macglue.h" #include "macglue.h"
#ifdef TARGET_API_MAC_OSX
#define PATHNAMELEN 1024
#else
#define PATHNAMELEN 256
#endif
static int arg_count; static int arg_count;
static char *arg_vector[256]; static char *arg_vector[256];
FSSpec PyMac_ApplicationFSSpec; 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 /* Duplicate a string to the heap. We also export this since it isn't standard
** and others use it ** and others use it
...@@ -73,22 +79,6 @@ strdup(const char *src) ...@@ -73,22 +79,6 @@ strdup(const char *src)
} }
#endif #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 #if !TARGET_API_MAC_OSX
/* Initialize FSSpec and full name of current application */ /* Initialize FSSpec and full name of current application */
...@@ -109,7 +99,7 @@ PyMac_init_process_location(void) ...@@ -109,7 +99,7 @@ PyMac_init_process_location(void)
info.processAppSpec = &PyMac_ApplicationFSSpec; info.processAppSpec = &PyMac_ApplicationFSSpec;
if ( err=GetProcessInformation(&currentPSN, &info)) if ( err=GetProcessInformation(&currentPSN, &info))
return err; return err;
if ( err=PyMac_GetFullPath(&PyMac_ApplicationFSSpec, PyMac_ApplicationPath) ) if ( err=PyMac_GetFullPathname(&PyMac_ApplicationFSSpec, PyMac_ApplicationPath, PATHNAMELEN) )
return err; return err;
applocation_inited = 1; applocation_inited = 1;
return 0; return 0;
...@@ -170,7 +160,7 @@ handle_open_doc(const AppleEvent *theAppleEvent, AppleEvent *reply, refcontype r ...@@ -170,7 +160,7 @@ handle_open_doc(const AppleEvent *theAppleEvent, AppleEvent *reply, refcontype r
DescType rttype; DescType rttype;
long i, ndocs, size; long i, ndocs, size;
FSSpec fss; FSSpec fss;
char path[1024]; char path[PATHNAMELEN];
got_one = 1; got_one = 1;
if ((err = AEGetParamDesc(theAppleEvent, if ((err = AEGetParamDesc(theAppleEvent,
...@@ -185,7 +175,7 @@ handle_open_doc(const AppleEvent *theAppleEvent, AppleEvent *reply, refcontype r ...@@ -185,7 +175,7 @@ handle_open_doc(const AppleEvent *theAppleEvent, AppleEvent *reply, refcontype r
&keywd, &rttype, &fss, sizeof(fss), &size); &keywd, &rttype, &fss, sizeof(fss), &size);
if (err) if (err)
break; break;
PyMac_GetFullPath(&fss, path); PyMac_GetFullPathname(&fss, path, PATHNAMELEN);
arg_vector[arg_count++] = strdup(path); arg_vector[arg_count++] = strdup(path);
} }
return err; return err;
......
...@@ -38,6 +38,11 @@ PERFORMANCE OF THIS SOFTWARE. ...@@ -38,6 +38,11 @@ PERFORMANCE OF THIS SOFTWARE.
#include <unistd.h> #include <unistd.h>
#endif #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 /* Return the initial python search path. This is called once from
** initsys() to initialize sys.path. ** initsys() to initialize sys.path.
...@@ -244,7 +249,7 @@ char * ...@@ -244,7 +249,7 @@ char *
PyMac_GetPythonDir() PyMac_GetPythonDir()
{ {
static int diditbefore = 0; static int diditbefore = 0;
static char name[256] = {':', '\0'}; static char name[PATHNAMELEN] = {':', '\0'};
AliasHandle handle; AliasHandle handle;
FSSpec dirspec; FSSpec dirspec;
Boolean modified = 0; Boolean modified = 0;
...@@ -285,7 +290,7 @@ PyMac_GetPythonDir() ...@@ -285,7 +290,7 @@ PyMac_GetPythonDir()
if ( prefrh != -1 ) CloseResFile(prefrh); if ( prefrh != -1 ) CloseResFile(prefrh);
UseResFile(oldrh); UseResFile(oldrh);
if ( PyMac_GetFullPath(&dirspec, name) == 0 ) { if ( PyMac_GetFullPathname(&dirspec, name, PATHNAMELEN) == 0 ) {
strcat(name, ":"); strcat(name, ":");
} else { } else {
/* If all fails, we return the current directory */ /* If all fails, we return the current directory */
......
...@@ -93,7 +93,7 @@ PyObject *PyMac_OSErrException; ...@@ -93,7 +93,7 @@ PyObject *PyMac_OSErrException;
/* Initialize and return PyMac_OSErrException */ /* Initialize and return PyMac_OSErrException */
PyObject * PyObject *
PyMac_GetOSErrException() PyMac_GetOSErrException(void)
{ {
if (PyMac_OSErrException == NULL) if (PyMac_OSErrException == NULL)
PyMac_OSErrException = PyString_FromString("MacOS.Error"); PyMac_OSErrException = PyString_FromString("MacOS.Error");
...@@ -127,6 +127,46 @@ PyMac_Error(OSErr err) ...@@ -127,6 +127,46 @@ PyMac_Error(OSErr err)
return PyErr_Mac(PyMac_GetOSErrException(), 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 */ /* Convert a 4-char string object argument to an OSType value */
int int
PyMac_GetOSType(PyObject *v, OSType *pr) PyMac_GetOSType(PyObject *v, OSType *pr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment