mirror of
https://github.com/python/cpython.git
synced 2025-07-19 01:05:26 +00:00
SF patch #1035255: Remove CoreServices / CoreFoundation dependencies in core
(Contributed by Bob Ippolito.) This patch trims down the Python core on Darwin by making it independent of CoreFoundation and CoreServices. It does this by: Changed linker flags in configure/configure.in Removed the unused PyMac_GetAppletScriptFile Moved the implementation of PyMac_StrError to the MacOS module Moved the implementation of PyMac_GetFullPathname to the Carbon.File module
This commit is contained in:
parent
e0bdaefaf4
commit
ec6eb369d5
5 changed files with 189 additions and 188 deletions
|
@ -28,57 +28,39 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
|
||||
|
||||
/* Like strerror() but for Mac OS error numbers */
|
||||
char *PyMac_StrError(int err)
|
||||
char *
|
||||
PyMac_StrError(int err)
|
||||
{
|
||||
static char buf[256];
|
||||
Handle h;
|
||||
char *str;
|
||||
static int errors_loaded;
|
||||
|
||||
h = GetResource('Estr', err);
|
||||
if (!h && !errors_loaded) {
|
||||
/*
|
||||
** Attempt to open the resource file containing the
|
||||
** Estr resources. We ignore all errors. We also try
|
||||
** this only once.
|
||||
*/
|
||||
PyObject *m, *rv;
|
||||
errors_loaded = 1;
|
||||
|
||||
m = PyImport_ImportModule("macresource");
|
||||
if (!m) {
|
||||
if (Py_VerboseFlag)
|
||||
PyErr_Print();
|
||||
PyObject *m;
|
||||
PyObject *rv;
|
||||
|
||||
m = PyImport_ImportModule("MacOS");
|
||||
if (!m) {
|
||||
if (Py_VerboseFlag)
|
||||
PyErr_Print();
|
||||
PyErr_Clear();
|
||||
rv = NULL;
|
||||
}
|
||||
else {
|
||||
rv = PyObject_CallMethod(m, "GetErrorString", "i", err);
|
||||
if (!rv)
|
||||
PyErr_Clear();
|
||||
}
|
||||
if (!rv) {
|
||||
buf[0] = '\0';
|
||||
}
|
||||
else {
|
||||
char *input = PyString_AsString(rv);
|
||||
if (!input) {
|
||||
PyErr_Clear();
|
||||
buf[0] = '\0';
|
||||
} else {
|
||||
rv = PyObject_CallMethod(m, "open_error_resource", "");
|
||||
if (!rv) {
|
||||
if (Py_VerboseFlag)
|
||||
PyErr_Print();
|
||||
PyErr_Clear();
|
||||
} else {
|
||||
Py_DECREF(rv);
|
||||
/* And try again... */
|
||||
h = GetResource('Estr', err);
|
||||
}
|
||||
strncpy(buf, input, sizeof(buf) - 1);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
}
|
||||
}
|
||||
/*
|
||||
** Whether the code above succeeded or not, we won't try
|
||||
** again.
|
||||
*/
|
||||
errors_loaded = 1;
|
||||
|
||||
if ( h ) {
|
||||
HLock(h);
|
||||
str = (char *)*h;
|
||||
memcpy(buf, str+1, (unsigned char)str[0]);
|
||||
buf[(unsigned char)str[0]] = '\0';
|
||||
HUnlock(h);
|
||||
ReleaseResource(h);
|
||||
} else {
|
||||
PyOS_snprintf(buf, sizeof(buf), "Mac OS error code %d", err);
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
@ -125,124 +107,51 @@ PyMac_Error(OSErr err)
|
|||
OSErr
|
||||
PyMac_GetFullPathname(FSSpec *fss, char *path, int len)
|
||||
{
|
||||
FSRef fsr;
|
||||
OSErr err;
|
||||
|
||||
PyObject *fs, *exc;
|
||||
PyObject *rv = NULL;
|
||||
char *input;
|
||||
OSErr err = noErr;
|
||||
|
||||
*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;
|
||||
|
||||
fs = PyMac_BuildFSSpec(fss);
|
||||
if (!fs)
|
||||
goto error;
|
||||
|
||||
rv = PyObject_CallMethod(fs, "as_pathname", "");
|
||||
if (!rv)
|
||||
goto error;
|
||||
|
||||
input = PyString_AsString(rv);
|
||||
if (!input)
|
||||
goto error;
|
||||
|
||||
strncpy(path, input, len - 1);
|
||||
path[len - 1] = '\0';
|
||||
|
||||
Py_XDECREF(rv);
|
||||
Py_XDECREF(fs);
|
||||
return err;
|
||||
|
||||
error:
|
||||
exc = PyErr_Occurred();
|
||||
if (exc && PyErr_GivenExceptionMatches(exc,
|
||||
PyMac_GetOSErrException())) {
|
||||
PyObject *args = PyObject_GetAttrString(exc, "args");
|
||||
if (args) {
|
||||
char *ignore;
|
||||
PyArg_ParseTuple(args, "is", &err, &ignore);
|
||||
Py_XDECREF(args);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
if (err == noErr)
|
||||
err = -1;
|
||||
PyErr_Clear();
|
||||
Py_XDECREF(rv);
|
||||
Py_XDECREF(fs);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
#ifdef WITH_NEXT_FRAMEWORK
|
||||
/*
|
||||
** In a bundle, find a file "resourceName" of type "resourceType". Return the
|
||||
** full pathname in "resourceURLCstr".
|
||||
*/
|
||||
static int
|
||||
locateResourcePy(CFStringRef resourceType, CFStringRef resourceName, char *resourceURLCStr, int length)
|
||||
{
|
||||
CFBundleRef mainBundle = NULL;
|
||||
CFURLRef URL, absoluteURL;
|
||||
CFStringRef filenameString, filepathString;
|
||||
CFIndex size, i;
|
||||
CFArrayRef arrayRef = NULL;
|
||||
int success = 0;
|
||||
|
||||
CFURLPathStyle thePathStyle = kCFURLPOSIXPathStyle;
|
||||
|
||||
/* Get a reference to our main bundle */
|
||||
mainBundle = CFBundleGetMainBundle();
|
||||
|
||||
/* If we are running inside a bundle, look through it. Otherwise, do nothing. */
|
||||
if (mainBundle) {
|
||||
|
||||
/* Look for py files in the main bundle by type */
|
||||
arrayRef = CFBundleCopyResourceURLsOfType( mainBundle,
|
||||
resourceType,
|
||||
NULL );
|
||||
|
||||
/* See if there are any filename matches */
|
||||
size = CFArrayGetCount(arrayRef);
|
||||
for (i = 0; i < size; i++) {
|
||||
URL = CFArrayGetValueAtIndex(arrayRef, i);
|
||||
filenameString = CFURLCopyLastPathComponent(URL);
|
||||
if (CFStringCompare(filenameString, resourceName, 0) == kCFCompareEqualTo) {
|
||||
/* We found a match, get the file's full path */
|
||||
absoluteURL = CFURLCopyAbsoluteURL(URL);
|
||||
filepathString = CFURLCopyFileSystemPath(absoluteURL, thePathStyle);
|
||||
CFRelease(absoluteURL);
|
||||
|
||||
/* Copy the full path into the caller's character buffer */
|
||||
success = CFStringGetCString(filepathString, resourceURLCStr, length,
|
||||
kCFStringEncodingMacRoman);
|
||||
|
||||
CFRelease(filepathString);
|
||||
}
|
||||
CFRelease(filenameString);
|
||||
}
|
||||
CFRelease(arrayRef);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
/*
|
||||
** iff we are running in a .app framework then we could be
|
||||
** the main program for an applet. In that case, return the
|
||||
** script filename for the applet.
|
||||
** Otherwise return NULL.
|
||||
*/
|
||||
char *
|
||||
PyMac_GetAppletScriptFile(void)
|
||||
{
|
||||
static char scriptpath[1024];
|
||||
|
||||
/* First we see whether we have __rawmain__.py and run that if it
|
||||
** is there. This is used for applets that want sys.argv to be
|
||||
** unix-like: __rawmain__ will construct it (from the initial appleevent)
|
||||
** and then call __main__.py.
|
||||
*/
|
||||
if (locateResourcePy(CFSTR("py"), CFSTR("__rawmain__.py"), scriptpath, 1024)) {
|
||||
return scriptpath;
|
||||
} else if (locateResourcePy(CFSTR("pyc"), CFSTR("__rawmain__.pyc"), scriptpath, 1024)) {
|
||||
return scriptpath;
|
||||
} else if (locateResourcePy(CFSTR("py"), CFSTR("__main__.py"), scriptpath, 1024)) {
|
||||
return scriptpath;
|
||||
} else if (locateResourcePy(CFSTR("pyc"), CFSTR("__main__.pyc"), scriptpath, 1024)) {
|
||||
return scriptpath;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* Convert a 4-char string object argument to an OSType value */
|
||||
int
|
||||
PyMac_GetOSType(PyObject *v, OSType *pr)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue