GNU Octave  6.2.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-2021 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 
44 namespace octave
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  {
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 
101  environment::image_path (const octave_value_list& args, int nargout)
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 
119  std::string environment::init_exec_path (void)
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 
137  std::string environment::init_image_path (void)
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 }
156 
157 DEFMETHOD (EDITOR, interp, args, nargout,
158  doc: /* -*- texinfo -*-
159 @deftypefn {} {@var{val} =} EDITOR ()
160 @deftypefnx {} {@var{old_val} =} EDITOR (@var{new_val})
161 @deftypefnx {} {} EDITOR (@var{new_val}, "local")
162 Query or set the internal variable that specifies the default text editor.
163 
164 The default value is taken from the environment variable @w{@env{EDITOR}}
165 when Octave starts. If the environment variable is not initialized,
166 @w{@env{EDITOR}} will be set to @qcode{"emacs"}.
167 
168 When called from inside a function with the @qcode{"local"} option, the
169 variable is changed locally for the function and any subroutines it calls.
170 The original variable value is restored when exiting the function.
171 
172 @seealso{edit, edit_history}
173 @end deftypefn */)
174 {
175  octave::environment& env = interp.get_environment ();
176 
177  return env.editor (args, nargout);
178 }
179 
180 /*
181 %!test
182 %! orig_val = EDITOR ();
183 %! old_val = EDITOR ("X");
184 %! assert (orig_val, old_val);
185 %! assert (EDITOR (), "X");
186 %! EDITOR (orig_val);
187 %! assert (EDITOR (), orig_val);
188 
189 %!error (EDITOR (1, 2))
190 */
191 
192 DEFMETHOD (EXEC_PATH, interp, args, nargout,
193  doc: /* -*- texinfo -*-
194 @deftypefn {} {@var{val} =} EXEC_PATH ()
195 @deftypefnx {} {@var{old_val} =} EXEC_PATH (@var{new_val})
196 @deftypefnx {} {} EXEC_PATH (@var{new_val}, "local")
197 Query or set the internal variable that specifies a colon separated
198 list of directories to append to the shell PATH when executing external
199 programs.
200 
201 The initial value of is taken from the environment variable
202 @w{@env{OCTAVE_EXEC_PATH}}, but that value can be overridden by the command
203 line argument @option{--exec-path PATH}.
204 
205 When called from inside a function with the @qcode{"local"} option, the
206 variable is changed locally for the function and any subroutines it calls.
207 The original variable value is restored when exiting the function.
208 
209 @seealso{IMAGE_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
210 @end deftypefn */)
211 {
212  octave::environment& env = interp.get_environment ();
213 
214  return env.exec_path (args, nargout);
215 }
216 
217 /*
218 %!test
219 %! orig_val = EXEC_PATH ();
220 %! old_val = EXEC_PATH ("X");
221 %! assert (orig_val, old_val);
222 %! assert (EXEC_PATH (), "X");
223 %! EXEC_PATH (orig_val);
224 %! assert (EXEC_PATH (), orig_val);
225 
226 %!error (EXEC_PATH (1, 2))
227 */
228 
229 DEFMETHOD (IMAGE_PATH, interp, args, nargout,
230  doc: /* -*- texinfo -*-
231 @deftypefn {} {@var{val} =} IMAGE_PATH ()
232 @deftypefnx {} {@var{old_val} =} IMAGE_PATH (@var{new_val})
233 @deftypefnx {} {} IMAGE_PATH (@var{new_val}, "local")
234 Query or set the internal variable that specifies a colon separated
235 list of directories in which to search for image files.
236 
237 When called from inside a function with the @qcode{"local"} option, the
238 variable is changed locally for the function and any subroutines it calls.
239 The original variable value is restored when exiting the function.
240 
241 @seealso{EXEC_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
242 @end deftypefn */)
243 {
244  octave::environment& env = interp.get_environment ();
245 
246  return env.image_path (args, nargout);
247 }
248 
249 /*
250 %!test
251 %! orig_val = IMAGE_PATH ();
252 %! old_val = IMAGE_PATH ("X");
253 %! assert (orig_val, old_val);
254 %! assert (IMAGE_PATH (), "X");
255 %! IMAGE_PATH (orig_val);
256 %! assert (IMAGE_PATH (), orig_val);
257 
258 %!error (IMAGE_PATH (1, 2))
259 */
static std::string path_sep_str(void)
Definition: pathsearch.cc:127
std::string exec_path(void) const
Definition: environment.h:59
octave_value editor(const octave_value_list &args, int nargout)
Definition: environment.cc:74
std::string set(std::string &var, const std::string &new_val)
Definition: environment.h:86
octave_value exec_path(const octave_value_list &args, int nargout)
Definition: environment.cc:81
static std::string init_editor(void)
Definition: environment.cc:107
static std::string init_image_path(void)
Definition: environment.cc:137
std::string m_exec_path
Definition: environment.h:76
std::string m_editor
Definition: environment.h:74
static std::string init_exec_path(void)
Definition: environment.cc:119
std::string image_path(void) const
Definition: environment.h:65
octave_value image_path(const octave_value_list &args, int nargout)
Definition: environment.cc:101
std::string m_image_path
Definition: environment.h:78
std::string editor(void) const
Definition: environment.h:50
static std::string getenv(const std::string &name)
Definition: oct-env.cc:271
static void putenv(const std::string &name, const std::string &value)
Definition: oct-env.cc:278
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
Definition: defun.h:138
QString path
std::string image_dir(void)
Definition: defaults.cc:410
std::string local_ver_arch_lib_dir(void)
Definition: defaults.cc:235
std::string local_arch_lib_dir(void)
Definition: defaults.cc:251
std::string arch_lib_dir(void)
Definition: defaults.cc:219
std::string local_api_arch_lib_dir(void)
Definition: defaults.cc:243
std::string bin_dir(void)
Definition: defaults.cc:171
static void append_to_shell_path(const std::string &exec_path)
Definition: environment.cc:46
std::string genpath(const std::string &dirname, const string_vector &skip)
Definition: load-path.cc:2280
octave_value::octave_value(const Array< char > &chm, char type) return retval
Definition: ov.cc:811
octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)
Definition: variables.cc:608