GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
environment.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 2017-2025 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
45
46static 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
74environment::editor (const octave_value_list& args, int nargout)
75{
76 return set_internal_variable (m_editor, args, nargout, "EDITOR", false);
77}
78
79
81environment::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
86 append_to_shell_path (m_exec_path);
87
88 return retval;
89}
90
91std::string
92environment::exec_path (const std::string& path)
93{
94 std::string old_val = set (m_exec_path, path);
95
96 append_to_shell_path (m_exec_path);
97
98 return old_val;
99}
100
103{
104 return set_internal_variable (m_image_path, args, nargout, "IMAGE_PATH",
105 false);
106}
107
108std::string
109environment::init_editor ()
110{
111 std::string retval = "emacs";
112
113 std::string env_editor = sys::env::getenv ("EDITOR");
114
115 if (! env_editor.empty ())
116 retval = env_editor;
117
118 return retval;
119}
120
121std::string
122environment::init_exec_path ()
123{
124 std::string exec_path = sys::env::getenv ("OCTAVE_EXEC_PATH");
125
126 std::string path_sep = directory_path::path_sep_str ();
127
128 if (exec_path.empty ())
129 exec_path = (config::local_ver_arch_lib_dir () + path_sep
130 + config::local_api_arch_lib_dir () + path_sep
131 + config::local_arch_lib_dir () + path_sep
132 + config::arch_lib_dir () + path_sep
133 + config::bin_dir ());
134
135 append_to_shell_path (exec_path);
136
137 return exec_path;
138}
139
140std::string
141environment::init_image_path ()
142{
143 std::string image_path = ".";
144
145 std::string path_sep = directory_path::path_sep_str ();
146
147 std::string env_path = sys::env::getenv ("OCTAVE_IMAGE_PATH");
148
149 if (! env_path.empty ())
150 image_path += path_sep + env_path;
151
152 std::string gen_path = genpath (config::image_dir (), "");
153
154 if (! gen_path.empty ())
155 image_path += path_sep + gen_path;
156
157 return image_path;
158}
159
160DEFMETHOD (EDITOR, interp, args, nargout,
161 doc: /* -*- texinfo -*-
162@deftypefn {} {@var{val} =} EDITOR ()
163@deftypefnx {} {@var{old_val} =} EDITOR (@var{new_val})
164@deftypefnx {} {@var{old_val} =} EDITOR (@var{new_val}, "local")
165Query or set the internal variable that specifies the default text editor when
166using the CLI.
167
168The default value is taken from the environment variable
169@w{@env{EDITOR}}@ when Octave starts. If the environment variable is not
170initialized, @w{@env{EDITOR}}@ will be set to @qcode{"emacs"}.
171
172@emph{Note:} This setting applies when running the CLI@. When using the
173Octave GUI the default editor is specified in the Editor tab of Preferences.
174
175When called from inside a function with the @qcode{"local"} option, the
176variable is changed locally for the function and any subroutines it calls.
177The original variable value is restored when exiting the function.
178
179@seealso{edit, edit_history}
180@end deftypefn */)
181{
182 environment& env = interp.get_environment ();
183
184 return env.editor (args, nargout);
185}
186
187/*
188%!test
189%! orig_val = EDITOR ();
190%! old_val = EDITOR ("X");
191%! assert (orig_val, old_val);
192%! assert (EDITOR (), "X");
193%! EDITOR (orig_val);
194%! assert (EDITOR (), orig_val);
195
196%!error EDITOR (1, 2)
197*/
198
199DEFMETHOD (EXEC_PATH, interp, args, nargout,
200 doc: /* -*- texinfo -*-
201@deftypefn {} {@var{val} =} EXEC_PATH ()
202@deftypefnx {} {@var{old_val} =} EXEC_PATH (@var{new_val})
203@deftypefnx {} {@var{old_val} =} EXEC_PATH (@var{new_val}, "local")
204Query or set the internal variable that specifies a colon separated
205list of directories to append to the shell PATH when executing external
206programs.
207
208The initial value of is taken from the environment variable
209@w{@env{OCTAVE_EXEC_PATH}}, but that value can be overridden by the command
210line argument @option{--exec-path PATH}.
211
212When called from inside a function with the @qcode{"local"} option, the
213variable is changed locally for the function and any subroutines it calls.
214The original variable value is restored when exiting the function.
215
216@seealso{IMAGE_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
217@end deftypefn */)
218{
219 environment& env = interp.get_environment ();
220
221 return env.exec_path (args, nargout);
222}
223
224/*
225%!test
226%! orig_val = EXEC_PATH ();
227%! old_val = EXEC_PATH ("X");
228%! assert (orig_val, old_val);
229%! assert (EXEC_PATH (), "X");
230%! EXEC_PATH (orig_val);
231%! assert (EXEC_PATH (), orig_val);
232
233%!error EXEC_PATH (1, 2)
234*/
235
236DEFMETHOD (IMAGE_PATH, interp, args, nargout,
237 doc: /* -*- texinfo -*-
238@deftypefn {} {@var{val} =} IMAGE_PATH ()
239@deftypefnx {} {@var{old_val} =} IMAGE_PATH (@var{new_val})
240@deftypefnx {} {@var{old_val} =} IMAGE_PATH (@var{new_val}, "local")
241Query or set the internal variable that specifies a colon separated
242list of directories in which to search for image files.
243
244When called from inside a function with the @qcode{"local"} option, the
245variable is changed locally for the function and any subroutines it calls.
246The original variable value is restored when exiting the function.
247
248@seealso{EXEC_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
249@end deftypefn */)
250{
251 environment& env = interp.get_environment ();
252
253 return env.image_path (args, nargout);
254}
255
256/*
257%!test
258%! orig_val = IMAGE_PATH ();
259%! old_val = IMAGE_PATH ("X");
260%! assert (orig_val, old_val);
261%! assert (IMAGE_PATH (), "X");
262%! IMAGE_PATH (orig_val);
263%! assert (IMAGE_PATH (), orig_val);
264
265%!error IMAGE_PATH (1, 2)
266*/
267
268OCTAVE_END_NAMESPACE(octave)
static std::string path_sep_str()
Definition oct-env.h:38
std::string exec_path() const
Definition environment.h:61
std::string image_path() const
Definition environment.h:67
std::string editor() const
Definition environment.h:52
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
Definition defun.h:111
std::string genpath(const std::string &dirname, const string_vector &skip)
octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)
Definition variables.cc:583