In _PyImport_Init(), dynamically construct the table of legal suffixes

from two static tables (one standard, one provided by the platform's
dynload_*.c variant).

This is part of a set of patches by Greg Stein.
This commit is contained in:
Guido van Rossum 1999-12-20 21:23:41 +00:00
parent 9f65081d90
commit ed1170e49f
1 changed files with 33 additions and 5 deletions

View File

@ -94,17 +94,45 @@ extern struct _inittab _PyImport_Inittab[];
struct _inittab *PyImport_Inittab = _PyImport_Inittab; struct _inittab *PyImport_Inittab = _PyImport_Inittab;
/* these tables define the module suffixes that Python recognizes */
struct filedescr * _PyImport_Filetab = NULL;
static const struct filedescr _PyImport_StandardFiletab[] = {
{".py", "r", PY_SOURCE},
{".pyc", "rb", PY_COMPILED},
{0, 0}
};
/* Initialize things */ /* Initialize things */
void void
_PyImport_Init() _PyImport_Init()
{ {
const struct filedescr *scan;
struct filedescr *filetab;
int countD = 0;
int countS = 0;
/* prepare _PyImport_Filetab: copy entries from
_PyImport_DynLoadFiletab and _PyImport_StandardFiletab.
*/
for (scan = _PyImport_DynLoadFiletab; scan->suffix != NULL; ++scan)
++countD;
for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
++countS;
filetab = malloc((countD + countS + 1) * sizeof(struct filedescr));
memcpy(filetab, _PyImport_DynLoadFiletab,
countD * sizeof(struct filedescr));
memcpy(filetab + countD, _PyImport_StandardFiletab,
countS * sizeof(struct filedescr));
filetab[countD + countS].suffix = NULL;
_PyImport_Filetab = filetab;
if (Py_OptimizeFlag) { if (Py_OptimizeFlag) {
/* Replace ".pyc" with ".pyo" in import_filetab */ /* Replace ".pyc" with ".pyo" in _PyImport_Filetab */
struct filedescr *p; for (; filetab->suffix != NULL; filetab++) {
for (p = _PyImport_Filetab; p->suffix != NULL; p++) { if (strcmp(filetab->suffix, ".pyc") == 0)
if (strcmp(p->suffix, ".pyc") == 0) filetab->suffix = ".pyo";
p->suffix = ".pyo";
} }
} }
} }