diff --git a/Mac/Python/macgetargv.c b/Mac/Python/macgetargv.c index e0ecb8eeaae..c1d1e3edef0 100644 --- a/Mac/Python/macgetargv.c +++ b/Mac/Python/macgetargv.c @@ -46,6 +46,9 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include +#include "Python.h" +#include "macglue.h" + #ifdef GENERATINGCFM /* Defined to 0 or 1 in Universal headers */ #define HAVE_UNIVERSAL_HEADERS #endif @@ -61,6 +64,9 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. static int arg_count; static char *arg_vector[256]; +FSSpec PyMac_ApplicationFSSpec; +char PyMac_ApplicationPath[256]; +static int applocation_inited; /* Duplicate a string to the heap. We also export this since it isn't standard ** and others use it @@ -75,20 +81,27 @@ strdup(char *src) return dst; } -/* Return FSSpec of current application */ +/* Initialize FSSpec and full name of current application */ OSErr -PyMac_process_location(FSSpec *applicationSpec) +PyMac_init_process_location() { ProcessSerialNumber currentPSN; ProcessInfoRec info; + OSErr err; + if ( applocation_inited ) return 0; currentPSN.highLongOfPSN = 0; currentPSN.lowLongOfPSN = kCurrentProcess; info.processInfoLength = sizeof(ProcessInfoRec); info.processName = NULL; - info.processAppSpec = applicationSpec; - return GetProcessInformation(¤tPSN, &info); + info.processAppSpec = &PyMac_ApplicationFSSpec; + if ( err=GetProcessInformation(¤tPSN, &info)) + return err; + if ( err=PyMac_GetFullPath(&PyMac_ApplicationFSSpec, PyMac_ApplicationPath) ) + return err; + applocation_inited = 1; + return 0; } /* Given an FSSpec, return the FSSpec of the parent folder */ @@ -114,8 +127,8 @@ get_folder_parent (FSSpec * fss, FSSpec * parent) /* Given an FSSpec return a full, colon-separated pathname */ -static OSErr -get_full_path (FSSpec *fss, char *buf) +OSErr +PyMac_GetFullPath (FSSpec *fss, char *buf) { short err; FSSpec fss_parent, fss_current; @@ -146,21 +159,6 @@ get_full_path (FSSpec *fss, char *buf) return 0; } -/* Return the full program name */ - -static char * -get_application_name() -{ - static char appname[256]; - FSSpec appspec; - - if (PyMac_process_location(&appspec)) - return NULL; - if (get_full_path(&appspec, appname)) - return NULL; - return appname; -} - /* Check that there aren't any args remaining in the event */ static OSErr @@ -230,7 +228,7 @@ handle_open_doc(AppleEvent *theAppleEvent, AppleEvent *reply, long refCon) &keywd, &rttype, &fss, sizeof(fss), &size); if (err) break; - get_full_path(&fss, path); + PyMac_GetFullPath(&fss, path); arg_vector[arg_count++] = strdup(path); } return err; @@ -301,7 +299,8 @@ PyMac_GetArgv(pargv, noevents) { arg_count = 0; - arg_vector[arg_count++] = strdup(get_application_name()); + (void)PyMac_init_process_location(); + arg_vector[arg_count++] = strdup(PyMac_ApplicationPath); if( !noevents ) { set_ae_handlers(); diff --git a/Mac/Python/macgetpath.c b/Mac/Python/macgetpath.c index a7c1366eb83..11eea575fe8 100644 --- a/Mac/Python/macgetpath.c +++ b/Mac/Python/macgetpath.c @@ -147,10 +147,11 @@ PyMac_OpenPrefFile() printf("Cannot create preferences file, error %d\n", ResError()); exit(1); } - if ( (err=PyMac_process_location(&dirspec)) != 0 ) { - printf("Cannot get FSSpec for application, error %d\n", err); + if ( (err=PyMac_init_process_location()) != 0 ) { + printf("Cannot get application location, error %d\n", err); exit(1); } + dirspec = PyMac_ApplicationFSSpec; dirspec.name[0] = 0; if ((err=NewAlias(NULL, &dirspec, &handle)) != 0 ) { printf("Cannot make alias to application directory, error %d\n", err); @@ -212,7 +213,7 @@ PyMac_GetPythonDir() if ( prefrh != -1 ) CloseResFile(prefrh); UseResFile(oldrh); - if ( nfullpath(&dirspec, name) == 0 ) { + if ( PyMac_GetFullPath(&dirspec, name) == 0 ) { strcat(name, ":"); } else { /* If all fails, we return the current directory */ @@ -228,7 +229,6 @@ PyMac_GetPythonDir() static char * PyMac_GetPythonPath() { - FSSpec dirspec; short oldrh, prefrh = -1; char *rv; int i, newlen; @@ -289,20 +289,16 @@ PyMac_GetPythonPath() rv[newlen-1] = 0; } else if ( pathitem[0] >= 14 && strncmp((char *)pathitem+1, "$(APPLICATION)", 14) == 0 ) { /* This is the application itself */ - char fullname[256]; - if ( (err=PyMac_process_location(&dirspec)) != 0 ) { - printf("Cannot get FSSpec for application, error %d\n", err); + if ( (err=PyMac_init_process_location()) != 0 ) { + printf("Cannot get application location, error %d\n", err); exit(1); } - if ( nfullpath(&dirspec, fullname) != 0 ) { - printf("Cannot convert application fsspec to path\n"); - exit(1); - } - newlen = strlen(rv) + strlen(fullname) + 2; + + newlen = strlen(rv) + strlen(PyMac_ApplicationPath) + 2; if( (rv=realloc(rv, newlen)) == NULL) goto out; - strcpy(rv+strlen(rv), fullname); + strcpy(rv+strlen(rv), PyMac_ApplicationPath); rv[newlen-2] = '\n'; rv[newlen-1] = 0;