GNU Octave  9.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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