mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
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.
This commit is contained in:
parent
b0e8e9b72f
commit
697842f58c
6 changed files with 74 additions and 35 deletions
|
@ -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 *);
|
||||||
#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,
|
||||||
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.
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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;
|
||||||
#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)
|
||||||
}
|
}
|
||||||
#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)
|
||||||
info.processAppSpec = &PyMac_ApplicationFSSpec;
|
info.processAppSpec = &PyMac_ApplicationFSSpec;
|
||||||
if ( err=GetProcessInformation(¤tPSN, &info))
|
if ( err=GetProcessInformation(¤tPSN, &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
|
||||||
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
|
||||||
&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.
|
||||||
#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 *
|
||||||
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()
|
||||||
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;
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue