diff options
author | Guido van Rossum <guido@python.org> | 1997-09-29 23:39:31 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-09-29 23:39:31 (GMT) |
commit | 271f97768679a350a7a5e55bbdc76141eaf75817 (patch) | |
tree | 6f58c539f7ddf1ccb4640c4b12371593a539216a | |
parent | ec6809291ddff52004d52fdb3fa8671950147236 (diff) | |
download | cpython-271f97768679a350a7a5e55bbdc76141eaf75817.zip cpython-271f97768679a350a7a5e55bbdc76141eaf75817.tar.gz cpython-271f97768679a350a7a5e55bbdc76141eaf75817.tar.bz2 |
Seem to be some changes related to DLL version from string resource,
again (Mark Hammond is the cause of all this).
-rw-r--r-- | PC/getpathp.c | 21 | ||||
-rw-r--r-- | PC/import_nt.c | 28 |
2 files changed, 44 insertions, 5 deletions
diff --git a/PC/getpathp.c b/PC/getpathp.c index 1a50dd9..d73cd73 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -155,6 +155,9 @@ search_for_prefix(argv0_path, landmark) } #ifdef MS_WIN32 +#include "malloc.h" // for alloca - see comments below! +extern const char *PyWin_DLLVersionString; // a string loaded from the DLL at startup. + /* Load a PYTHONPATH value from the registry. Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER. @@ -172,9 +175,23 @@ getpythonregpath(HKEY keyBase, BOOL bWin32s) LONG rc; char *retval = NULL; char *dataBuf; + const char keyPrefix[] = "Software\\Python\\PythonCore\\"; + const char keySuffix[] = "\\PythonPath"; + int versionLen; + char *keyBuf; + + // Tried to use sysget("winver") but here is too early :-( + versionLen = strlen(PyWin_DLLVersionString); + // alloca == no free required, but memory only local to fn. + // also no heap fragmentation! Am I being silly? + keyBuf = alloca(sizeof(keyPrefix)-1 + versionLen + sizeof(keySuffix)); // chars only, plus 1 NULL. + // lots of constants here for the compiler to optimize away :-) + memcpy(keyBuf, keyPrefix, sizeof(keyPrefix)-1); + memcpy(keyBuf+sizeof(keyPrefix)-1, PyWin_DLLVersionString, versionLen); + memcpy(keyBuf+sizeof(keyPrefix)-1+versionLen, keySuffix, sizeof(keySuffix)); // NULL comes with this one! + rc=RegOpenKey(keyBase, - "Software\\Python\\PythonCore\\" - MS_DLL_ID "\\PythonPath", + keyBuf, &newKey); if (rc==ERROR_SUCCESS) { RegQueryInfoKey(newKey, NULL, NULL, NULL, NULL, NULL, NULL, diff --git a/PC/import_nt.c b/PC/import_nt.c index 1eef4d2..7530d2e 100644 --- a/PC/import_nt.c +++ b/PC/import_nt.c @@ -10,6 +10,9 @@ #include "osdefs.h" #include <windows.h> #include "importdl.h" +#include "malloc.h" // for alloca + +extern const char *PyWin_DLLVersionString; // a string loaded from the DLL at startup. /* Return whether this is Win32s, i.e., Win32 API on Win 3.1(1). This function is exported! */ @@ -29,13 +32,32 @@ BOOL PyWin_IsWin32s() FILE *PyWin_FindRegisteredModule( const char *moduleName, struct filedescr **ppFileDesc, char *pathBuf, int pathLen) { - char moduleKey[128]; + char *moduleKey; + char *pos; + const char keyPrefix[] = "Software\\Python\\PythonCore\\"; + const char keySuffix[] = "\\Modules\\"; struct filedescr *fdp = NULL; FILE *fp; int modNameSize = pathLen; + int versionLen, moduleLen; HKEY keyBase = PyWin_IsWin32s() ? HKEY_CLASSES_ROOT : HKEY_LOCAL_MACHINE; - strcpy(moduleKey, "Software\\Python\\PythonCore\\" MS_DLL_ID "\\Modules\\"); - strcat(moduleKey, moduleName); + + // conceptually, this code is setting up: + // sprintf(buf, "Software\\Python\\PythonCore\\%s\\Modules\\%s", PyWin_DLLVersionString, moduleName); + // the sprintf would be clearer, but slower and less "length-safe" + versionLen = strlen(PyWin_DLLVersionString); + moduleLen = strlen(moduleName); + // alloca == no free required, but memory only local to fn, also no heap fragmentation! + moduleKey = alloca(sizeof(keyPrefix)-1 + versionLen + sizeof(keySuffix) + moduleLen); // chars only, plus 1 NULL. + pos = moduleKey; + memcpy(pos, keyPrefix, sizeof(keyPrefix)-1); + pos += sizeof(keyPrefix)-1; + memcpy(pos, PyWin_DLLVersionString, versionLen); + pos +=versionLen; + memcpy(pos, keySuffix, sizeof(keySuffix)); + pos += sizeof(keySuffix)-1; + memcpy(pos, moduleName, moduleLen+1); // NULL comes with this one! + if (RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize)!=ERROR_SUCCESS) return NULL; // use the file extension to locate the type entry. |