summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2001-09-10 22:00:39 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2001-09-10 22:00:39 (GMT)
commit697842f58cfa15e86e92fa1c2733d7d9908a340e (patch)
tree7f5045964d5946de3f348459fb485a2463eddb69
parentb0e8e9b72fb6eb42ecd4d9ea9e88563d1ca4528a (diff)
downloadcpython-697842f58cfa15e86e92fa1c2733d7d9908a340e.zip
cpython-697842f58cfa15e86e92fa1c2733d7d9908a340e.tar.gz
cpython-697842f58cfa15e86e92fa1c2733d7d9908a340e.tar.bz2
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.
-rw-r--r--Mac/Include/macglue.h1
-rw-r--r--Mac/Modules/macfsmodule.c15
-rw-r--r--Mac/Modules/macosmodule.c12
-rw-r--r--Mac/Python/macgetargv.c30
-rw-r--r--Mac/Python/macgetpath.c9
-rw-r--r--Python/mactoolboxglue.c42
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(&currentPSN, &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 <unistd.h>
#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)