symbian-qemu-0.9.1-12/python-2.6.1/PC/import_nt.c
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-2.6.1/PC/import_nt.c	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,86 @@
+/********************************************************************
+
+ import_nt.c 
+
+  Win32 specific import code.
+
+*/
+
+#include "Python.h"
+#include "osdefs.h"
+#include <windows.h>
+#include "importdl.h"
+#include "malloc.h" /* for alloca */
+
+/* a string loaded from the DLL at startup */
+extern const char *PyWin_DLLVersionString;
+
+FILE *PyWin_FindRegisteredModule(const char *moduleName,
+				 struct filedescr **ppFileDesc,
+				 char *pathBuf,
+				 Py_ssize_t pathLen)
+{
+	char *moduleKey;
+	const char keyPrefix[] = "Software\\Python\\PythonCore\\";
+	const char keySuffix[] = "\\Modules\\";
+#ifdef _DEBUG
+	/* In debugging builds, we _must_ have the debug version
+	 * registered.
+	 */
+	const char debugString[] = "\\Debug";
+#else
+	const char debugString[] = "";
+#endif
+	struct filedescr *fdp = NULL;
+	FILE *fp;
+	HKEY keyBase = HKEY_CURRENT_USER;
+	int modNameSize;
+	long regStat;
+
+	/* Calculate the size for the sprintf buffer.
+	 * Get the size of the chars only, plus 1 NULL.
+	 */
+	size_t bufSize = sizeof(keyPrefix)-1 +
+	                 strlen(PyWin_DLLVersionString) +
+	                 sizeof(keySuffix) +
+	                 strlen(moduleName) +
+	                 sizeof(debugString) - 1;
+	/* alloca == no free required, but memory only local to fn,
+	 * also no heap fragmentation!
+	 */
+	moduleKey = alloca(bufSize); 
+	PyOS_snprintf(moduleKey, bufSize,
+		      "Software\\Python\\PythonCore\\%s\\Modules\\%s%s",
+		      PyWin_DLLVersionString, moduleName, debugString);
+
+	assert(pathLen < INT_MAX);
+	modNameSize = (int)pathLen;
+	regStat = RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize);
+	if (regStat != ERROR_SUCCESS) {
+		/* No user setting - lookup in machine settings */
+		keyBase = HKEY_LOCAL_MACHINE;
+		/* be anal - failure may have reset size param */
+		modNameSize = (int)pathLen;
+		regStat = RegQueryValue(keyBase, moduleKey, 
+		                        pathBuf, &modNameSize);
+
+		if (regStat != ERROR_SUCCESS)
+			return NULL;
+	}
+	/* use the file extension to locate the type entry. */
+	for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) {
+		size_t extLen = strlen(fdp->suffix);
+		assert(modNameSize >= 0); /* else cast to size_t is wrong */
+		if ((size_t)modNameSize > extLen &&
+		    strnicmp(pathBuf + ((size_t)modNameSize-extLen-1),
+		             fdp->suffix,
+		             extLen) == 0)
+			break;
+	}
+	if (fdp->suffix == NULL)
+		return NULL;
+	fp = fopen(pathBuf, fdp->mode);
+	if (fp != NULL)
+		*ppFileDesc = fdp;
+	return fp;
+}