GNU Octave  8.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-2023 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 
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 
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 DEFMETHOD (EDITOR, interp, args, nargout,
157  doc: /* -*- texinfo -*-
158 @deftypefn {} {@var{val} =} EDITOR ()
159 @deftypefnx {} {@var{old_val} =} EDITOR (@var{new_val})
160 @deftypefnx {} {@var{old_val} =} EDITOR (@var{new_val}, "local")
161 Query or set the internal variable that specifies the default text editor.
162 
163 The default value is taken from the environment variable @w{@env{EDITOR}}
164 when Octave starts. If the environment variable is not initialized,
165 @w{@env{EDITOR}} will be set to @qcode{"emacs"}.
166 
167 When called from inside a function with the @qcode{"local"} option, the
168 variable is changed locally for the function and any subroutines it calls.
169 The 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 
191 DEFMETHOD (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 {} {@var{old_val} =} EXEC_PATH (@var{new_val}, "local")
196 Query or set the internal variable that specifies a colon separated
197 list of directories to append to the shell PATH when executing external
198 programs.
199 
200 The initial value of is taken from the environment variable
201 @w{@env{OCTAVE_EXEC_PATH}}, but that value can be overridden by the command
202 line argument @option{--exec-path PATH}.
203 
204 When called from inside a function with the @qcode{"local"} option, the
205 variable is changed locally for the function and any subroutines it calls.
206 The 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 
228 DEFMETHOD (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 {} {@var{old_val} =} IMAGE_PATH (@var{new_val}, "local")
233 Query or set the internal variable that specifies a colon separated
234 list of directories in which to search for image files.
235 
236 When called from inside a function with the @qcode{"local"} option, the
237 variable is changed locally for the function and any subroutines it calls.
238 The 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 
OCTAVE_END_NAMESPACE(octave)
static std::string path_sep_str(void)
Definition: pathsearch.cc:127
Definition: oct-env.h:40
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
static std::string init_exec_path(void)
Definition: environment.cc:119
static std::string init_image_path(void)
Definition: environment.cc:137
std::string image_path(void) const
Definition: environment.h:65
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
std::string image_dir(void)
Definition: defaults.cc:410
std::string local_arch_lib_dir(void)
Definition: defaults.cc:251
std::string local_ver_arch_lib_dir(void)
Definition: defaults.cc:235
std::string local_api_arch_lib_dir(void)
Definition: defaults.cc:243
std::string bin_dir(void)
Definition: defaults.cc:171
std::string arch_lib_dir(void)
Definition: defaults.cc:219
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
Definition: defun.h:111
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:2413
octave_value set_internal_variable(bool &var, const octave_value_list &args, int nargout, const char *nm)
Definition: variables.cc:584