From 6dbd190f5ec3127ad7c5ef6fc67d2f02c4cc1492 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 21 Aug 1996 15:03:37 +0000 Subject: NT specific files supplied by Mark Hammond --- PC/dl_nt.c | 34 +++++++++++ PC/getpath_nt.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PC/import_nt.c | 44 ++++++++++++++ PC/main_nt.c | 37 ++++++++++++ 4 files changed, 293 insertions(+) create mode 100644 PC/dl_nt.c create mode 100644 PC/getpath_nt.c create mode 100644 PC/import_nt.c create mode 100644 PC/main_nt.c 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 + +#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 +#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); +} -- cgit v0.12