GNU Octave 7.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
environment.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 2017-2022 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if defined (HAVE_CONFIG_H)
27# include "config.h"
28#endif
29
30#include <string>
31
32#include "dir-ops.h"
33#include "oct-env.h"
34#include "file-stat.h"
35#include "pathsearch.h"
36#include "str-vec.h"
37
38#include "defaults.h"
39#include "defun.h"
40#include "environment.h"
41#include "interpreter.h"
42#include "variables.h"
43
44OCTAVE_NAMESPACE_BEGIN
45
46 static void append_to_shell_path (const std::string& exec_path)
47 {
48 // FIXME: should there be a way to remove a previous setting from
49 // PATH?
50
51 if (exec_path.empty ())
52 return;
53
54 // FIXME: should we really be modifying PATH in the environment?
55
56 std::string shell_path = sys::env::getenv ("PATH");
57
58 if (shell_path.empty ())
59 sys::env::putenv ("PATH", exec_path);
60 else
61 {
62 // If PATH doesn't already have exec_path, append it.
63 // FIXME: should we search for the elements individually, and
64 // only append those that are missing?
65
66 std::string path_sep = directory_path::path_sep_str ();
67
68 if (shell_path.find (exec_path) == std::string::npos)
69 sys::env::putenv ("PATH", shell_path + path_sep + exec_path);
70 }
71 }
72
74 environment::editor (const octave_value_list& args, int nargout)
75 {
76 return set_internal_variable (m_editor, args, nargout, "EDITOR", false);
77 }
78
79
81 environment::exec_path (const octave_value_list& args, int nargout)
82 {
83 octave_value retval
84 = set_internal_variable (m_exec_path, args, nargout, "EXEC_PATH", false);
85
87
88 return retval;
89 }
90
91 std::string environment::exec_path (const std::string& path)
92 {
93 std::string old_val = set (m_exec_path, path);
94
96
97 return old_val;
98 }
99
102 {
103 return set_internal_variable (m_image_path, args, nargout, "IMAGE_PATH",
104 false);
105 }
106
107 std::string environment::init_editor (void)
108 {
109 std::string retval = "emacs";
110
111 std::string env_editor = sys::env::getenv ("EDITOR");
112
113 if (! env_editor.empty ())
114 retval = env_editor;
115
116 return retval;
117 }
118
120 {
121 std::string exec_path = sys::env::getenv ("OCTAVE_EXEC_PATH");
122
123 std::string path_sep = directory_path::path_sep_str ();
124
125 if (exec_path.empty ())
127 + config::local_api_arch_lib_dir () + path_sep
128 + config::local_arch_lib_dir () + path_sep
129 + config::arch_lib_dir () + path_sep
130 + config::bin_dir ());
131
133
134 return exec_path;
135 }
136
138 {
139 std::string image_path = ".";
140
141 std::string path_sep = directory_path::path_sep_str ();
142
143 std::string env_path = sys::env::getenv ("OCTAVE_IMAGE_PATH");
144
145 if (! env_path.empty ())
146 image_path += path_sep + env_path;
147
148 std::string gen_path = genpath (config::image_dir (), "");
149
150 if (! gen_path.empty ())
151 image_path += path_sep + gen_path;
152
153 return image_path;
154 }
155
156DEFMETHOD (EDITOR, interp, args, nargout,
157 doc: /* -*- texinfo -*-
158@deftypefn {} {@var{val} =} EDITOR ()
159@deftypefnx {} {@var{old_val} =} EDITOR (@var{new_val})
160@deftypefnx {} {} EDITOR (@var{new_val}, "local")
161Query or set the internal variable that specifies the default text editor.
162
163The default value is taken from the environment variable @w{@env{EDITOR}}
164when Octave starts. If the environment variable is not initialized,
165@w{@env{EDITOR}} will be set to @qcode{"emacs"}.
166
167When called from inside a function with the @qcode{"local"} option, the
168variable is changed locally for the function and any subroutines it calls.
169The original variable value is restored when exiting the function.
170
171@seealso{edit, edit_history}
172@end deftypefn */)
173{
174 environment& env = interp.get_environment ();
175
176 return env.editor (args, nargout);
177}
178
179/*
180%!test
181%! orig_val = EDITOR ();
182%! old_val = EDITOR ("X");
183%! assert (orig_val, old_val);
184%! assert (EDITOR (), "X");
185%! EDITOR (orig_val);
186%! assert (EDITOR (), orig_val);
187
188%!error EDITOR (1, 2)
189*/
190
191DEFMETHOD (EXEC_PATH, interp, args, nargout,
192 doc: /* -*- texinfo -*-
193@deftypefn {} {@var{val} =} EXEC_PATH ()
194@deftypefnx {} {@var{old_val} =} EXEC_PATH (@var{new_val})
195@deftypefnx {} {} EXEC_PATH (@var{new_val}, "local")
196Query or set the internal variable that specifies a colon separated
197list of directories to append to the shell PATH when executing external
198programs.
199
200The initial value of is taken from the environment variable
201@w{@env{OCTAVE_EXEC_PATH}}, but that value can be overridden by the command
202line argument @option{--exec-path PATH}.
203
204When called from inside a function with the @qcode{"local"} option, the
205variable is changed locally for the function and any subroutines it calls.
206The original variable value is restored when exiting the function.
207
208@seealso{IMAGE_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
209@end deftypefn */)
210{
211 environment& env = interp.get_environment ();
212
213 return env.exec_path (args, nargout);
214}
215
216/*
217%!test
218%! orig_val = EXEC_PATH ();
219%! old_val = EXEC_PATH ("X");
220%! assert (orig_val, old_val);
221%! assert (EXEC_PATH (), "X");
222%! EXEC_PATH (orig_val);
223%! assert (EXEC_PATH (), orig_val);
224
225%!error EXEC_PATH (1, 2)
226*/
227
228DEFMETHOD (IMAGE_PATH, interp, args, nargout,
229 doc: /* -*- texinfo -*-
230@deftypefn {} {@var{val} =} IMAGE_PATH ()
231@deftypefnx {} {@var{old_val} =} IMAGE_PATH (@var{new_val})
232@deftypefnx {} {} IMAGE_PATH (@var{new_val}, "local")
233Query or set the internal variable that specifies a colon separated
234list of directories in which to search for image files.
235
236When called from inside a function with the @qcode{"local"} option, the
237variable is changed locally for the function and any subroutines it calls.
238The original variable value is restored when exiting the function.
239
240@seealso{EXEC_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
241@end deftypefn */)
242{
243 environment& env = interp.get_environment ();
244
245 return env.image_path (args, nargout);
246}
247
248/*
249%!test
250%! orig_val = IMAGE_PATH ();
251%! old_val = IMAGE_PATH ("X");
252%! assert (orig_val, old_val);
253%! assert (IMAGE_PATH (), "X");
254%! IMAGE_PATH (orig_val);
255%! assert (IMAGE_PATH (), orig_val);
256
257%!error IMAGE_PATH (1, 2)
258*/
259
260OCTAVE_NAMESPACE_END
octave_value image_path(const octave_value_list &args, int nargout)
Definition: environment.cc:101
std::string set(std::string &var, const std::string &new_val)
Definition: environment.h:86
std::string exec_path(void) const
Definition: environment.h:59
static std::string init_editor(void)
Definition: environment.cc:107
std::string editor(void) const
Definition: environment.h:50
std::string m_image_path
Definition: environment.h:78
std::string m_exec_path
Definition: environment.h:76
std::string m_editor
Definition: environment.h:74
octave_value editor(const octave_value_list &args, int nargout)
Definition: environment.cc:74
static std::string init_exec_path(void)
Definition: environment.cc:119
static std::string init_image_path(void)
Definition: environment.cc:137
octave_value exec_path(const octave_value_list &args, int nargout)
Definition: environment.cc:81
std::string image_path(void) const
Definition: environment.h:65
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
Definition: defun.h:111
static OCTAVE_NAMESPACE_BEGIN void append_to_shell_path(const std::string &exec_path)
Definition: environment.cc:46
QString path
std::string genpath(const std::string &dirname, const string_vector &skip)
Definition: load-path.cc:2411
std::string local_arch_lib_dir(void)
Definition: defaults.cc:251
std::string arch_lib_dir(void)
Definition: defaults.cc:219
std::string local_ver_arch_lib_dir(void)
Definition: defaults.cc:235
std::string image_dir(void)
Definition: defaults.cc:410
std::string bin_dir(void)
Definition: defaults.cc:171
std::string local_api_arch_lib_dir(void)
Definition: defaults.cc:243
octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)
Definition: variables.cc:587