changeset 18360:f1ee47866e6b stable

use common code to get OCTAVE_HOME in main, octave-config and mkoctfile * src/shared-fcns.h: New file. * src/Makefile.in: Include it in the list of headers to distribute. * main.in.cc, mkoctfile.in.cc, octave-config.in.cc: Use functions from shared-fcns.h to find and substitute OCTAVE_HOME.
author John W. Eaton <jwe@octave.org>
date Fri, 24 Jan 2014 03:40:55 -0500
parents d9f706dd78df
children 87d96a7d50e0 7eb1bb820c84
files src/Makefile.am src/main.in.cc src/mkoctfile.in.cc src/octave-config.in.cc src/shared-fcns.h
diffstat 5 files changed, 198 insertions(+), 348 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile.am	Fri Jan 24 03:24:46 2014 -0500
+++ b/src/Makefile.am	Fri Jan 24 03:40:55 2014 -0500
@@ -51,6 +51,9 @@
   octave-cli \
   octave-config
 
+noinst_HEADERS = \
+  shared-fcns.h
+
 OCTAVE_VERSION_LINKS = octave-cli-$(version)$(EXEEXT)
 
 if AMCOND_BUILD_GUI
--- a/src/main.in.cc	Fri Jan 24 03:24:46 2014 -0500
+++ b/src/main.in.cc	Fri Jan 24 03:40:55 2014 -0500
@@ -58,65 +58,7 @@
 #define OCTAVE_PREFIX %OCTAVE_PREFIX%
 #endif
 
-#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
-
-#define WIN32_LEAN_AND_MEAN
-#include <tlhelp32.h>
-
-static std::string
-w32_get_octave_home (void)
-{
-  std::string retval;
-
-  std::string bin_dir;
-
-  HANDLE h = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE
-#ifdef TH32CS_SNAPMODULE32
-                                       | TH32CS_SNAPMODULE32
-#endif
-                                       , 0);
-
-  if (h != INVALID_HANDLE_VALUE)
-    {
-      MODULEENTRY32 mod_info;
-
-      ZeroMemory (&mod_info, sizeof (mod_info));
-      mod_info.dwSize = sizeof (mod_info);
-
-      if (Module32First (h, &mod_info))
-        {
-          do
-            {
-              std::string mod_name (mod_info.szModule);
-
-              if (mod_name.find ("octave") != std::string::npos)
-                {
-                  bin_dir = mod_info.szExePath;
-
-                  if (bin_dir[bin_dir.length () - 1] != '\\')
-                    bin_dir.append (1, '\\');
-
-                  break;
-                }
-            }
-          while (Module32Next (h, &mod_info));
-        }
-
-      CloseHandle (h);
-    }
-
-  if (! bin_dir.empty ())
-    {
-      size_t pos = bin_dir.rfind ("\\bin\\");
-
-      if (pos != std::string::npos)
-        retval = bin_dir.substr (0, pos);
-    }
-
-  return retval;
-}
-
-#endif
+#include "shared-fcns.h"
 
 #include <cstdlib>
 
@@ -374,62 +316,6 @@
 
 #endif
 
-// Find the directory where the octave binary is supposed to be
-// installed.
-
-#if (defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) \
-     && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM))
-static const char dir_sep_char = '\\';
-#else
-static const char dir_sep_char = '/';
-#endif
-
-static std::string
-octave_getenv (const std::string& name)
-{
-  char *value = ::getenv (name.c_str ());
-
-  return value ? value : "";
-}
-
-static std::string
-get_octave_home (void)
-{
-  std::string oh = octave_getenv ("OCTAVE_HOME");
-
-#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
-  if (oh.empty ())
-    oh = w32_get_octave_home ();
-#endif
-
-  return oh.empty () ? std::string (OCTAVE_PREFIX) : oh;
-}
-
-static std::string
-subst_octave_home (const std::string& s)
-{
-  std::string retval;
-
-  std::string octave_home = get_octave_home ();
-
-  std::string prefix = OCTAVE_PREFIX;
-
-  retval = s;
-
-  if (octave_home != prefix)
-    {
-      octave_idx_type len = prefix.length ();
-
-      if (s.substr (0, len) == prefix)
-        retval.replace (0, len, octave_home);
-    }
-
-  if (dir_sep_char != '/')
-    std::replace (retval.begin (), retval.end (), '/', dir_sep_char);
-
-  return retval;
-}
-
 static std::string
 get_octave_bindir (void)
 {
--- a/src/mkoctfile.in.cc	Fri Jan 24 03:24:46 2014 -0500
+++ b/src/mkoctfile.in.cc	Fri Jan 24 03:40:55 2014 -0500
@@ -1,3 +1,4 @@
+// %NO_EDIT_WARNING%
 /*
 
 Copyright (C) 2008-2013 Michael Goffioul
@@ -36,40 +37,19 @@
 
 #include <unistd.h>
 
-#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
-#include <windows.h>
-#ifdef _MSC_VER
-#define popen _popen
-#define pclose _pclose
-#endif
-#endif
-
 using namespace std;
 
-static bool initialized = false;
 static map<string,string> vars;
 
-static string OCTAVE_VERSION = %OCTAVE_CONF_VERSION%;
-
-static string
-substitute_prefix (const string& s, const string& prefix,
-                   const string& new_prefix)
-{
-  string retval = s;
-
-  if (!prefix.empty () && new_prefix != prefix)
-    {
-      int len = prefix.length ();
-      if (retval.find (prefix) == 0)
-        retval.replace (0, len, new_prefix);
-    }
-
-#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
-  replace (retval.begin (), retval.end (), '/', '\\');
+#ifndef OCTAVE_VERSION
+#define OCTAVE_VERSION %OCTAVE_CONF_VERSION%
 #endif
 
-  return retval;
-}
+#ifndef OCTAVE_PREFIX
+#define OCTAVE_PREFIX %OCTAVE_CONF_PREFIX%
+#endif
+
+#include "shared-fcns.h"
 
 static string
 get_line (FILE *fp)
@@ -116,70 +96,20 @@
 static void
 initialize (void)
 {
-  if (initialized)
-    return;
-
-  initialized = true;
-
-  vars["OCTAVE_HOME"] = get_variable ("OCTAVE_HOME", "");
-
-#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
-  int n = 1024;
-
-  string bin_dir (n, '\0');
-
-  while (true)
-    {
-      int status = GetModuleFileName (0, &bin_dir[0], n);
-
-      if (status < n)
-        {
-          bin_dir.resize (status);
-          break;
-        }
-      else
-        {
-          n *= 2;
-          bin_dir.resize (n);
-        }
-    }
-
-  if (! bin_dir.empty ())
-    {
-      size_t pos = bin_dir.rfind ("\\bin\\");
-
-      if (pos != string::npos)
-        vars["OCTAVE_HOME"] = bin_dir.substr (0, pos);
-    }
-#endif
+  vars["OCTAVE_HOME"] = get_octave_home ();
+  vars["OCTAVE_PREFIX"] = OCTAVE_PREFIX;
 
   vars["SED"] = get_variable ("SED", %OCTAVE_CONF_SED%);
 
-  vars["OCTAVE_PREFIX"] = %OCTAVE_CONF_PREFIX%;
-
   string DEFAULT_OCTINCLUDEDIR = %OCTAVE_CONF_OCTINCLUDEDIR%;
   string DEFAULT_INCLUDEDIR = %OCTAVE_CONF_INCLUDEDIR%;
   string DEFAULT_LIBDIR = %OCTAVE_CONF_LIBDIR%;
   string DEFAULT_OCTLIBDIR = %OCTAVE_CONF_OCTLIBDIR%;
 
-  if (! vars["OCTAVE_HOME"].empty ())
-    {
-      DEFAULT_OCTINCLUDEDIR
-        = substitute_prefix (DEFAULT_OCTINCLUDEDIR, vars["OCTAVE_PREFIX"],
-                             vars["OCTAVE_HOME"]);
-
-      DEFAULT_INCLUDEDIR
-        = substitute_prefix (DEFAULT_INCLUDEDIR, vars["OCTAVE_PREFIX"],
-                             vars["OCTAVE_HOME"]);
-
-      DEFAULT_LIBDIR
-        = substitute_prefix (DEFAULT_LIBDIR, vars["OCTAVE_PREFIX"],
-                             vars["OCTAVE_HOME"]);
-
-      DEFAULT_OCTLIBDIR
-        = substitute_prefix (DEFAULT_OCTLIBDIR, vars["OCTAVE_PREFIX"],
-                             vars["OCTAVE_HOME"]);
-    }
+  DEFAULT_OCTINCLUDEDIR = subst_octave_home (DEFAULT_OCTINCLUDEDIR);
+  DEFAULT_INCLUDEDIR = subst_octave_home (DEFAULT_INCLUDEDIR);
+  DEFAULT_LIBDIR = subst_octave_home (DEFAULT_LIBDIR);
+  DEFAULT_OCTLIBDIR = subst_octave_home (DEFAULT_OCTLIBDIR);
 
   vars["OCTINCLUDEDIR"] = get_variable ("OCTINCLUDEDIR", DEFAULT_OCTINCLUDEDIR);
   vars["INCLUDEDIR"] = get_variable ("INCLUDEDIR", DEFAULT_INCLUDEDIR);
@@ -279,7 +209,7 @@
 }
 
 static string usage_msg = "usage: mkoctfile [options] file ...";
-static string version_msg = "mkoctfile, version " + OCTAVE_VERSION;
+static string version_msg = "mkoctfile, version " OCTAVE_VERSION;
 static bool debug = false;
 static string help_msg =
 "\n"
@@ -422,8 +352,7 @@
 bool
 is_true (const std::string& s)
 {
-  return (s == "yes"
-          || s == "true");
+  return (s == "yes" || s == "true");
 }
 
 int
@@ -449,7 +378,6 @@
   bool link_stand_alone = false;
   string output_ext = ".oct";
   bool depend = false;
-  bool compile = true;
 
   if (argc == 1)
     {
@@ -545,7 +473,6 @@
       else if (arg == "-M" || arg == "-depend" || arg == "--depend")
         {
           depend = true;
-          compile = false;
         }
       else if (arg == "-o" || arg == "-output" || arg == "--output")
         {
--- a/src/octave-config.in.cc	Fri Jan 24 03:24:46 2014 -0500
+++ b/src/octave-config.in.cc	Fri Jan 24 03:40:55 2014 -0500
@@ -1,3 +1,4 @@
+// %NO_EDIT_WARNING%
 /*
 
 Copyright (C) 2008-2013 Michael Goffioul
@@ -30,14 +31,16 @@
 #include <algorithm>
 #include <cstdlib>
 
-#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
-#include <windows.h>
+#ifndef OCTAVE_PREFIX
+#define OCTAVE_PREFIX %OCTAVE_PREFIX%
 #endif
 
-static bool initialized = false;
+#include "shared-fcns.h"
+
 static std::map<std::string,std::string> vars;
-static std::string OCTAVE_HOME, PREFIX;
+
 static std::string usage_msg = "usage: octave-config [options]";
+
 static std::string help_msg =
 "\n"
 "Options:\n"
@@ -74,156 +77,46 @@
 "  -v, --version         Print the Octave version number.\n"
 "\n";
 
-static std::string
-substitute_prefix (const std::string& s, const std::string& prefix,
-                   const std::string new_prefix)
-{
-  std::string retval = s;
-
-  if (!prefix.empty () && new_prefix != prefix)
-    {
-      int len = prefix.length ();
-      if (retval.find (prefix) == 0)
-        retval.replace (0, len, new_prefix);
-    }
-
-#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
-  std::replace (retval.begin (), retval.end (), '/', '\\');
-#endif
-
-  return retval;
-}
-
 static void
 initialize (void)
 {
-  if (initialized)
-    return;
-
-  initialized = true;
-
-  const char *homestr = getenv ("OCTAVE_HOME");
-  OCTAVE_HOME = (homestr ? homestr : "");
-  PREFIX = %OCTAVE_PREFIX%;
-
-#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
-  int n = 1024;
-
-  std::string bin_dir (n, '\0');
-
-  while (true)
-    {
-      int status = GetModuleFileName (0, &bin_dir[0], n);
-
-      if (status < n)
-        {
-          bin_dir.resize (status);
-          break;
-        }
-      else
-        {
-          n *= 2;
-          bin_dir.resize (n);
-        }
-    }
-
-  if (! bin_dir.empty ())
-    {
-      size_t pos = bin_dir.rfind ("\\bin\\");
-
-      if (pos != std::string::npos)
-        OCTAVE_HOME = bin_dir.substr (0, pos);
-    }
-#endif
+  vars["OCTAVE_HOME"] = get_octave_home ();
+  vars["PREFIX"] = OCTAVE_PREFIX;
 
   vars["API_VERSION"] = %OCTAVE_API_VERSION%;
   vars["CANONICAL_HOST_TYPE"] = %OCTAVE_CANONICAL_HOST_TYPE%;
   vars["DEFAULT_PAGER"] = %OCTAVE_DEFAULT_PAGER%;
-  vars["ARCHLIBDIR"] = %OCTAVE_ARCHLIBDIR%;
-  vars["BINDIR"] = %OCTAVE_BINDIR%;
-  vars["DATADIR"] = %OCTAVE_DATADIR%;
-  vars["DATAROOTDIR"] = %OCTAVE_DATAROOTDIR%;
-  vars["EXEC_PREFIX"] = %OCTAVE_EXEC_PREFIX%;
-  vars["FCNFILEDIR"] = %OCTAVE_FCNFILEDIR%;
-  vars["IMAGEDIR"] = %OCTAVE_IMAGEDIR%;
-  vars["INCLUDEDIR"] = %OCTAVE_INCLUDEDIR%;
-  vars["INFODIR"] = %OCTAVE_INFODIR%;
-  vars["INFOFILE"] = %OCTAVE_INFOFILE%;
-  vars["LIBDIR"] = %OCTAVE_LIBDIR%;
-  vars["LIBEXECDIR"] = %OCTAVE_LIBEXECDIR%;
-  vars["LOCALAPIARCHLIBDIR"] = %OCTAVE_LOCALAPIARCHLIBDIR%;
-  vars["LOCALAPIFCNFILEDIR"] = %OCTAVE_LOCALAPIFCNFILEDIR%;
-  vars["LOCALAPIOCTFILEDIR"] = %OCTAVE_LOCALAPIOCTFILEDIR%;
-  vars["LOCALARCHLIBDIR"] = %OCTAVE_LOCALARCHLIBDIR%;
-  vars["LOCALFCNFILEDIR"] = %OCTAVE_LOCALFCNFILEDIR%;
-  vars["LOCALOCTFILEDIR"] = %OCTAVE_LOCALOCTFILEDIR%;
-  vars["LOCALSTARTUPFILEDIR"] = %OCTAVE_LOCALSTARTUPFILEDIR%;
-  vars["LOCALVERARCHLIBDIR"] = %OCTAVE_LOCALVERARCHLIBDIR%;
-  vars["LOCALVERFCNFILEDIR"] = %OCTAVE_LOCALVERFCNFILEDIR%;
-  vars["LOCALVEROCTFILEDIR"] = %OCTAVE_LOCALVEROCTFILEDIR%;
-  vars["MAN1DIR"] = %OCTAVE_MAN1DIR%;
   vars["MAN1EXT"] = %OCTAVE_MAN1EXT%;
-  vars["MANDIR"] = %OCTAVE_MANDIR%;
-  vars["OCTFILEDIR"] = %OCTAVE_OCTFILEDIR%;
-  vars["OCTINCLUDEDIR"] = %OCTAVE_OCTINCLUDEDIR%;
-  vars["OCTLIBDIR"] = %OCTAVE_OCTLIBDIR%;
-  vars["PREFIX"] = %OCTAVE_PREFIX%;
-  vars["STARTUPFILEDIR"] = %OCTAVE_STARTUPFILEDIR%;
   vars["VERSION"] = %OCTAVE_VERSION%;
 
-  if (! OCTAVE_HOME.empty ())
-    {
-      vars["ARCHLIBDIR"] = substitute_prefix (vars["ARCHLIBDIR"],
-                                              PREFIX, OCTAVE_HOME);
-      vars["BINDIR"] = substitute_prefix (vars["BINDIR"], PREFIX, OCTAVE_HOME);
-      vars["DATADIR"] = substitute_prefix (vars["DATADIR"], PREFIX, OCTAVE_HOME);
-      vars["DATAROOTDIR"] = substitute_prefix (vars["DATAROOTDIR"],
-                                               PREFIX, OCTAVE_HOME);
-      vars["EXEC_PREFIX"] = substitute_prefix (vars["EXEC_PREFIX"],
-                                               PREFIX, OCTAVE_HOME);
-      vars["FCNFILEDIR"] = substitute_prefix (vars["FCNFILEDIR"],
-                                              PREFIX, OCTAVE_HOME);
-      vars["IMAGEDIR"] = substitute_prefix (vars["IMAGEDIR"], PREFIX, OCTAVE_HOME);
-      vars["INCLUDEDIR"] = substitute_prefix (vars["INCLUDEDIR"],
-                                              PREFIX, OCTAVE_HOME);
-      vars["INFODIR"] = substitute_prefix (vars["INFODIR"], PREFIX, OCTAVE_HOME);
-      vars["INFOFILE"] = substitute_prefix (vars["INFOFILE"], PREFIX, OCTAVE_HOME);
-      vars["LIBDIR"] = substitute_prefix (vars["LIBDIR"], PREFIX, OCTAVE_HOME);
-      vars["LIBEXECDIR"] = substitute_prefix (vars["LIBEXECDIR"],
-                                              PREFIX, OCTAVE_HOME);
-      vars["LOCALAPIARCHLIBDIR"] = substitute_prefix (vars["LOCALAPIARCHLIBDIR"],
-                                                      PREFIX, OCTAVE_HOME);
-      vars["LOCALAPIFCNFILEDIR"] = substitute_prefix (vars["LOCALAPIFCNFILEDIR"],
-                                                      PREFIX, OCTAVE_HOME);
-      vars["LOCALAPIOCTFILEDIR"] = substitute_prefix (vars["LOCALAPIOCTFILEDIR"],
-                                                      PREFIX, OCTAVE_HOME);
-      vars["LOCALARCHLIBDIR"] = substitute_prefix (vars["LOCALARCHLIBDIR"],
-                                                   PREFIX, OCTAVE_HOME);
-      vars["LOCALFCNFILEDIR"] = substitute_prefix (vars["LOCALFCNFILEDIR"],
-                                                   PREFIX, OCTAVE_HOME);
-      vars["LOCALOCTFILEDIR"] = substitute_prefix (vars["LOCALOCTFILEDIR"],
-                                                   PREFIX, OCTAVE_HOME);
-      vars["LOCALSTARTUPFILEDIR"] = substitute_prefix (vars["LOCALSTARTUPFILEDIR"],
-                                                       PREFIX, OCTAVE_HOME);
-      vars["LOCALVERARCHLIBDIR"] = substitute_prefix (vars["LOCALVERARCHLIBDIR"],
-                                                      PREFIX, OCTAVE_HOME);
-      vars["LOCALVERFCNFILEDIR"] = substitute_prefix (vars["LOCALVERFCNFILEDIR"],
-                                                      PREFIX, OCTAVE_HOME);
-      vars["LOCALVEROCTFILEDIR"] = substitute_prefix (vars["LOCALVEROCTFILEDIR"],
-                                                      PREFIX, OCTAVE_HOME);
-      vars["MAN1DIR"] = substitute_prefix (vars["MAN1DIR"], PREFIX, OCTAVE_HOME);
-      vars["MANDIR"] = substitute_prefix (vars["MANDIR"], PREFIX, OCTAVE_HOME);
-      vars["OCTFILEDIR"] = substitute_prefix (vars["OCTFILEDIR"],
-                                              PREFIX, OCTAVE_HOME);
-      vars["OCTINCLUDEDIR"] = substitute_prefix (vars["OCTINCLUDEDIR"],
-                                                 PREFIX, OCTAVE_HOME);
-      vars["OCTLIBDIR"] = substitute_prefix (vars["OCTLIBDIR"],
-                                             PREFIX, OCTAVE_HOME);
-      vars["STARTUPFILEDIR"] = substitute_prefix (vars["STARTUPFILEDIR"],
-                                                  PREFIX, OCTAVE_HOME);
-
-      vars["PREFIX"] = OCTAVE_HOME;
-    }
+  vars["ARCHLIBDIR"] = subst_octave_home (%OCTAVE_ARCHLIBDIR%);
+  vars["BINDIR"] = subst_octave_home (%OCTAVE_BINDIR%);
+  vars["DATADIR"] = subst_octave_home (%OCTAVE_DATADIR%);
+  vars["DATAROOTDIR"] = subst_octave_home (%OCTAVE_DATAROOTDIR%);
+  vars["EXEC_PREFIX"] = subst_octave_home (%OCTAVE_EXEC_PREFIX%);
+  vars["FCNFILEDIR"] = subst_octave_home (%OCTAVE_FCNFILEDIR%);
+  vars["IMAGEDIR"] = subst_octave_home (%OCTAVE_IMAGEDIR%);
+  vars["INCLUDEDIR"] = subst_octave_home (%OCTAVE_INCLUDEDIR%);
+  vars["INFODIR"] = subst_octave_home (%OCTAVE_INFODIR%);
+  vars["INFOFILE"] = subst_octave_home (%OCTAVE_INFOFILE%);
+  vars["LIBDIR"] = subst_octave_home (%OCTAVE_LIBDIR%);
+  vars["LIBEXECDIR"] = subst_octave_home (%OCTAVE_LIBEXECDIR%);
+  vars["LOCALAPIARCHLIBDIR"] = subst_octave_home (%OCTAVE_LOCALAPIARCHLIBDIR%);
+  vars["LOCALAPIFCNFILEDIR"] = subst_octave_home (%OCTAVE_LOCALAPIFCNFILEDIR%);
+  vars["LOCALAPIOCTFILEDIR"] = subst_octave_home (%OCTAVE_LOCALAPIOCTFILEDIR%);
+  vars["LOCALARCHLIBDIR"] = subst_octave_home (%OCTAVE_LOCALARCHLIBDIR%);
+  vars["LOCALFCNFILEDIR"] = subst_octave_home (%OCTAVE_LOCALFCNFILEDIR%);
+  vars["LOCALOCTFILEDIR"] = subst_octave_home (%OCTAVE_LOCALOCTFILEDIR%);
+  vars["LOCALSTARTUPFILEDIR"] = subst_octave_home (%OCTAVE_LOCALSTARTUPFILEDIR%);
+  vars["LOCALVERARCHLIBDIR"] = subst_octave_home (%OCTAVE_LOCALVERARCHLIBDIR%);
+  vars["LOCALVERFCNFILEDIR"] = subst_octave_home (%OCTAVE_LOCALVERFCNFILEDIR%);
+  vars["LOCALVEROCTFILEDIR"] = subst_octave_home (%OCTAVE_LOCALVEROCTFILEDIR%);
+  vars["MAN1DIR"] = subst_octave_home (%OCTAVE_MAN1DIR%);
+  vars["MANDIR"] = subst_octave_home (%OCTAVE_MANDIR%);
+  vars["OCTFILEDIR"] = subst_octave_home (%OCTAVE_OCTFILEDIR%);
+  vars["OCTINCLUDEDIR"] = subst_octave_home (%OCTAVE_OCTINCLUDEDIR%);
+  vars["OCTLIBDIR"] = subst_octave_home (%OCTAVE_OCTLIBDIR%);
+  vars["STARTUPFILEDIR"] = subst_octave_home (%OCTAVE_STARTUPFILEDIR%);
 }
 
 int
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/shared-fcns.h	Fri Jan 24 03:40:55 2014 -0500
@@ -0,0 +1,141 @@
+/*
+
+Copyright (C) 2008-2013 Michael Goffioul
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
+
+#include <windows.h>
+
+#ifdef _MSC_VER
+#define popen _popen
+#define pclose _pclose
+#endif
+
+static std::string
+w32_get_octave_home (void)
+{
+  std::string retval;
+
+  std::string bin_dir;
+
+  HANDLE h = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE
+#ifdef TH32CS_SNAPMODULE32
+                                       | TH32CS_SNAPMODULE32
+#endif
+                                       , 0);
+
+  if (h != INVALID_HANDLE_VALUE)
+    {
+      MODULEENTRY32 mod_info;
+
+      ZeroMemory (&mod_info, sizeof (mod_info));
+      mod_info.dwSize = sizeof (mod_info);
+
+      if (Module32First (h, &mod_info))
+        {
+          do
+            {
+              std::string mod_name (mod_info.szModule);
+
+              if (mod_name.find ("octave") != std::string::npos)
+                {
+                  bin_dir = mod_info.szExePath;
+
+                  if (bin_dir[bin_dir.length () - 1] != '\\')
+                    bin_dir.append (1, '\\');
+
+                  break;
+                }
+            }
+          while (Module32Next (h, &mod_info));
+        }
+
+      CloseHandle (h);
+    }
+
+  if (! bin_dir.empty ())
+    {
+      size_t pos = bin_dir.rfind ("\\bin\\");
+
+      if (pos != std::string::npos)
+        retval = bin_dir.substr (0, pos);
+    }
+
+  return retval;
+}
+
+#endif
+
+// Find the directory where the octave binary is supposed to be
+// installed.
+
+#if (defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) \
+     && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM))
+static const char dir_sep_char = '\\';
+#else
+static const char dir_sep_char = '/';
+#endif
+
+static std::string
+octave_getenv (const std::string& name)
+{
+  char *value = ::getenv (name.c_str ());
+
+  return value ? value : "";
+}
+
+static std::string
+get_octave_home (void)
+{
+  std::string oh = octave_getenv ("OCTAVE_HOME");
+
+#if defined (__WIN32__) && ! defined (_POSIX_VERSION)
+  if (oh.empty ())
+    oh = w32_get_octave_home ();
+#endif
+
+  return oh.empty () ? std::string (OCTAVE_PREFIX) : oh;
+}
+
+static std::string
+subst_octave_home (const std::string& s)
+{
+  std::string retval;
+
+  std::string octave_home = get_octave_home ();
+
+  std::string prefix = OCTAVE_PREFIX;
+
+  retval = s;
+
+  if (octave_home != prefix)
+    {
+      octave_idx_type len = prefix.length ();
+
+      if (s.substr (0, len) == prefix)
+        retval.replace (0, len, octave_home);
+    }
+
+  if (dir_sep_char != '/')
+    std::replace (retval.begin (), retval.end (), '/', dir_sep_char);
+
+  return retval;
+}