summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--PC/dl_nt.c34
-rw-r--r--PC/getpath_nt.c178
-rw-r--r--PC/import_nt.c44
-rw-r--r--PC/main_nt.c37
4 files changed, 293 insertions, 0 deletions
diff --git a/PC/dl_nt.c b/PC/dl_nt.c
new file mode 100644
index 0000000..16b9319
--- /dev/null
+++ b/PC/dl_nt.c
@@ -0,0 +1,34 @@
+/*
+
+Entry point for the Windows NT DLL.
+
+About the only reason for having this, is so initall() can automatically
+be called, removing that burden (and possible source of frustration if
+forgotten) from the programmer.
+
+*/
+#include "windows.h"
+
+/* NT and Python share these */
+#undef INCREF
+#undef DECREF
+#include "config.h"
+#include "allobjects.h"
+
+HMODULE PyWin_DLLhModule = NULL;
+
+BOOL WINAPI DllMain (HANDLE hInst,
+ ULONG ul_reason_for_call,
+ LPVOID lpReserved)
+{
+ switch (ul_reason_for_call)
+ {
+ case DLL_PROCESS_ATTACH:
+ PyWin_DLLhModule = hInst;
+ initall();
+ break;
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
diff --git a/PC/getpath_nt.c b/PC/getpath_nt.c
new file mode 100644
index 0000000..045fc7c
--- /dev/null
+++ b/PC/getpath_nt.c
@@ -0,0 +1,178 @@
+#include "Python.h"
+#include "osdefs.h"
+#include <windows.h>
+
+#ifndef WIN32_PATCH_LEVEL
+#define WIN32_PATCH_LEVEL "000"
+#endif
+
+/* PREFIX and EXEC_PREFIX are meaningless on Windows */
+
+#ifndef PREFIX
+#define PREFIX ""
+#endif
+
+#ifndef EXEC_PREFIX
+#define EXEC_PREFIX ""
+#endif
+
+/*
+This is a special Win32 version of getpath.
+
+* There is no default path. There is nothing even remotely resembling
+ a standard location. Maybe later "Program Files/Python", but not yet.
+
+* The Registry is used as the primary store for the Python path.
+
+* The environment variable PYTHONPATH _overrides_ the registry. This should
+ allow a "standard" Python environment, but allow you to manually setup
+ another (eg, a beta version).
+
+*/
+
+BOOL PyWin_IsWin32s()
+{
+ static BOOL bIsWin32s = -1; // flag as "not yet looked"
+
+ if (bIsWin32s==-1) {
+ OSVERSIONINFO ver;
+ ver.dwOSVersionInfoSize = sizeof(ver);
+ GetVersionEx(&ver);
+ bIsWin32s = ver.dwPlatformId == VER_PLATFORM_WIN32s;
+ }
+ return bIsWin32s;
+}
+
+/* Load a PYTHONPATH value from the registry
+ Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
+
+ Returns NULL, or a pointer that should be free'd.
+*/
+static char *
+getpythonregpath(HKEY keyBase, BOOL bWin32s)
+{
+ HKEY newKey = 0;
+ DWORD nameSize = 0;
+ DWORD dataSize = 0;
+ DWORD numEntries = 0;
+ LONG rc;
+ char *retval = NULL;
+ char *dataBuf;
+ if ((rc=RegOpenKey(keyBase, "Software\\Python\\PythonCore\\" WIN32_PATCH_LEVEL "\\PythonPath",
+ &newKey))==ERROR_SUCCESS) {
+ RegQueryInfoKey(newKey, NULL, NULL, NULL, NULL, NULL, NULL,
+ &numEntries, &nameSize, &dataSize, NULL, NULL );
+ }
+ if (numEntries==0) {
+ if (newKey)
+ CloseHandle(newKey);
+ if ((rc=RegOpenKey(keyBase, "Software\\Python\\PythonPath",
+ &newKey))==ERROR_SUCCESS) {
+ RegQueryInfoKey(newKey, NULL, NULL, NULL, NULL, NULL, NULL,
+ &numEntries, &nameSize, &dataSize, NULL, NULL );
+ }
+ }
+ if (bWin32s && numEntries==0 && dataSize==0) { /* must hardcode for Win32s */
+ numEntries = 1;
+ dataSize = 511;
+ }
+ if (numEntries) {
+ dataBuf = malloc(dataSize);
+ // on NT, datasize is unicode - ie, 2xstrlen,
+ // even when ascii string returned.
+ // presumably will be 1xstrlen on 95/win3.1
+ // Additionally, win32s doesnt work as expected, so
+ // the specific strlen() is required for 3.1.
+ rc = RegQueryValue(newKey, "", dataBuf, &dataSize);
+ if (rc==ERROR_SUCCESS) {
+ if (strlen(dataBuf)==0)
+ free(dataBuf);
+ else
+ retval = dataBuf; // caller will free
+ }
+ else
+ free(dataBuf);
+ }
+
+ if (newKey)
+ CloseHandle(newKey);
+ return retval;
+}
+/* Return the initial python search path. This is called once from
+ initsys() to initialize sys.path. The environment variable
+ PYTHONPATH is fetched and the default path appended. The default
+ path may be passed to the preprocessor; if not, a system-dependent
+ default is used. */
+
+char *
+Py_GetPath()
+{
+ char *path = getenv("PYTHONPATH");
+ char *defpath = PYTHONPATH;
+ static char *buf = NULL;
+ char *p;
+ int n;
+
+ if (buf != NULL) {
+ free(buf);
+ buf = NULL;
+ }
+
+ if (path == NULL) {
+ char *machinePath, *userPath;
+ int machineLen, userLen;
+ /* lookup the registry */
+ BOOL bWin32s = PyWin_IsWin32s();
+
+ if (bWin32s) { /* are we running under Windows 3.1 Win32s */
+ /* only CLASSES_ROOT is supported */
+ machinePath = getpythonregpath(HKEY_CLASSES_ROOT, TRUE);
+ userPath = NULL;
+ } else {
+ machinePath = getpythonregpath(HKEY_LOCAL_MACHINE, FALSE);
+ userPath = getpythonregpath(HKEY_CURRENT_USER, FALSE);
+ }
+ if (machinePath==NULL && userPath==NULL) return defpath;
+ machineLen = machinePath ? strlen(machinePath) : 0;
+ userLen = userPath ? strlen(userPath) : 0;
+ n = machineLen + userLen + 1;
+ // this is a memory leak, as Python never frees it. Only ever called once, so big deal!
+ buf = malloc(n);
+ if (buf == NULL)
+ Py_FatalError("not enough memory to copy module search path");
+ p = buf;
+ *p = '\0';
+ if (machineLen) {
+ strcpy(p, machinePath);
+ p += machineLen;
+ }
+ if (userLen) {
+ if (machineLen)
+ *p++ = DELIM;
+ strcpy(p, userPath);
+ }
+ if (userPath) free(userPath);
+ if (machinePath) free(machinePath);
+ } else {
+
+ buf = malloc(strlen(path)+1);
+ if (buf == NULL)
+ Py_FatalError("not enough memory to copy module search path");
+ strcpy(buf, path);
+ }
+ return buf;
+}
+
+/* Similar for Makefile variables $prefix and $exec_prefix */
+
+char *
+Py_GetPrefix()
+{
+ return PREFIX;
+}
+
+char *
+Py_GetExecPrefix()
+{
+ return EXEC_PREFIX;
+}
diff --git a/PC/import_nt.c b/PC/import_nt.c
new file mode 100644
index 0000000..cac4734
--- /dev/null
+++ b/PC/import_nt.c
@@ -0,0 +1,44 @@
+/********************************************************************
+
+ importnt.c
+
+ Win32 specific import code.
+
+*/
+
+#include "allobjects.h"
+#include "osdefs.h"
+#include <windows.h>
+#include "import.h"
+#include "importdl.h"
+
+#ifndef WIN32_PATCH_LEVEL
+#define WIN32_PATCH_LEVEL "000"
+#endif
+
+extern BOOL PyWin_IsWin32s();
+
+FILE *PyWin_FindRegisteredModule( const char *moduleName, struct filedescr **ppFileDesc, char *pathBuf, int pathLen)
+{
+ char moduleKey[128];
+ struct filedescr *fdp = NULL;
+ FILE *fp;
+ int modNameSize = pathLen;
+ HKEY keyBase = PyWin_IsWin32s() ? HKEY_CLASSES_ROOT : HKEY_LOCAL_MACHINE;
+ strcpy(moduleKey, "Software\\Python\\PythonCore\\" WIN32_PATCH_LEVEL "\\Modules\\");
+ strcat(moduleKey, moduleName);
+ if (RegQueryValue(keyBase, moduleKey, pathBuf, &modNameSize)!=ERROR_SUCCESS)
+ return NULL;
+ // use the file extension to locate the type entry.
+ for (fdp = import_filetab; fdp->suffix != NULL; fdp++) {
+ int extLen=strlen(fdp->suffix);
+ if (modNameSize>extLen && strnicmp(pathBuf+(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;
+}
diff --git a/PC/main_nt.c b/PC/main_nt.c
new file mode 100644
index 0000000..5b3db05
--- /dev/null
+++ b/PC/main_nt.c
@@ -0,0 +1,37 @@
+/* -*- C -*- ***********************************************
+Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
+The Netherlands.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/* Python interpreter main program */
+
+#define HAVE_CONFIG_H
+#include "Python.h"
+#undef main
+
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ return Py_Main(argc, argv);
+}