diff options
-rw-r--r-- | Mac/Python/macgetpath.c | 282 | ||||
-rw-r--r-- | Mac/Python/macgetplatform.c | 7 |
2 files changed, 289 insertions, 0 deletions
diff --git a/Mac/Python/macgetpath.c b/Mac/Python/macgetpath.c new file mode 100644 index 0000000..12fcf71 --- /dev/null +++ b/Mac/Python/macgetpath.c @@ -0,0 +1,282 @@ +#include "Python.h" +#include "osdefs.h" + +#include "pythonresources.h" + + +/* Return the initial python search path. This is called once from +** initsys() to initialize sys.path. +** +** If USE_BUILTIN_PATH is defined the path defined here is used +** (after prepending the python home dir to each item). +** If it is not defined the path is gotten from a resource in the +** Preferences file. +** +** XXXX This code needs cleaning up. The routines here have moved +** around quite a bit, and they're pretty messy for that reason. +*/ + +#include <Files.h> +#include <Aliases.h> +#include <Folders.h> +#include <Resources.h> +#include <TextUtils.h> + +#define PYTHONPATH "\ +:\n\ +:Lib\n\ +:Lib:stdwin\n\ +:Lib:test\n\ +:Lib:mac" + + +char * +getpythonpath() +{ + /* Modified by Jack to do something a bit more sensible: + ** - Prepend the python home-directory (which is obtained from a Preferences + ** resource) + ** - Add : + */ + static char *pythonpath; + char *curwd; + char *p, *endp; + int newlen; + extern char *PyMac_GetPythonDir(); +#ifndef USE_BUILTIN_PATH + extern char *PyMac_GetPythonPath(); +#endif + + if ( pythonpath ) return pythonpath; + curwd = PyMac_GetPythonDir(); +#ifndef USE_BUILTIN_PATH + if ( pythonpath = PyMac_GetPythonPath(curwd) ) + return pythonpath; + printf("Warning: No pythonpath resource found, using builtin default\n"); +#endif + p = PYTHONPATH; + endp = p; + pythonpath = malloc(2); + if ( pythonpath == NULL ) return PYTHONPATH; + strcpy(pythonpath, ":"); + while (*endp) { + endp = strchr(p, '\n'); + if ( endp == NULL ) + endp = p + strlen(p); + newlen = strlen(pythonpath) + 1 + strlen(curwd) + (endp-p); + pythonpath = realloc(pythonpath, newlen+1); + if ( pythonpath == NULL ) return PYTHONPATH; + strcat(pythonpath, "\n"); + if ( *p == ':' ) { + p++; + strcat(pythonpath, curwd); + strncat(pythonpath, p, (endp-p)); + newlen--; /* Ok, ok, we've allocated one byte too much */ + } else { + /* We've allocated too much in this case */ + newlen -= strlen(curwd); + pythonpath = realloc(pythonpath, newlen+1); + if ( pythonpath == NULL ) return PYTHONPATH; + strncat(pythonpath, p, (endp-p)); + } + pythonpath[newlen] = '\0'; + p = endp + 1; + } + return pythonpath; +} + + +/* +** Return the name of the Python directory +*/ +char * +PyMac_GetPythonDir() +{ + int item; + static char name[256]; + AliasHandle handle; + FSSpec dirspec; + int ok = 0; + Boolean modified = 0, cannotmodify = 0; + short oldrh, prefrh; + short prefdirRefNum; + long prefdirDirID; + + /* + ** Remember old resource file and try to open preferences file + ** in the preferences folder. If it doesn't exist we try to create + ** it. If anything fails here we limp on, but set cannotmodify so + ** we don't try to store things later on. + */ + oldrh = CurResFile(); + if ( FindFolder(kOnSystemDisk, 'pref', kDontCreateFolder, &prefdirRefNum, + &prefdirDirID) != noErr ) { + /* Something wrong with preferences folder */ + cannotmodify = 1; + } else { + (void)FSMakeFSSpec(prefdirRefNum, prefdirDirID, "\pPython Preferences", &dirspec); + prefrh = FSpOpenResFile(&dirspec, fsRdWrShPerm); + if ( prefrh == -1 ) { +#ifdef USE_MAC_MODPREFS + /* It doesn't exist. Try to create it */ + FSpCreateResFile(&dirspec, 'PYTH', 'pref', 0); + prefrh = FSpOpenResFile(&dirspec, fsRdWrShPerm); + if ( prefrh == -1 ) { + /* This is strange, what should we do now? */ + cannotmodify = 1; + } else { + UseResFile(prefrh); + } +#else + printf("Error: no Preferences file. Attempting to limp on...\n"); + name[0] = 0; + getwd(name); + return name; +#endif + } + } + /* So, we've opened our preferences file, we hope. Look for the alias */ + handle = (AliasHandle)Get1Resource('alis', PYTHONHOME_ID); + if ( handle ) { + /* It exists. Resolve it (possibly updating it) */ + if ( ResolveAlias(NULL, handle, &dirspec, &modified) == noErr ) { + ok = 1; + } + } + if ( !ok ) { +#ifdef USE_MAC_MODPREFS + /* No luck, so far. ask the user for help */ + item = Alert(NOPYTHON_ALERT, NULL); + if ( item == YES_ITEM ) { + /* The user wants to point us to a directory. Let her do so */ + ok = PyMac_GetDirectory(&dirspec); + if ( ok ) + modified = 1; + } else if ( item == CURWD_ITEM ) { + /* The user told us the current directory is fine. Build an FSSpec for it */ + if ( getwd(name) ) { + if ( FSMakeFSSpec(0, 0, Pstring(name), &dirspec) == 0 ) { + ok = 1; + modified = 1; + } + } + } + if ( handle ) { + /* Set the (old, invalid) alias record to the new data */ + UpdateAlias(NULL, &dirspec, handle, &modified); + } +#else + printf("Error: corrupted Preferences file. Attempting to limp on...\n"); + name[0] = 0; + getwd(name); + return name; +#endif + } +#ifdef USE_MAC_MODPREFS + if ( ok && modified && !cannotmodify) { + /* We have a new, valid fsspec and we can update the preferences file. Do so. */ + if ( !handle ) { + if (NewAlias(NULL, &dirspec, &handle) == 0 ) + AddResource((Handle)handle, 'alis', PYTHONHOME_ID, "\p"); + } else { + ChangedResource((Handle)handle); + } + UpdateResFile(prefrh); + } +#endif + if ( !cannotmodify ) { + /* This means we have the resfile open. Close it. */ + CloseResFile(prefrh); + } + /* Back to the old resource file */ + UseResFile(oldrh); + /* Now turn the fsspec into a path to give back to our caller */ + if ( ok ) { + ok = (nfullpath(&dirspec, name) == 0); + if ( ok ) strcat(name, ":"); + } + if ( !ok ) { + /* If all fails, we return the current directory */ + name[0] = 0; + (void)getwd(name); + } + return name; +} + +#ifndef USE_BUILTIN_PATH +char * +PyMac_GetPythonPath(dir) +char *dir; +{ + FSSpec dirspec; + short oldrh, prefrh = -1; + short prefdirRefNum; + long prefdirDirID; + char *rv; + int i, newlen; + Str255 pathitem; + + /* + ** Remember old resource file and try to open preferences file + ** in the preferences folder. + */ + oldrh = CurResFile(); + if ( FindFolder(kOnSystemDisk, 'pref', kDontCreateFolder, &prefdirRefNum, + &prefdirDirID) == noErr ) { + (void)FSMakeFSSpec(prefdirRefNum, prefdirDirID, "\pPython Preferences", &dirspec); + prefrh = FSpOpenResFile(&dirspec, fsRdWrShPerm); + } + /* At this point, we may or may not have the preferences file open, and it + ** may or may not contain a sys.path STR# resource. We don't care, if it doesn't + ** exist we use the one from the application (the default). + ** We put an initial '\n' in front of the path that we don't return to the caller + */ + if( (rv = malloc(2)) == NULL ) + goto out; + strcpy(rv, "\n"); + for(i=1; ; i++) { + GetIndString(pathitem, PYTHONPATH_ID, i); + if( pathitem[0] == 0 ) + break; + if ( pathitem[0] >= 9 && strncmp((char *)pathitem+1, "$(PYTHON)", 9) == 0 ) { + /* We have to put the directory in place */ + newlen = strlen(rv) + strlen(dir) + (pathitem[0]-9) + 2; + if( (rv=realloc(rv, newlen)) == NULL) + goto out; + strcat(rv, dir); + /* Skip a colon at the beginning of the item */ + if ( pathitem[0] > 9 && pathitem[1+9] == ':' ) { + memcpy(rv+strlen(rv), pathitem+1+10, pathitem[0]-10); + newlen--; + } else { + memcpy(rv+strlen(rv), pathitem+1+9, pathitem[0]-9); + } + rv[newlen-2] = '\n'; + rv[newlen-1] = 0; + } else { + /* Use as-is */ + newlen = strlen(rv) + (pathitem[0]) + 2; + if( (rv=realloc(rv, newlen)) == NULL) + goto out; + memcpy(rv+strlen(rv), pathitem+1, pathitem[0]); + rv[newlen-2] = '\n'; + rv[newlen-1] = 0; + } + } + if( strlen(rv) == 1) { + free(rv); + rv = NULL; + } + if ( rv ) { + rv[strlen(rv)-1] = 0; + rv++; + } +out: + if ( prefrh ) { + CloseResFile(prefrh); + UseResFile(oldrh); + } + return rv; +} +#endif /* !USE_BUILTIN_PATH */ + diff --git a/Mac/Python/macgetplatform.c b/Mac/Python/macgetplatform.c new file mode 100644 index 0000000..a454214 --- /dev/null +++ b/Mac/Python/macgetplatform.c @@ -0,0 +1,7 @@ + +char * +getplatform() +{ + return "mac"; +} + |