mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03: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
|
|
@ -1253,6 +1253,49 @@ static PyObject *FSSpec_IsAliasFile(FSSpecObject *_self, PyObject *_args)
|
|||
return _res;
|
||||
}
|
||||
|
||||
static 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;
|
||||
}
|
||||
|
||||
static PyObject *FSSpec_as_pathname(FSSpecObject *_self, PyObject *_args)
|
||||
{
|
||||
PyObject *_res = NULL;
|
||||
|
|
@ -1262,7 +1305,7 @@ static PyObject *FSSpec_as_pathname(FSSpecObject *_self, PyObject *_args)
|
|||
|
||||
if (!PyArg_ParseTuple(_args, ""))
|
||||
return NULL;
|
||||
err = PyMac_GetFullPathname(&_self->ob_itself, strbuf, sizeof(strbuf));
|
||||
err = _PyMac_GetFullPathname(&_self->ob_itself, strbuf, sizeof(strbuf));
|
||||
if ( err ) {
|
||||
PyMac_Error(err);
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -338,11 +338,64 @@ static char geterr_doc[] = "Convert OSErr number to string";
|
|||
static PyObject *
|
||||
MacOS_GetErrorString(PyObject *self, PyObject *args)
|
||||
{
|
||||
int errn;
|
||||
int err;
|
||||
char buf[256];
|
||||
Handle h;
|
||||
char *str;
|
||||
static int errors_loaded;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "i", &errn))
|
||||
if (!PyArg_ParseTuple(args, "i", &err))
|
||||
return NULL;
|
||||
return Py_BuildValue("s", PyMac_StrError(errn));
|
||||
|
||||
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();
|
||||
PyErr_Clear();
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
** 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 Py_BuildValue("s", buf);
|
||||
}
|
||||
|
||||
static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue