]> granicus.if.org Git - python/commitdiff
Sigh. More restructuring was needed.
authorGuido van Rossum <guido@python.org>
Sat, 8 Aug 1998 23:40:40 +0000 (23:40 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 8 Aug 1998 23:40:40 +0000 (23:40 +0000)
Make an explicit test for whether the prefix is in fact the
source directory, and then don't use the registry.

PC/getpathp.c

index deb2894e2b78d2e676b55833be69468aa0362b83..2aaa4f3d361cbd2eab5337c4a4740c05673600bc 100644 (file)
@@ -98,6 +98,23 @@ exists(filename)
 }
 
 
+static int
+ismodule(filename)     /* Is module -- check for .pyc/.pyo too */
+       char *filename;
+{
+       if (exists(filename))
+               return 1;
+
+       /* Check for the compiled version of prefix. */
+       if (strlen(filename) < MAXPATHLEN) {
+               strcat(filename, Py_OptimizeFlag ? "o" : "c");
+               if (exists(filename))
+                       return 1;
+       }
+       return 0;
+}
+
+
 static void
 join(buffer, stuff)
        char *buffer;
@@ -131,7 +148,7 @@ search_for_prefix(argv0_path, landmark)
        do {
                n = strlen(prefix);
                join(prefix, landmark);
-               if (exists(prefix)) {
+               if (ismodule(prefix)) {
                        prefix[n] = '\0';
                        return 1;
                }
@@ -142,6 +159,22 @@ search_for_prefix(argv0_path, landmark)
 }
 
 #ifdef MS_WIN32
+
+#ifndef BUILD_LANDMARK
+#define BUILD_LANDMARK "PC\\getpathp.c"
+#endif
+
+static int
+prefixisbuilddir()
+{
+       int n = strlen(prefix);
+       int ok;
+       join(prefix, BUILD_LANDMARK);
+       ok = exists(prefix);
+       prefix[n] = '\0';
+       return ok;
+}
+
 #include "malloc.h" // for alloca - see comments below!
 extern const char *PyWin_DLLVersionString; // a string loaded from the DLL at startup.
 
@@ -309,18 +342,10 @@ calculate_path()
        int bufsz;
        char *pythonhome = Py_GetPythonHome();
        char *envpath = getenv("PYTHONPATH");
+
 #ifdef MS_WIN32
-       char *machinepath, *userpath;
-
-       /* Are we running under Windows 3.1(1) Win32s? */
-       if (PyWin_IsWin32s()) {
-               /* 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);
-       }
+       char *machinepath = NULL;
+       char *userpath = NULL;
 #endif
 
        get_progpath();
@@ -329,19 +354,8 @@ calculate_path()
        if (pythonhome == NULL || *pythonhome == '\0') {
                if (search_for_prefix(argv0_path, LANDMARK))
                        pythonhome = prefix;
-               else {
-                       /* Couldnt find a source version - lets see if a compiled version exists. */
-                       char LANDMARK_Look[MAX_PATH+1];
-                       strcpy(LANDMARK_Look, LANDMARK);
-                       /* Turn it into ".pyc" or ".pyc" depending on the current mode. */
-                       strcat(LANDMARK_Look, Py_OptimizeFlag ? "o": "c");
-                       /* And search again */
-                       if (search_for_prefix(argv0_path, LANDMARK_Look))
-                               pythonhome = prefix;
-                       else
-                               /* Give up in disgust - just use the default! */
-                               pythonhome = NULL;
-               }
+               else
+                       pythonhome = NULL;
        }
        else
                strcpy(prefix, pythonhome);
@@ -349,14 +363,30 @@ calculate_path()
        if (envpath && *envpath == '\0')
                envpath = NULL;
 
-       /* We need to construct a path from the following parts:
+#ifdef MS_WIN32
+       if (!prefixisbuilddir()) {
+               /* Are we running under Windows 3.1(1) Win32s? */
+               if (PyWin_IsWin32s()) {
+                       /* 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);
+               }
+       }
+#endif
+
+       /* We need to construct a path from the following parts.
           (1) the PYTHONPATH environment variable, if set;
           (2) for Win32, the machinepath and userpath, if set;
-          The following only if neither machinepath nor userpath is set:
           (3) the PYTHONPATH config macro, with the leading "."
               of each component replaced with pythonhome, if set;
           (4) the directory containing the executable (argv0_path).
           The length calculation calculates #3 first.
+          Extra rules:
+          - If PYTHONHOME is set (in any way) item (2) is ignored.
+          - If registry values are used, (3) and (4) are ignored.
        */
 
        /* Calculate size of return buffer */