GNU Octave  4.4.1
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-2018 John W. Eaton
4 
5 This file is part of Octave.
6 
7 Octave is free software: you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <https://www.gnu.org/licenses/>.
20 
21 */
22 
23 #if defined (HAVE_CONFIG_H)
24 # include "config.h"
25 #endif
26 
27 #include <string>
28 
29 #include "dir-ops.h"
30 #include "oct-env.h"
31 #include "file-stat.h"
32 #include "pathsearch.h"
33 #include "str-vec.h"
34 
35 #include "defaults.h"
36 #include "defun.h"
37 #include "environment.h"
38 #include "interpreter.h"
39 #include "variables.h"
40 
41 static void append_to_shell_path (const std::string& exec_path)
42 {
43  // FIXME: should there be a way to remove a previous setting from
44  // PATH?
45 
46  if (exec_path.empty ())
47  return;
48 
49  // FIXME: should we really be modifying PATH in the environment?
50 
51  std::string shell_path = octave::sys::env::getenv ("PATH");
52 
53  if (shell_path.empty ())
54  octave::sys::env::putenv ("PATH", exec_path);
55  else
56  {
57  // If PATH doesn't already have exec_path, append it.
58  // FIXME: should we search for the elements individually, and
59  // only append those that are missing?
60 
62 
63  if (shell_path.find (exec_path) == std::string::npos)
64  octave::sys::env::putenv ("PATH", shell_path + path_sep + exec_path);
65  }
66 }
67 
68 namespace octave
69 {
72  {
73  return set_internal_variable (m_editor, args, nargout, "EDITOR", false);
74  }
75 
76 
79  {
81  = set_internal_variable (m_exec_path, args, nargout, "EXEC_PATH", false);
82 
84 
85  return retval;
86  }
87 
89  {
90  std::string old_val = set (m_exec_path, path);
91 
93 
94  return old_val;
95  }
96 
99  {
100  return set_internal_variable (m_image_path, args, nargout, "IMAGE_PATH",
101  false);
102  }
103 
105  {
106  std::string retval = "emacs";
107 
108  std::string env_editor = octave::sys::env::getenv ("EDITOR");
109 
110  if (! env_editor.empty ())
111  retval = env_editor;
112 
113  return retval;
114  }
115 
117  {
118  std::string exec_path = octave::sys::env::getenv ("OCTAVE_EXEC_PATH");
119 
121 
122  if (exec_path.empty ())
124  + config::local_api_arch_lib_dir () + path_sep
125  + config::local_arch_lib_dir () + path_sep
126  + config::arch_lib_dir () + path_sep
127  + config::bin_dir ());
128 
130 
131  return exec_path;
132  }
133 
135  {
136  std::string image_path = ".";
137 
139 
140  std::string env_path = octave::sys::env::getenv ("OCTAVE_IMAGE_PATH");
141 
142  if (! env_path.empty ())
143  image_path += path_sep + env_path;
144 
145  std::string gen_path = octave::genpath (config::image_dir (), "");
146 
147  if (! gen_path.empty ())
148  image_path += path_sep + gen_path;
149 
150  return image_path;
151  }
152 }
153 
154 DEFMETHOD (EDITOR, interp, args, nargout,
155  doc: /* -*- texinfo -*-
156 @deftypefn {} {@var{val} =} EDITOR ()
157 @deftypefnx {} {@var{old_val} =} EDITOR (@var{new_val})
158 @deftypefnx {} {} EDITOR (@var{new_val}, "local")
159 Query or set the internal variable that specifies the default text editor.
160 
161 The default value is taken from the environment variable @w{@env{EDITOR}}
162 when Octave starts. If the environment variable is not initialized,
163 @w{@env{EDITOR}} will be set to @qcode{"emacs"}.
164 
165 When called from inside a function with the @qcode{"local"} option, the
166 variable is changed locally for the function and any subroutines it calls.
167 The original variable value is restored when exiting the function.
168 
169 @seealso{edit, edit_history}
170 @end deftypefn */)
171 {
172  octave::environment& env = interp.get_environment ();
173 
174  return env.editor (args, nargout);
175 }
176 
177 /*
178 %!test
179 %! orig_val = EDITOR ();
180 %! old_val = EDITOR ("X");
181 %! assert (orig_val, old_val);
182 %! assert (EDITOR (), "X");
183 %! EDITOR (orig_val);
184 %! assert (EDITOR (), orig_val);
185 
186 %!error (EDITOR (1, 2))
187 */
188 
189 DEFMETHOD (EXEC_PATH, interp, args, nargout,
190  doc: /* -*- texinfo -*-
191 @deftypefn {} {@var{val} =} EXEC_PATH ()
192 @deftypefnx {} {@var{old_val} =} EXEC_PATH (@var{new_val})
193 @deftypefnx {} {} EXEC_PATH (@var{new_val}, "local")
194 Query or set the internal variable that specifies a colon separated
195 list of directories to append to the shell PATH when executing external
196 programs.
197 
198 The initial value of is taken from the environment variable
199 @w{@env{OCTAVE_EXEC_PATH}}, but that value can be overridden by the command
200 line argument @option{--exec-path PATH}.
201 
202 When called from inside a function with the @qcode{"local"} option, the
203 variable is changed locally for the function and any subroutines it calls.
204 The original variable value is restored when exiting the function.
205 
206 @seealso{IMAGE_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
207 @end deftypefn */)
208 {
209  octave::environment& env = interp.get_environment ();
210 
211  return env.exec_path (args, nargout);
212 }
213 
214 /*
215 %!test
216 %! orig_val = EXEC_PATH ();
217 %! old_val = EXEC_PATH ("X");
218 %! assert (orig_val, old_val);
219 %! assert (EXEC_PATH (), "X");
220 %! EXEC_PATH (orig_val);
221 %! assert (EXEC_PATH (), orig_val);
222 
223 %!error (EXEC_PATH (1, 2))
224 */
225 
226 DEFMETHOD (IMAGE_PATH, interp, args, nargout,
227  doc: /* -*- texinfo -*-
228 @deftypefn {} {@var{val} =} IMAGE_PATH ()
229 @deftypefnx {} {@var{old_val} =} IMAGE_PATH (@var{new_val})
230 @deftypefnx {} {} IMAGE_PATH (@var{new_val}, "local")
231 Query or set the internal variable that specifies a colon separated
232 list of directories in which to search for image files.
233 
234 When called from inside a function with the @qcode{"local"} option, the
235 variable is changed locally for the function and any subroutines it calls.
236 The original variable value is restored when exiting the function.
237 
238 @seealso{EXEC_PATH, OCTAVE_HOME, OCTAVE_EXEC_HOME}
239 @end deftypefn */)
240 {
241  octave::environment& env = interp.get_environment ();
242 
243  return env.image_path (args, nargout);
244 }
245 
246 /*
247 %!test
248 %! orig_val = IMAGE_PATH ();
249 %! old_val = IMAGE_PATH ("X");
250 %! assert (orig_val, old_val);
251 %! assert (IMAGE_PATH (), "X");
252 %! IMAGE_PATH (orig_val);
253 %! assert (IMAGE_PATH (), orig_val);
254 
255 %!error (IMAGE_PATH (1, 2))
256 */
std::string m_exec_path
Definition: environment.h:73
octave_value editor(const octave_value_list &args, int nargout)
Definition: environment.cc:71
static std::string init_exec_path(void)
Definition: environment.cc:116
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
Definition: defun.h:135
static void putenv(const std::string &name, const std::string &value)
Definition: oct-env.cc:242
std::string editor(void) const
Definition: environment.h:47
static std::string path_sep_str(void)
Definition: pathsearch.cc:127
octave_value exec_path(const octave_value_list &args, int nargout)
Definition: environment.cc:78
std::string image_path(void) const
Definition: environment.h:62
static std::string getenv(const std::string &name)
Definition: oct-env.cc:235
std::string bin_dir(void)
Definition: defaults.cc:273
std::string m_image_path
Definition: environment.h:75
octave_value image_path(const octave_value_list &args, int nargout)
Definition: environment.cc:98
OCTAVE_EXPORT octave_value_list return the number of command line arguments passed to Octave If called with the optional argument the function xample nargout(@histc)
Definition: ov-usr-fcn.cc:997
std::string arch_lib_dir(void)
Definition: defaults.cc:279
std::string local_api_arch_lib_dir(void)
Definition: defaults.cc:283
static std::string init_editor(void)
Definition: environment.cc:104
std::string image_dir(void)
Definition: defaults.cc:309
octave_value retval
Definition: data.cc:6246
std::string genpath(const std::string &dirname, const string_vector &skip)
Definition: load-path.cc:2146
std::string local_arch_lib_dir(void)
Definition: defaults.cc:284
end deftypefn *return set_internal_variable(Vsvd_driver, args, nargout, "svd_driver", driver_names)
static void append_to_shell_path(const std::string &exec_path)
Definition: environment.cc:41
std::string m_editor
Definition: environment.h:71
std::string local_ver_arch_lib_dir(void)
Definition: defaults.cc:282
If this string is the system will ring the terminal sometimes it is useful to be able to print the original representation of the string
Definition: utils.cc:888
static std::string init_image_path(void)
Definition: environment.cc:134
std::string exec_path(void) const
Definition: environment.h:56