GNU Octave  4.4.1
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
load-path.h
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 2006-2018 John W. Eaton
4 Copyright (C) 2010 VZLU Prague
5 
6 This file is part of Octave.
7 
8 Octave is free software: you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12 
13 Octave is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with Octave; see the file COPYING. If not, see
20 <https://www.gnu.org/licenses/>.
21 
22 */
23 
24 #if ! defined (octave_load_path_h)
25 #define octave_load_path_h 1
26 
27 #include "octave-config.h"
28 
29 #include <iosfwd>
30 #include <list>
31 #include <map>
32 #include <set>
33 #include <string>
34 
35 #include "oct-time.h"
36 #include "pathsearch.h"
37 #include "str-vec.h"
38 
39 namespace octave
40 {
41  class
42  OCTINTERP_API
43  load_path
44  {
45  public:
46 
47  load_path (void)
48  : package_map (), top_level_package (), dir_info_list (), init_dirs (),
49  m_command_line_path (), add_hook (load_path::execute_pkg_add),
50  remove_hook (load_path::execute_pkg_del)
51  { }
52 
53  typedef void (*hook_fcn_ptr) (const std::string& dir);
54 
55  load_path (const load_path&) = delete;
56 
57  load_path& operator = (const load_path&) = delete;
58 
59  ~load_path (void) = default;
60 
61  void initialize (bool set_initial_path = false);
62 
63  void clear (void);
64 
65  void set (const std::string& p, bool warn = false, bool is_init = false);
66 
67  void append (const std::string& dir, bool warn = false);
68 
69  void prepend (const std::string& dir, bool warn = false);
70 
71  bool remove (const std::string& dir);
72 
73  void update (void) const;
74 
75  bool contains_canonical (const std::string& dir_name) const;
76 
77  std::string find_method (const std::string& class_name,
78  const std::string& meth,
79  std::string& dir_name,
80  const std::string& pack_name = "")
81  {
82  return get_package (pack_name).find_method (class_name, meth, dir_name);
83  }
84 
85  std::string find_method (const std::string& class_name,
86  const std::string& meth,
87  const std::string& pack_name = "")
88  {
89  std::string dir_name;
90  return find_method (class_name, meth, dir_name, pack_name);
91  }
92 
93  std::list<std::string> methods (const std::string& class_name,
94  const std::string& pack_name = "")
95  {
96  return get_package (pack_name).methods (class_name);
97  }
98 
99  std::list<std::string> overloads (const std::string& meth) const;
100 
101  bool find_package (const std::string& package_name) const
102  {
103  return (package_map.find (package_name) != package_map.end ());
104  }
105 
106  std::list<std::string>
107  get_all_package_names (bool only_top_level = true) const;
108 
110  const std::string& pack_name = "")
111  {
112  return get_package (pack_name).find_fcn (fcn, dir_name);
113  }
114 
116  const std::string& pack_name = "")
117  {
118  std::string dir_name;
119  return find_fcn (fcn, dir_name, pack_name);
120  }
121 
123  const std::string& fcn,
124  const std::string& pack_name = "")
125  {
126  return get_package (pack_name).find_private_fcn (dir, fcn);
127  }
128 
130  const std::string& pack_name = "")
131  {
132  std::string dir_name;
133  return get_package (pack_name).find_fcn (fcn, dir_name, M_FILE);
134  }
135 
137  const std::string& pack_name = "")
138  {
139  std::string dir_name;
140  return get_package (pack_name).find_fcn (fcn, dir_name, M_FILE);
141  }
142 
144  const std::string& pack_name = "")
145  {
146  std::string dir_name;
147  return get_package (pack_name).find_fcn (fcn, dir_name, M_FILE);
148  }
149 
150  std::string find_file (const std::string& file) const;
151 
152  std::string find_dir (const std::string& dir) const;
153 
154  string_vector find_matching_dirs (const std::string& dir) const;
155 
157 
158  string_vector find_all_first_of (const string_vector& files) const;
159 
160  string_vector dirs (void) const;
161 
162  std::list<std::string> dir_list (void) const;
163 
164  string_vector files (const std::string& dir, bool omit_exts = false) const;
165 
166  string_vector fcn_names (void) const;
167 
168  std::string path (void) const;
169 
170  void display (std::ostream& os) const;
171 
172  hook_fcn_ptr get_add_hook (void) { return add_hook; }
173  hook_fcn_ptr get_remove_hook (void) { return remove_hook; }
174 
175  void set_add_hook (hook_fcn_ptr f) { add_hook = f; }
176  void set_remove_hook (hook_fcn_ptr f) { remove_hook = f; }
177 
178  static void execute_pkg_add (const std::string& dir);
179  static void execute_pkg_del (const std::string& dir);
180 
182  {
183  if (m_command_line_path.empty ())
184  m_command_line_path = p;
185  else
186  m_command_line_path += directory_path::path_sep_str () + p;
187  }
188 
190  {
191  return m_command_line_path;
192  }
193 
194  std::string system_path (void) const { return sys_path; }
195 
196  private:
197 
198  static const int M_FILE = 1;
199  static const int OCT_FILE = 2;
200  static const int MEX_FILE = 4;
201 
202  class dir_info
203  {
204  public:
205 
206  // <FCN_NAME, TYPE>
207  typedef std::map<std::string, int> fcn_file_map_type;
208 
209  typedef fcn_file_map_type::const_iterator const_fcn_file_map_iterator;
210  typedef fcn_file_map_type::iterator fcn_file_map_iterator;
211 
212  struct class_info
213  {
214  class_info (void) : method_file_map (), private_file_map () { }
215 
216  class_info (const class_info& ci)
217  : method_file_map (ci.method_file_map),
218  private_file_map (ci.private_file_map)
219  { }
220 
221  class_info& operator = (const class_info& ci)
222  {
223  if (this != &ci)
224  {
225  method_file_map = ci.method_file_map;
226  private_file_map = ci.private_file_map;
227  }
228  return *this;
229  }
230 
231  ~class_info (void) = default;
232 
235  };
236 
237  // <CLASS_NAME, CLASS_INFO>
238  typedef std::map<std::string, class_info> method_file_map_type;
239 
240  typedef method_file_map_type::const_iterator const_method_file_map_iterator;
241  typedef method_file_map_type::iterator method_file_map_iterator;
242 
243  // <PACKAGE_NAME, DIR_INFO>
244  typedef std::map<std::string, dir_info> package_dir_map_type;
245 
246  typedef package_dir_map_type::const_iterator const_package_dir_map_iterator;
247  typedef package_dir_map_type::iterator package_dir_map_iterator;
248 
249  // This default constructor is only provided so we can create a
250  // std::map of dir_info objects. You should not use this
251  // constructor for any other purpose.
252  dir_info (void) = default;
253 
255  : dir_name (d), abs_dir_name (), is_relative (false),
256  dir_mtime (), dir_time_last_checked (), all_files (), fcn_files (),
257  private_file_map (), method_file_map (), package_dir_map ()
258  {
259  initialize ();
260  }
261 
262  dir_info (const dir_info&) = default;
263 
264  ~dir_info (void) = default;
265 
266  dir_info& operator = (const dir_info&) = default;
267 
268  void update (void);
269 
280 
281  bool is_package (const std::string& name) const;
282 
283  private:
284 
285  void initialize (void);
286 
287  void get_file_list (const std::string& d);
288 
289  void get_private_file_map (const std::string& d);
290 
291  void get_method_file_map (const std::string& d,
292  const std::string& class_name);
293 
294  void get_package_dir (const std::string& d,
295  const std::string& package_name);
296 
298  };
299 
300  class file_info
301  {
302  public:
303 
304  file_info (const std::string& d, int t) : dir_name (d), types (t) { }
305 
307  : dir_name (fi.dir_name), types (fi.types) { }
308 
309  ~file_info (void) = default;
310 
312  {
313  if (&fi != this)
314  {
315  dir_name = fi.dir_name;
316  types = fi.types;
317  }
318 
319  return *this;
320  }
321 
323  int types;
324  };
325 
326  // We maintain two ways of looking at the same information.
327  //
328  // First, a list of directories and the set of "public" files and
329  // private files (those found in the special "private" subdirectory)
330  // in each directory.
331  //
332  // Second, a map from filenames (the union of all "public" files for all
333  // directories, but without filename extensions) to a list of
334  // corresponding information (directory name and file types). This
335  // way, we can quickly find shadowed filenames and look up all
336  // overloaded functions (in the "@" directories used to implement
337  // classes).
338 
339  typedef std::list<dir_info> dir_info_list_type;
340 
341  typedef dir_info_list_type::const_iterator const_dir_info_list_iterator;
342  typedef dir_info_list_type::iterator dir_info_list_iterator;
343 
344  typedef std::map<std::string, dir_info> abs_dir_cache_type;
345 
346  typedef abs_dir_cache_type::const_iterator const_abs_dir_cache_iterator;
347  typedef abs_dir_cache_type::iterator abs_dir_cache_iterator;
348 
349  typedef std::list<file_info> file_info_list_type;
350 
351  typedef file_info_list_type::const_iterator const_file_info_list_iterator;
352  typedef file_info_list_type::iterator file_info_list_iterator;
353 
354  // <FCN_NAME, FILE_INFO_LIST>
355  typedef std::map<std::string, file_info_list_type> fcn_map_type;
356 
357  typedef fcn_map_type::const_iterator const_fcn_map_iterator;
358  typedef fcn_map_type::iterator fcn_map_iterator;
359 
360  // <DIR_NAME, <FCN_NAME, TYPES>>
361  typedef std::map<std::string, dir_info::fcn_file_map_type>
363 
364  typedef private_fcn_map_type::const_iterator const_private_fcn_map_iterator;
365  typedef private_fcn_map_type::iterator private_fcn_map_iterator;
366 
367  // <CLASS_NAME, <FCN_NAME, FILE_INFO_LIST>>
368  typedef std::map<std::string, fcn_map_type> method_map_type;
369 
370  typedef method_map_type::const_iterator const_method_map_iterator;
371  typedef method_map_type::iterator method_map_iterator;
372 
374  {
375  public:
376 
377  package_info (const std::string& package_name = "")
378  : m_package_name (package_name), dir_list (), fcn_map (),
379  private_fcn_map (),
380  method_map ()
381  { }
382 
384  : m_package_name (l.m_package_name), dir_list (l.dir_list),
385  private_fcn_map (l.private_fcn_map), method_map (l.method_map)
386  { }
387 
388  ~package_info (void) = default;
389 
390  package_info& operator = (const package_info& l)
391  {
392  if (&l != this)
393  {
394  m_package_name = l.m_package_name;
395  dir_list = l.dir_list;
396  fcn_map = l.fcn_map;
397  private_fcn_map = l.private_fcn_map;
398  method_map = l.method_map;
399  }
400 
401  return *this;
402  }
403 
404  void add (const dir_info& di, bool at_end, bool updating)
405  {
406  if (at_end)
407  dir_list.push_back (di.dir_name);
408  else
409  dir_list.push_front (di.dir_name);
410 
411  add_to_fcn_map (di, at_end, updating);
412 
413  add_to_private_fcn_map (di);
414 
415  add_to_method_map (di, at_end);
416  }
417 
418  void move (const dir_info& di, bool at_end);
419 
420  void remove (const dir_info& di);
421 
422  void clear (void)
423  {
424  dir_list.clear ();
425 
426  fcn_map.clear ();
427 
428  private_fcn_map.clear ();
429 
430  method_map.clear ();
431  }
432 
433  void display (std::ostream& out) const;
434 
436  find_fcn (const std::string& fcn, std::string& dir_name,
437  int type = M_FILE | OCT_FILE | MEX_FILE) const;
438 
440  find_private_fcn (const std::string& dir, const std::string& fcn,
441  int type = M_FILE | OCT_FILE | MEX_FILE) const;
442 
444  find_method (const std::string& class_name, const std::string& meth,
445  std::string& dir_name,
446  int type = M_FILE | OCT_FILE | MEX_FILE) const;
447 
448  std::list<std::string> methods (const std::string& class_name) const;
449 
450  void overloads (const std::string& meth, std::list<std::string>& l) const;
451 
452  string_vector fcn_names (void) const;
453 
454  private:
455 
456  void add_to_fcn_map (const dir_info& di, bool at_end, bool updating);
457 
458  void add_to_private_fcn_map (const dir_info& di);
459 
460  void add_to_method_map (const dir_info& di, bool at_end);
461 
462  void move_fcn_map (const std::string& dir,
463  const string_vector& fcn_files, bool at_end);
464 
465  void move_method_map (const std::string& dir, bool at_end);
466 
467  void remove_fcn_map (const std::string& dir,
468  const string_vector& fcn_files);
469 
470  void remove_private_fcn_map (const std::string& dir);
471 
472  void remove_method_map (const std::string& dir);
473 
474  bool check_file_type (std::string& fname, int type, int possible_types,
475  const std::string& fcn, const char *who) const;
476 
477  void print_types (std::ostream& os, int types) const;
478 
479  void print_fcn_list (std::ostream& os,
480  const dir_info::fcn_file_map_type& lst) const;
481 
483 
484  std::list<std::string> dir_list;
485 
487 
489 
491  };
492 
493  // <PACKAGE_NAME, PACKAGE_INFO>
494  typedef std::map<std::string, package_info> package_map_type;
495 
496  typedef package_map_type::const_iterator const_package_map_iterator;
497  typedef package_map_type::iterator package_map_iterator;
498 
500 
502 
504 
505  mutable std::set<std::string> init_dirs;
506 
508 
510 
512 
513  hook_fcn_ptr add_hook;
514 
515  hook_fcn_ptr remove_hook;
516 
517  const_dir_info_list_iterator find_dir_info (const std::string& dir) const;
518  dir_info_list_iterator find_dir_info (const std::string& dir);
519 
520  bool contains (const std::string& dir) const;
521 
522  void move (dir_info_list_iterator i, bool at_end);
523 
524  void move (const dir_info& di, bool at_end, const std::string& pname = "");
525 
526  void remove (const dir_info& di, const std::string& pname = "");
527 
528  void add (const std::string& dir, bool at_end, bool warn);
529 
530  void add (const dir_info& di, bool at_end, const std::string& pname = "",
531  bool updating = false) const;
532 
533  bool is_package (const std::string& name) const;
534 
536  {
537  if (! name.empty () && is_package (name))
538  {
539  package_map_iterator l = package_map.find (name);
540 
541  if (l == package_map.end ())
542  l = package_map.insert (package_map.end (),
543  package_map_type::value_type (name, package_info (name)));
544 
545  return l->second;
546  }
547 
548  return top_level_package;
549  }
550 
551  string_vector get_file_list (const dir_info::fcn_file_map_type& lst) const;
552 
553  friend dir_info::fcn_file_map_type get_fcn_files (const std::string& d);
554  };
555 
556  extern std::string
557  genpath (const std::string& dir, const string_vector& skip = "private");
558 }
559 
560 #endif
method_file_map_type method_file_map
Definition: load-path.h:278
file_info_list_type::iterator file_info_list_iterator
Definition: load-path.h:352
std::map< std::string, fcn_map_type > method_map_type
Definition: load-path.h:368
std::string find_fcn(const std::string &fcn, const std::string &pack_name="")
Definition: load-path.h:115
For example cd octave end example noindent changes the current working directory to file
Definition: dirfns.cc:124
file_info(const file_info &fi)
Definition: load-path.h:306
fname
Definition: load-save.cc:767
std::string find_method(const std::string &class_name, const std::string &meth, const std::string &pack_name="")
Definition: load-path.h:85
std::string system_path(void) const
Definition: load-path.h:194
~file_info(void)=default
F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE * f
static std::string path_sep_str(void)
Definition: pathsearch.cc:127
fcn_map_type::iterator fcn_map_iterator
Definition: load-path.h:358
std::string get_command_line_path(void) const
Definition: load-path.h:189
private_fcn_map_type::iterator private_fcn_map_iterator
Definition: load-path.h:365
abs_dir_cache_type::iterator abs_dir_cache_iterator
Definition: load-path.h:347
file_info_list_type::const_iterator const_file_info_list_iterator
Definition: load-path.h:351
std::string find_oct_file(const std::string &fcn, const std::string &pack_name="")
Definition: load-path.h:136
dir_info_list_type::iterator dir_info_list_iterator
Definition: load-path.h:342
package_info & get_package(const std::string &name) const
Definition: load-path.h:535
private_fcn_map_type private_fcn_map
Definition: load-path.h:488
static double fi[256]
Definition: randmtzig.cc:435
OCTAVE_EXPORT octave_value_list return the number of command line arguments passed to Octave If called with the optional argument the function t
Definition: ov-usr-fcn.cc:997
std::string find_mex_file(const std::string &fcn, const std::string &pack_name="")
Definition: load-path.h:143
fcn_file_map_type::iterator fcn_file_map_iterator
Definition: load-path.h:210
std::string find_method(const std::string &class_name, const std::string &meth, std::string &dir_name, const std::string &pack_name="")
Definition: load-path.h:77
hook_fcn_ptr get_add_hook(void)
Definition: load-path.h:172
std::list< dir_info > dir_info_list_type
Definition: load-path.h:339
std::string find_fcn_file(const std::string &fcn, const std::string &pack_name="")
Definition: load-path.h:129
dir_info_list_type::const_iterator const_dir_info_list_iterator
Definition: load-path.h:341
octave_function * fcn
Definition: ov-class.cc:1754
std::map< std::string, package_info > package_map_type
Definition: load-path.h:494
std::map< std::string, int > fcn_file_map_type
Definition: load-path.h:207
void add(const dir_info &di, bool at_end, bool updating)
Definition: load-path.h:404
F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
std::string m_command_line_path
Definition: load-path.h:507
static void initialize(void)
class_info(const class_info &ci)
Definition: load-path.h:216
package_map_type::const_iterator const_package_map_iterator
Definition: load-path.h:496
nd deftypefn *std::string name
Definition: sysdep.cc:647
std::list< file_info > file_info_list_type
Definition: load-path.h:349
package_info(const package_info &l)
Definition: load-path.h:383
std::string find_private_fcn(const std::string &dir, const std::string &fcn, const std::string &pack_name="")
Definition: load-path.h:122
std::string find_fcn(const std::string &fcn, std::string &dir_name, const std::string &pack_name="")
Definition: load-path.h:109
private_fcn_map_type::const_iterator const_private_fcn_map_iterator
Definition: load-path.h:364
hook_fcn_ptr add_hook
Definition: load-path.h:513
package_map_type package_map
Definition: load-path.h:499
file_info(const std::string &d, int t)
Definition: load-path.h:304
method_file_map_type::const_iterator const_method_file_map_iterator
Definition: load-path.h:240
static abs_dir_cache_type abs_dir_cache
Definition: load-path.h:511
void set_remove_hook(hook_fcn_ptr f)
Definition: load-path.h:176
is false
Definition: cellfun.cc:400
bool append
Definition: load-save.cc:1618
std::set< std::string > init_dirs
Definition: load-path.h:505
fcn_map_type::const_iterator const_fcn_map_iterator
Definition: load-path.h:357
std::string genpath(const std::string &dirname, const string_vector &skip)
Definition: load-path.cc:2146
void set_command_line_path(const std::string &p)
Definition: load-path.h:181
package_map_type::iterator package_map_iterator
Definition: load-path.h:497
idx type
Definition: ov.cc:3114
bool find_package(const std::string &package_name) const
Definition: load-path.h:101
static std::list< std::string > find_first_of(const std::string &path, const std::list< std::string > &names, bool all)
Definition: kpse.cc:548
package_dir_map_type::const_iterator const_package_dir_map_iterator
Definition: load-path.h:246
dir_info_list_type dir_info_list
Definition: load-path.h:503
std::string pname
Definition: graphics.cc:11810
file_info & operator=(const file_info &)=default
std::map< std::string, dir_info > abs_dir_cache_type
Definition: load-path.h:344
method_file_map_type::iterator method_file_map_iterator
Definition: load-path.h:241
load_path::dir_info::fcn_file_map_type get_fcn_files(const std::string &d)
Definition: load-path.cc:1067
package_dir_map_type package_dir_map
Definition: load-path.h:279
std::list< std::string > methods(const std::string &class_name, const std::string &pack_name="")
Definition: load-path.h:93
method_map_type::const_iterator const_method_map_iterator
Definition: load-path.h:370
otherwise an error message is printed The permission mask is a UNIX concept used when creating new objects on a file system such as files
Definition: file-io.cc:3038
method_map_type::iterator method_map_iterator
Definition: load-path.h:371
p
Definition: lu.cc:138
hook_fcn_ptr remove_hook
Definition: load-path.h:515
package_info top_level_package
Definition: load-path.h:501
package_info(const std::string &package_name="")
Definition: load-path.h:377
std::map< std::string, class_info > method_file_map_type
Definition: load-path.h:238
for i
Definition: data.cc:5264
std::map< std::string, dir_info > package_dir_map_type
Definition: load-path.h:244
dir_info(const std::string &d)
Definition: load-path.h:254
std::map< std::string, file_info_list_type > fcn_map_type
Definition: load-path.h:355
void set_add_hook(hook_fcn_ptr f)
Definition: load-path.h:175
fcn_file_map_type private_file_map
Definition: load-path.h:277
fcn_file_map_type::const_iterator const_fcn_file_map_iterator
Definition: load-path.h:209
hook_fcn_ptr get_remove_hook(void)
Definition: load-path.h:173
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
abs_dir_cache_type::const_iterator const_abs_dir_cache_iterator
Definition: load-path.h:346
std::list< std::string > dir_list
Definition: load-path.h:484
octave::stream os
Definition: file-io.cc:627
package_dir_map_type::iterator package_dir_map_iterator
Definition: load-path.h:247
static std::string sys_path
Definition: load-path.h:509
std::map< std::string, dir_info::fcn_file_map_type > private_fcn_map_type
Definition: load-path.h:362