# HG changeset patch # User John W. Eaton # Date 1390552855 18000 # Node ID f1ee47866e6bb0dd8774eba1f4610162df55aedd # Parent d9f706dd78df87bd18ad1fed20b268f896cfa2db 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. diff -r d9f706dd78df -r f1ee47866e6b src/Makefile.am --- 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 diff -r d9f706dd78df -r f1ee47866e6b src/main.in.cc --- 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 - -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 @@ -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) { diff -r d9f706dd78df -r f1ee47866e6b src/mkoctfile.in.cc --- 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 -#if defined (__WIN32__) && ! defined (_POSIX_VERSION) -#include -#ifdef _MSC_VER -#define popen _popen -#define pclose _pclose -#endif -#endif - using namespace std; -static bool initialized = false; static map 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") { diff -r d9f706dd78df -r f1ee47866e6b src/octave-config.in.cc --- 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 #include -#if defined (__WIN32__) && ! defined (_POSIX_VERSION) -#include +#ifndef OCTAVE_PREFIX +#define OCTAVE_PREFIX %OCTAVE_PREFIX% #endif -static bool initialized = false; +#include "shared-fcns.h" + static std::map 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 diff -r d9f706dd78df -r f1ee47866e6b src/shared-fcns.h --- /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 +. + +*/ + +#if defined (__WIN32__) && ! defined (_POSIX_VERSION) + +#include + +#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; +}