GNU Octave  9.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-2024 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 
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 
86  append_to_shell_path (m_exec_path);
87 
88  return retval;
89 }
90 
91 std::string
92 environment::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 
102 environment::image_path (const octave_value_list& args, int nargout)
103 {
104  return set_internal_variable (m_image_path, args, nargout, "IMAGE_PATH",
105  false);
106 }
107 
108 std::string
109 environment::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 
121 std::string
122 environment::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 ())
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 
140 std::string
141 environment::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 
160 DEFMETHOD (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")
165 Query or set the internal variable that specifies the default text editor.
166 
167 The default value is taken from the environment variable @w{@env{EDITOR}}@
168 when Octave starts. If the environment variable is not initialized,
169 @w{@env{EDITOR}}@ will be set to @qcode{"emacs"}.
170 
171 When called from inside a function with the @qcode{"local"} option, the
172 variable is changed locally for the function and any subroutines it calls.
173 The original variable value is restored when exiting the function.
174 
175 @seealso{edit, edit_history}
176 @end deftypefn */)
177 {
178  environment& env = interp.get_environment ();
179 
180  return env.editor (args, nargout);
181 }
182 
183 /*
184 %!test
185 %! orig_val = EDITOR ();
186 %! old_val = EDITOR ("X");
187 %! assert (orig_val, old_val);
188 %! assert (EDITOR (), "X");
189 %! EDITOR (orig_val);
190 %! assert (EDITOR (), orig_val);
191 
192 %!error EDITOR (1, 2)
193 */
194 
195 DEFMETHOD (EXEC_PATH, interp, args, nargout,
196  doc: /* -*- texinfo -*-
197 @deftypefn {} {@var{val} =} EXEC_PATH ()
198 @deftypefnx {} {@var{old_val} =} EXEC_PATH (@var{new_val})
199 @deftypefnx {} {@var{old_val} =} EXEC_PATH (@var{new_val}, "local")
200 Query or set the internal variable that specifies a colon separated
201 list of directories to append to the shell PATH when executing external
202 programs.
203 
204 The initial value of is taken from the environment variable
205 @w{@env{OCTAVE_EXEC_PATH}}, but that value can be overridden by the command
206 line argument @option{--exec-path PATH}.
207 
208 When called from inside a function with the @qcode{"local"} option, the
209 variable is changed locally for the function and any subroutines it calls.
210 The original variable value is restored when exiting the function.
211 
212 @seealso{IMAGE_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
213 @end deftypefn */)
214 {
215  environment& env = interp.get_environment ();
216 
217  return env.exec_path (args, nargout);
218 }
219 
220 /*
221 %!test
222 %! orig_val = EXEC_PATH ();
223 %! old_val = EXEC_PATH ("X");
224 %! assert (orig_val, old_val);
225 %! assert (EXEC_PATH (), "X");
226 %! EXEC_PATH (orig_val);
227 %! assert (EXEC_PATH (), orig_val);
228 
229 %!error EXEC_PATH (1, 2)
230 */
231 
232 DEFMETHOD (IMAGE_PATH, interp, args, nargout,
233  doc: /* -*- texinfo -*-
234 @deftypefn {} {@var{val} =} IMAGE_PATH ()
235 @deftypefnx {} {@var{old_val} =} IMAGE_PATH (@var{new_val})
236 @deftypefnx {} {@var{old_val} =} IMAGE_PATH (@var{new_val}, "local")
237 Query or set the internal variable that specifies a colon separated
238 list of directories in which to search for image files.
239 
240 When called from inside a function with the @qcode{"local"} option, the
241 variable is changed locally for the function and any subroutines it calls.
242 The original variable value is restored when exiting the function.
243 
244 @seealso{EXEC_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
245 @end deftypefn */)
246 {
247  environment& env = interp.get_environment ();
248 
249  return env.image_path (args, nargout);
250 }
251 
252 /*
253 %!test
254 %! orig_val = IMAGE_PATH ();
255 %! old_val = IMAGE_PATH ("X");
256 %! assert (orig_val, old_val);
257 %! assert (IMAGE_PATH (), "X");
258 %! IMAGE_PATH (orig_val);
259 %! assert (IMAGE_PATH (), orig_val);
260 
261 %!error IMAGE_PATH (1, 2)
262 */
263 
264 OCTAVE_END_NAMESPACE(octave)
static std::string path_sep_str()
Definition: pathsearch.cc:134
Definition: oct-env.h:40
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
std::string local_ver_arch_lib_dir()
std::string local_arch_lib_dir()
std::string bin_dir()
std::string local_api_arch_lib_dir()
std::string image_dir()
std::string arch_lib_dir()
#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 &dir, const string_vector &skip="private")
octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)
Definition: variables.cc:583