Mercurial > octave
diff libinterp/corefcn/defaults.in.cc @ 23713:4feef926733a
rename files missed in previous commit
* defaults.h: Rename from defaults.in.h.
* defaults.in.cc: Rename from defaults.cc.
Also brings in changes omitted from previous commit.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 28 Jun 2017 22:49:03 -0400 |
parents | libinterp/corefcn/defaults.cc@b95c430c0649 |
children | 06579337237b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libinterp/corefcn/defaults.in.cc Wed Jun 28 22:49:03 2017 -0400 @@ -0,0 +1,883 @@ +/* + +Copyright (C) 1996-2017 John W. Eaton + +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 (HAVE_CONFIG_H) +# include "config.h" +#endif + +#include <cstdlib> + +#include <algorithm> +#include <iostream> +#include <string> + +#include "dir-ops.h" +#include "oct-env.h" +#include "file-stat.h" +#include "pathsearch.h" +#include "str-vec.h" + +#include "defaults.h" +#include "defun.h" +#include "error.h" +#include "file-ops.h" +#include "errwarn.h" +#include "help.h" +#include "input.h" +#include "load-path.h" +#include "ovl.h" +#include "ov.h" +#include "parse.h" +#include "interpreter.h" +#include "unwind-prot.h" +#include "variables.h" +#include "version.h" + +#if ! defined (OCTAVE_CANONICAL_HOST_TYPE) +# define OCTAVE_CANONICAL_HOST_TYPE %OCTAVE_CANONICAL_HOST_TYPE% +#endif + +#if ! defined (OCTAVE_DEFAULT_PAGER) +# define OCTAVE_DEFAULT_PAGER %OCTAVE_DEFAULT_PAGER% +#endif + +#if ! defined (OCTAVE_ARCHLIBDIR) +# define OCTAVE_ARCHLIBDIR %OCTAVE_ARCHLIBDIR% +#endif + +#if ! defined (OCTAVE_BINDIR) +# define OCTAVE_BINDIR %OCTAVE_BINDIR% +#endif + +#if ! defined (OCTAVE_DATADIR) +# define OCTAVE_DATADIR %OCTAVE_DATADIR% +#endif + +#if ! defined (OCTAVE_DATAROOTDIR) +# define OCTAVE_DATAROOTDIR %OCTAVE_DATAROOTDIR% +#endif + +#if ! defined (OCTAVE_DOC_CACHE_FILE) +# define OCTAVE_DOC_CACHE_FILE %OCTAVE_DOC_CACHE_FILE% +#endif + +#if ! defined (OCTAVE_TEXI_MACROS_FILE) +# define OCTAVE_TEXI_MACROS_FILE %OCTAVE_TEXI_MACROS_FILE% +#endif + +#if ! defined (OCTAVE_EXEC_PREFIX) +# define OCTAVE_EXEC_PREFIX %OCTAVE_EXEC_PREFIX% +#endif + +#if ! defined (OCTAVE_FCNFILEDIR) +# define OCTAVE_FCNFILEDIR %OCTAVE_FCNFILEDIR% +#endif + +#if ! defined (OCTAVE_IMAGEDIR) +# define OCTAVE_IMAGEDIR %OCTAVE_IMAGEDIR% +#endif + +#if ! defined (OCTAVE_INCLUDEDIR) +# define OCTAVE_INCLUDEDIR %OCTAVE_INCLUDEDIR% +#endif + +#if ! defined (OCTAVE_INFODIR) +# define OCTAVE_INFODIR %OCTAVE_INFODIR% +#endif + +#if ! defined (OCTAVE_INFOFILE) +# define OCTAVE_INFOFILE %OCTAVE_INFOFILE% +#endif + +#if ! defined (OCTAVE_LIBDIR) +# define OCTAVE_LIBDIR %OCTAVE_LIBDIR% +#endif + +#if ! defined (OCTAVE_LIBEXECDIR) +# define OCTAVE_LIBEXECDIR %OCTAVE_LIBEXECDIR% +#endif + +#if ! defined (OCTAVE_LIBEXECDIR) +# define OCTAVE_LIBEXECDIR %OCTAVE_LIBEXECDIR% +#endif + +#if ! defined (OCTAVE_LOCALAPIFCNFILEDIR) +# define OCTAVE_LOCALAPIFCNFILEDIR %OCTAVE_LOCALAPIFCNFILEDIR% +#endif + +#if ! defined (OCTAVE_LOCALAPIOCTFILEDIR) +# define OCTAVE_LOCALAPIOCTFILEDIR %OCTAVE_LOCALAPIOCTFILEDIR% +#endif + +#if ! defined (OCTAVE_LOCALARCHLIBDIR) +# define OCTAVE_LOCALARCHLIBDIR %OCTAVE_LOCALARCHLIBDIR% +#endif + +#if ! defined (OCTAVE_LOCALFCNFILEDIR) +# define OCTAVE_LOCALFCNFILEDIR %OCTAVE_LOCALFCNFILEDIR% +#endif + +#if ! defined (OCTAVE_LOCALOCTFILEDIR) +# define OCTAVE_LOCALOCTFILEDIR %OCTAVE_LOCALOCTFILEDIR% +#endif + +#if ! defined (OCTAVE_LOCALSTARTUPFILEDIR) +# define OCTAVE_LOCALSTARTUPFILEDIR %OCTAVE_LOCALSTARTUPFILEDIR% +#endif + +#if ! defined (OCTAVE_LOCALAPIARCHLIBDIR) +# define OCTAVE_LOCALAPIARCHLIBDIR %OCTAVE_LOCALAPIARCHLIBDIR% +#endif + +#if ! defined (OCTAVE_LOCALVERARCHLIBDIR) +# define OCTAVE_LOCALVERARCHLIBDIR %OCTAVE_LOCALVERARCHLIBDIR% +#endif + +#if ! defined (OCTAVE_LOCALVERFCNFILEDIR) +# define OCTAVE_LOCALVERFCNFILEDIR %OCTAVE_LOCALVERFCNFILEDIR% +#endif + +#if ! defined (OCTAVE_LOCALVEROCTFILEDIR) +# define OCTAVE_LOCALVEROCTFILEDIR %OCTAVE_LOCALVEROCTFILEDIR% +#endif + +#if ! defined (OCTAVE_MAN1DIR) +# define OCTAVE_MAN1DIR %OCTAVE_MAN1DIR% +#endif + +#if ! defined (OCTAVE_MAN1EXT) +# define OCTAVE_MAN1EXT %OCTAVE_MAN1EXT% +#endif + +#if ! defined (OCTAVE_MANDIR) +# define OCTAVE_MANDIR %OCTAVE_MANDIR% +#endif + +#if ! defined (OCTAVE_OCTDATADIR) +# define OCTAVE_OCTDATADIR %OCTAVE_OCTDATADIR% +#endif + +#if ! defined (OCTAVE_OCTFILEDIR) +# define OCTAVE_OCTFILEDIR %OCTAVE_OCTFILEDIR% +#endif + +#if ! defined (OCTAVE_OCTETCDIR) +# define OCTAVE_OCTETCDIR %OCTAVE_OCTETCDIR% +#endif + +#if ! defined (OCTAVE_OCTLOCALEDIR) +# define OCTAVE_OCTLOCALEDIR %OCTAVE_OCTLOCALEDIR% +#endif + +#if ! defined (OCTAVE_OCTINCLUDEDIR) +# define OCTAVE_OCTINCLUDEDIR %OCTAVE_OCTINCLUDEDIR% +#endif + +#if ! defined (OCTAVE_OCTLIBDIR) +# define OCTAVE_OCTLIBDIR %OCTAVE_OCTLIBDIR% +#endif + +#if ! defined (OCTAVE_OCTTESTSDIR) +# define OCTAVE_OCTTESTSDIR %OCTAVE_OCTTESTSDIR% +#endif + +#if ! defined (OCTAVE_PREFIX) +# define OCTAVE_PREFIX %OCTAVE_PREFIX% +#endif + +#if ! defined (OCTAVE_STARTUPFILEDIR) +# define OCTAVE_STARTUPFILEDIR %OCTAVE_STARTUPFILEDIR% +#endif + +#if ! defined (OCTAVE_RELEASE) +# define OCTAVE_RELEASE %OCTAVE_RELEASE% +#endif + +std::string Voctave_home; +std::string Voctave_exec_home; + +std::string Vbin_dir; +std::string Vinfo_dir; +std::string Vdata_dir; +std::string Vdataroot_dir; +std::string Vinclude_dir; +std::string Vlib_dir; +std::string Vlibexec_dir; +std::string Varch_lib_dir; +std::string Vlocal_arch_lib_dir; +std::string Vlocal_api_arch_lib_dir; +std::string Vlocal_ver_arch_lib_dir; + +std::string Vlocal_ver_oct_file_dir; +std::string Vlocal_api_oct_file_dir; +std::string Vlocal_oct_file_dir; + +std::string Vlocal_ver_fcn_file_dir; +std::string Vlocal_api_fcn_file_dir; +std::string Vlocal_fcn_file_dir; + +std::string Voct_data_dir; +std::string Voct_lib_dir; +std::string Voct_include_dir; +std::string Voct_etc_dir; +std::string Voct_locale_dir; + +std::string Vman1_dir = OCTAVE_MAN1DIR; +std::string Vman1_ext = OCTAVE_MAN1EXT; +std::string Vman_dir = OCTAVE_MANDIR; + +std::string Vlocal_startup_file_dir; +std::string Voct_tests_dir; +std::string Vstartupfile_dir; + +std::string Voct_file_dir; +std::string Vfcn_file_dir; + +std::string Vimage_dir; + +// The path that will be searched for programs that we execute. +// (--exec-path path) +static std::string VEXEC_PATH; + +// Name of the editor to be invoked by the edit_history command. +std::string VEDITOR; + +std::string Vdefault_pager = OCTAVE_DEFAULT_PAGER; +std::string Vcanonical_host_type = OCTAVE_CANONICAL_HOST_TYPE; +std::string Voctave_release = OCTAVE_RELEASE; + +static std::string VIMAGE_PATH; + +std::string Vlocal_site_defaults_file; +std::string Vsite_defaults_file; + +std::string Vbuilt_in_docstrings_file; + +// Variables that name directories or files are substituted into source +// files with "${prefix}/" stripped from the beginning of the string. + +// All configure variables of this form should be specified as absolute +// directory names. The only ones that should not be absolute here are +// ones that have had "${prefix}/" or "${exec_prefix} stripped. + +static std::string +prepend_home_dir (const std::string& hd, const std::string& s) +{ + std::string retval = s; + + char dir_sep_char = octave::sys::file_ops::dir_sep_char (); + + if (! octave::sys::env::absolute_pathname (retval)) + retval = hd + dir_sep_char + s; + + if (dir_sep_char != '/') + std::replace (retval.begin (), retval.end (), '/', dir_sep_char); + + return retval; +} + +static std::string +prepend_octave_home (const std::string& s) +{ + return prepend_home_dir (Voctave_home, s); +} + +static std::string +prepend_octave_exec_home (const std::string& s) +{ + return prepend_home_dir (Voctave_exec_home, s); +} + +static void +set_octave_home (void) +{ + std::string op = OCTAVE_PREFIX; + std::string oep = OCTAVE_EXEC_PREFIX; + + std::string oh = octave::sys::env::getenv ("OCTAVE_HOME"); + std::string oeh = octave::sys::env::getenv ("OCTAVE_EXEC_HOME"); + + // If OCTAVE_HOME is set in the enviornment, use that. Otherwise, + // default to ${prefix} from configure. + + Voctave_home = (oh.empty () ? op : oh); + + // If OCTAVE_EXEC_HOME is set in the environment, use that. + // Otherwise, if ${prefix} and ${exec_prefix} from configure are set + // to the same value, use OCTAVE_HOME from the environment if it is set. + // Othewise, default to ${exec_prefix} from configure. + + if (! oeh.empty ()) + Voctave_exec_home = oeh; + else + { + if (op == oep && ! oh.empty ()) + Voctave_exec_home = oh; + else + Voctave_exec_home = oep; + } +} + +static void +set_default_info_dir (void) +{ + Vinfo_dir = prepend_octave_home (OCTAVE_INFODIR); +} + +static void +set_default_man_vars (void) +{ + Vman_dir = prepend_octave_home (OCTAVE_MANDIR); + Vman1_dir = prepend_octave_home (OCTAVE_MAN1DIR); + Vman1_ext = prepend_octave_home (OCTAVE_MAN1EXT); +} + +static void +set_default_data_dirs (void) +{ + Vdata_dir = prepend_octave_home (OCTAVE_DATADIR); + + Vdataroot_dir = prepend_octave_home (OCTAVE_DATAROOTDIR); +} + +static void +set_default_lib_dir (void) +{ + Vlib_dir = prepend_octave_exec_home (OCTAVE_LIBDIR); +} + +static void +set_default_libexec_dir (void) +{ + Vlibexec_dir = prepend_octave_exec_home (OCTAVE_LIBEXECDIR); +} + +static void +set_default_arch_lib_dir (void) +{ + Varch_lib_dir = prepend_octave_exec_home (OCTAVE_ARCHLIBDIR); +} + +static void +set_default_local_arch_lib_dir (void) +{ + Vlocal_arch_lib_dir = prepend_octave_exec_home (OCTAVE_LOCALARCHLIBDIR); +} + +static void +set_default_local_api_arch_lib_dir (void) +{ + Vlocal_api_arch_lib_dir = prepend_octave_exec_home (OCTAVE_LOCALAPIARCHLIBDIR); +} + +static void +set_default_local_ver_arch_lib_dir (void) +{ + Vlocal_ver_arch_lib_dir = prepend_octave_exec_home (OCTAVE_LOCALVERARCHLIBDIR); +} + +static void +set_default_local_ver_oct_file_dir (void) +{ + Vlocal_ver_oct_file_dir = prepend_octave_exec_home (OCTAVE_LOCALVEROCTFILEDIR); +} + +static void +set_default_local_api_oct_file_dir (void) +{ + Vlocal_api_oct_file_dir = prepend_octave_exec_home (OCTAVE_LOCALAPIOCTFILEDIR); +} + +static void +set_default_local_oct_file_dir (void) +{ + Vlocal_oct_file_dir = prepend_octave_exec_home (OCTAVE_LOCALOCTFILEDIR); +} + +static void +set_default_local_ver_fcn_file_dir (void) +{ + Vlocal_ver_fcn_file_dir = prepend_octave_home (OCTAVE_LOCALVERFCNFILEDIR); +} + +static void +set_default_local_api_fcn_file_dir (void) +{ + Vlocal_api_fcn_file_dir = prepend_octave_home (OCTAVE_LOCALAPIFCNFILEDIR); +} + +static void +set_default_local_fcn_file_dir (void) +{ + Vlocal_fcn_file_dir = prepend_octave_home (OCTAVE_LOCALFCNFILEDIR); +} + +static void +set_default_fcn_file_dir (void) +{ + Vfcn_file_dir = prepend_octave_home (OCTAVE_FCNFILEDIR); +} + +static void +set_default_image_dir (void) +{ + Vimage_dir = prepend_octave_home (OCTAVE_IMAGEDIR); +} + +static void +set_default_oct_data_dir (void) +{ + Voct_data_dir = prepend_octave_home (OCTAVE_OCTDATADIR); +} + +static void +set_default_include_dir (void) +{ + Vinclude_dir = prepend_octave_home (OCTAVE_INCLUDEDIR); +} + +static void +set_default_oct_lib_dir (void) +{ + Voct_etc_dir = prepend_octave_exec_home (OCTAVE_OCTLIBDIR); +} + +static void +set_default_oct_include_dir (void) +{ + Voct_include_dir = prepend_octave_home (OCTAVE_OCTINCLUDEDIR); +} + +static void +set_default_oct_etc_dir (void) +{ + Voct_etc_dir = prepend_octave_home (OCTAVE_OCTETCDIR); +} + +static void +set_default_oct_locale_dir (void) +{ + Voct_locale_dir = prepend_octave_home (OCTAVE_OCTLOCALEDIR); +} + +static void +set_default_oct_file_dir (void) +{ + Voct_file_dir = prepend_octave_exec_home (OCTAVE_OCTFILEDIR); +} + +static void +set_default_bin_dir (void) +{ + Vbin_dir = prepend_octave_exec_home (OCTAVE_BINDIR); +} + +void +set_exec_path (const std::string& path_arg) +{ + std::string tpath = path_arg; + + if (tpath.empty ()) + tpath = octave::sys::env::getenv ("OCTAVE_EXEC_PATH"); + + if (tpath.empty ()) + tpath = Vlocal_ver_arch_lib_dir + octave::directory_path::path_sep_str () + + Vlocal_api_arch_lib_dir + octave::directory_path::path_sep_str () + + Vlocal_arch_lib_dir + octave::directory_path::path_sep_str () + + Varch_lib_dir + octave::directory_path::path_sep_str () + + Vbin_dir; + + VEXEC_PATH = tpath; + + // FIXME: should we really be modifying PATH in the environment? + // The way things are now, Octave will ignore directories set in the + // PATH with calls like + // + // setenv ("PATH", "/my/path"); + // + // To fix this, I think Octave should be searching the combination of + // PATH and EXEC_PATH for programs that it executes instead of setting + // the PATH in the environment and relying on the shell to do the + // searching. + + // This is static so that even if set_exec_path is called more than + // once, shell_path is the original PATH from the environment, + // before we start modifying it. + static std::string shell_path = octave::sys::env::getenv ("PATH"); + + if (! shell_path.empty ()) + tpath = shell_path + octave::directory_path::path_sep_str () + tpath; + + octave::sys::env::putenv ("PATH", tpath); +} + +void +set_image_path (const std::string& path) +{ + VIMAGE_PATH = "."; + + std::string tpath = path; + + if (tpath.empty ()) + tpath = octave::sys::env::getenv ("OCTAVE_IMAGE_PATH"); + + if (! tpath.empty ()) + VIMAGE_PATH += octave::directory_path::path_sep_str () + tpath; + + tpath = octave::genpath (Vimage_dir, ""); + + if (! tpath.empty ()) + VIMAGE_PATH += octave::directory_path::path_sep_str () + tpath; +} + +static void +set_default_doc_cache_file (void) +{ + if (Vdoc_cache_file.empty ()) + { + std::string def_file = prepend_octave_home (OCTAVE_DOC_CACHE_FILE); + + std::string env_file = octave::sys::env::getenv ("OCTAVE_DOC_CACHE_FILE"); + + Vdoc_cache_file = (env_file.empty () ? def_file : env_file); + } +} + +static void +set_default_texi_macros_file (void) +{ + if (Vtexi_macros_file.empty ()) + { + std::string def_file = prepend_octave_home (OCTAVE_TEXI_MACROS_FILE); + + std::string env_file = octave::sys::env::getenv ("OCTAVE_TEXI_MACROS_FILE"); + + Vtexi_macros_file = (env_file.empty () ? def_file : env_file); + } +} + +static void +set_default_info_file (void) +{ + if (Vinfo_file.empty ()) + { + std::string std_info_file = prepend_octave_home (OCTAVE_INFOFILE); + + std::string oct_info_file = octave::sys::env::getenv ("OCTAVE_INFO_FILE"); + + Vinfo_file = (oct_info_file.empty () ? std_info_file : oct_info_file); + } +} + +static void +set_default_info_prog (void) +{ + if (Vinfo_program.empty ()) + { + std::string oct_info_prog = octave::sys::env::getenv ("OCTAVE_INFO_PROGRAM"); + + if (oct_info_prog.empty ()) + Vinfo_program = "info"; + else + Vinfo_program = std::string (oct_info_prog); + } +} + +static void +set_default_editor (void) +{ + VEDITOR = "emacs"; + + std::string env_editor = octave::sys::env::getenv ("EDITOR"); + + if (! env_editor.empty ()) + VEDITOR = env_editor; +} + +static void +set_local_site_defaults_file (void) +{ + std::string lsf = octave::sys::env::getenv ("OCTAVE_SITE_INITFILE"); + + if (lsf.empty ()) + { + Vlocal_site_defaults_file + = prepend_octave_home (OCTAVE_LOCALSTARTUPFILEDIR); + Vlocal_site_defaults_file.append ("/octaverc"); + } + else + Vlocal_site_defaults_file = lsf; +} + +static void +set_site_defaults_file (void) +{ + std::string sf = octave::sys::env::getenv ("OCTAVE_VERSION_INITFILE"); + + if (sf.empty ()) + { + Vsite_defaults_file = prepend_octave_home (OCTAVE_STARTUPFILEDIR); + Vsite_defaults_file.append ("/octaverc"); + } + else + Vsite_defaults_file = sf; +} + +static void +set_built_in_docstrings_file (void) +{ + if (Vbuilt_in_docstrings_file.empty ()) + { + std::string df = octave::sys::env::getenv ("OCTAVE_BUILT_IN_DOCSTRINGS_FILE"); + + if (df.empty ()) + Vbuilt_in_docstrings_file + = Voct_etc_dir + octave::sys::file_ops::dir_sep_str () + "built-in-docstrings"; + else + Vbuilt_in_docstrings_file = df; + } +} + +void +install_defaults (void) +{ + // OCTAVE_HOME must be set first! + + set_octave_home (); + + set_default_info_dir (); + + set_default_man_vars (); + + set_default_data_dirs (); + set_default_lib_dir (); + set_default_libexec_dir (); + set_default_arch_lib_dir (); + + set_default_include_dir (); + + set_default_local_ver_arch_lib_dir (); + set_default_local_api_arch_lib_dir (); + set_default_local_arch_lib_dir (); + + set_default_local_ver_oct_file_dir (); + set_default_local_api_oct_file_dir (); + set_default_local_oct_file_dir (); + + set_default_local_ver_fcn_file_dir (); + set_default_local_api_fcn_file_dir (); + set_default_local_fcn_file_dir (); + + set_default_oct_data_dir (); + set_default_oct_lib_dir (); + set_default_oct_include_dir (); + set_default_oct_etc_dir (); + set_default_oct_locale_dir (); + + set_default_fcn_file_dir (); + set_default_oct_file_dir (); + + set_default_image_dir (); + + set_default_bin_dir (); + + set_exec_path (); + + set_image_path (); + + set_default_doc_cache_file (); + + set_default_texi_macros_file (); + + set_default_info_file (); + + set_default_info_prog (); + + set_default_editor (); + + set_local_site_defaults_file (); + + set_site_defaults_file (); + + set_built_in_docstrings_file (); +} + +DEFUN (EDITOR, args, nargout, + doc: /* -*- texinfo -*- +@deftypefn {} {@var{val} =} EDITOR () +@deftypefnx {} {@var{old_val} =} EDITOR (@var{new_val}) +@deftypefnx {} {} EDITOR (@var{new_val}, "local") +Query or set the internal variable that specifies the default text editor. + +The default value is taken from the environment variable @w{@env{EDITOR}} +when Octave starts. If the environment variable is not initialized, +@w{@env{EDITOR}} will be set to @qcode{"emacs"}. + +When called from inside a function with the @qcode{"local"} option, the +variable is changed locally for the function and any subroutines it calls. +The original variable value is restored when exiting the function. + +@seealso{edit, edit_history} +@end deftypefn */) +{ + return SET_NONEMPTY_INTERNAL_STRING_VARIABLE (EDITOR); +} + +/* +%!test +%! orig_val = EDITOR (); +%! old_val = EDITOR ("X"); +%! assert (orig_val, old_val); +%! assert (EDITOR (), "X"); +%! EDITOR (orig_val); +%! assert (EDITOR (), orig_val); + +%!error (EDITOR (1, 2)) +*/ + +DEFUN (EXEC_PATH, args, nargout, + doc: /* -*- texinfo -*- +@deftypefn {} {@var{val} =} EXEC_PATH () +@deftypefnx {} {@var{old_val} =} EXEC_PATH (@var{new_val}) +@deftypefnx {} {} EXEC_PATH (@var{new_val}, "local") +Query or set the internal variable that specifies a colon separated +list of directories to append to the shell PATH when executing external +programs. + +The initial value of is taken from the environment variable +@w{@env{OCTAVE_EXEC_PATH}}, but that value can be overridden by the command +line argument @option{--exec-path PATH}. + +When called from inside a function with the @qcode{"local"} option, the +variable is changed locally for the function and any subroutines it calls. +The original variable value is restored when exiting the function. + +@seealso{IMAGE_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME} +@end deftypefn */) +{ + octave_value retval = SET_NONEMPTY_INTERNAL_STRING_VARIABLE (EXEC_PATH); + + if (args.length () > 0) + set_exec_path (VEXEC_PATH); + + return retval; +} + +/* +%!test +%! orig_val = EXEC_PATH (); +%! old_val = EXEC_PATH ("X"); +%! assert (orig_val, old_val); +%! assert (EXEC_PATH (), "X"); +%! EXEC_PATH (orig_val); +%! assert (EXEC_PATH (), orig_val); + +%!error (EXEC_PATH (1, 2)) +*/ + +DEFUN (IMAGE_PATH, args, nargout, + doc: /* -*- texinfo -*- +@deftypefn {} {@var{val} =} IMAGE_PATH () +@deftypefnx {} {@var{old_val} =} IMAGE_PATH (@var{new_val}) +@deftypefnx {} {} IMAGE_PATH (@var{new_val}, "local") +Query or set the internal variable that specifies a colon separated +list of directories in which to search for image files. + +When called from inside a function with the @qcode{"local"} option, the +variable is changed locally for the function and any subroutines it calls. +The original variable value is restored when exiting the function. + +@seealso{EXEC_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME} +@end deftypefn */) +{ + return SET_NONEMPTY_INTERNAL_STRING_VARIABLE (IMAGE_PATH); +} + +/* +%!test +%! orig_val = IMAGE_PATH (); +%! old_val = IMAGE_PATH ("X"); +%! assert (orig_val, old_val); +%! assert (IMAGE_PATH (), "X"); +%! IMAGE_PATH (orig_val); +%! assert (IMAGE_PATH (), orig_val); + +%!error (IMAGE_PATH (1, 2)) +*/ + +DEFUN (OCTAVE_HOME, args, , + doc: /* -*- texinfo -*- +@deftypefn {} {} OCTAVE_HOME () +Return the name of the top-level Octave installation directory. +OCTAVE_HOME corresponds to the configuration variable @var{prefix}. +@seealso{EXEC_PATH, IMAGE_PATH, OCTAVE_EXEC_HOME} +@end deftypefn */) +{ + if (args.length () != 0) + print_usage (); + + return ovl (Voctave_home); +} + +/* +%!assert (ischar (OCTAVE_HOME ())) +%!error OCTAVE_HOME (1) +*/ + +DEFUN (OCTAVE_EXEC_HOME, args, , + doc: /* -*- texinfo -*- +@deftypefn {} {} OCTAVE_HOME () +Return the name of the top-level Octave installation directory for +architecture-dependendent files. If not specified separately, the value +is the same as OCTAVE_HOME. OCTAVE_EXEC_HOME corresponds to the +configuration variable @var{exec_prefix}. +@seealso{EXEC_PATH, IMAGE_PATH, OCTAVE_HOME} +@end deftypefn */) +{ + if (args.length () != 0) + print_usage (); + + return ovl (Voctave_exec_home); +} + +/* +%!assert (ischar (OCTAVE_EXEC_HOME ())) +%!error OCTAVE_EXEC_HOME (1) +*/ + +DEFUNX ("OCTAVE_VERSION", FOCTAVE_VERSION, args, , + doc: /* -*- texinfo -*- +@deftypefn {} {} OCTAVE_VERSION () +Return the version number of Octave as a string. +@seealso{ver, version} +@end deftypefn */) +{ + if (args.length () != 0) + print_usage (); + + return ovl (OCTAVE_VERSION); +} + +/* +%!assert (ischar (OCTAVE_VERSION ())) +%!error OCTAVE_VERSION (1) +*/