# HG changeset patch # User jwe # Date 1151532711 0 # Node ID b305874f50ef560d38c1c5c5a14dbab010cb1817 # Parent f9ac7ebf0e19b4ec1df4f7fceb5c764570d29ab2 [project @ 2006-06-28 22:11:51 by jwe] diff -r f9ac7ebf0e19 -r b305874f50ef src/ChangeLog --- a/src/ChangeLog Wed Jun 28 16:05:24 2006 +0000 +++ b/src/ChangeLog Wed Jun 28 22:11:51 2006 +0000 @@ -1,5 +1,18 @@ 2006-06-28 John W. Eaton + * load-path.cc (Faddpath): Don't treat "." specially here. + Don't check directory status here. + (Fpath): Handle all args. Don't treat "." specially here. + (Faddpath, Frmpath): Delete unused variable xpath. + (load_path::do_add): New function. + (load_path::do_prepend, load_path::do_append): Use it. + (load_path::do_remove): Really prevent removal of ".". + (load_path::do_clear): Clearing doesn't remove ".". + (load_path::append, load_path::prepend, load_path::do_append, + load_path::do_prepend): New arg, warn. + + * load-path.h: Fix decls. + * DLD-FUNCTIONS/regexp.cc (octregexp_list): Avoid bug in older versions of g++. diff -r f9ac7ebf0e19 -r b305874f50ef src/load-path.cc --- a/src/load-path.cc Wed Jun 28 16:05:24 2006 +0000 +++ b/src/load-path.cc Wed Jun 28 22:11:51 2006 +0000 @@ -374,7 +374,7 @@ if (Vsystem_path != ":") xpath += Vsystem_path; - do_set (xpath + ":::"); + do_set (xpath + ":::", false); } void @@ -382,6 +382,8 @@ { dir_info_list.clear (); fcn_map.clear (); + + do_append (".", false); } static std::list @@ -418,7 +420,7 @@ } void -load_path::do_set (const std::string& p) +load_path::do_set (const std::string& p, bool warn) { do_clear (); @@ -433,7 +435,7 @@ for (std::list::const_iterator i = elts.begin (); i != elts.end (); i++) - do_append (*i); + do_append (*i, warn); // Restore add hook and execute for all newly added directories. @@ -449,64 +451,72 @@ } void -load_path::do_append (const std::string& dir) +load_path::do_append (const std::string& dir, bool warn) { if (! dir.empty ()) - { - dir_info_list_iterator i = find_dir_info (dir); - - if (i != dir_info_list.end ()) - move (i, true); - else - { - dir_info di (dir); + do_add (dir, true, warn); +} - if (! error_state) - { - dir_info_list.push_back (di); - - add_to_fcn_map (di, true); - - if (add_hook) - add_hook (dir); - } - } - } +void +load_path::do_prepend (const std::string& dir, bool warn) +{ + if (! dir.empty ()) + do_add (dir, false, warn); } void -load_path::do_prepend (const std::string& dir) +load_path::do_add (const std::string& dir, bool at_end, bool warn) { - if (! dir.empty ()) + dir_info_list_iterator i = find_dir_info (dir); + + if (i != dir_info_list.end ()) + move (i, at_end); + else { - dir_info_list_iterator i = find_dir_info (dir); + file_stat fs (dir); - if (i != dir_info_list.end ()) - move (i, false); - else + if (fs) { - dir_info di (dir); + if (fs.is_dir ()) + { + dir_info di (dir); - if (! error_state) - { - dir_info_list.push_front (di); + if (! error_state) + { + if (at_end) + dir_info_list.push_back (di); + else + dir_info_list.push_front (di); + + add_to_fcn_map (di, true); - add_to_fcn_map (di, false); - - if (add_hook) - add_hook (dir); + if (add_hook) + add_hook (dir); + } } + else if (warn) + warning ("addpath: %s: not a directory", dir.c_str ()); } + else if (warn) + { + std::string msg = fs.error (); + warning ("addpath: %s: %s", dir.c_str (), msg.c_str ()); + } + } - // FIXME -- is there a better way to do this? + // FIXME -- is there a better way to do this? - i = find_dir_info ("."); + i = find_dir_info ("."); - if (i != dir_info_list.end ()) - move (i, false); - else - panic_impossible (); + if (i != dir_info_list.end ()) + { + if (i != dir_info_list.begin () && warn) + warning ("addpath: \".\" is always first in the path"); + + move (i, false); } + else + panic_impossible (); } bool @@ -517,55 +527,62 @@ if (! dir.empty ()) { if (dir == ".") - warning ("rmpath: can't remove \".\" from path"); + { + warning ("rmpath: can't remove \".\" from path"); - dir_info_list_iterator i = find_dir_info (dir); - - if (i != dir_info_list.end ()) - { + // Avoid additional warnings. retval = true; + } + else + { + dir_info_list_iterator i = find_dir_info (dir); - string_vector fcn_files = i->fcn_files; + if (i != dir_info_list.end ()) + { + retval = true; - dir_info_list.erase (i); + string_vector fcn_files = i->fcn_files; + + dir_info_list.erase (i); - octave_idx_type len = fcn_files.length (); + octave_idx_type len = fcn_files.length (); + + for (octave_idx_type k = 0; k < len; k++) + { + std::string fname = fcn_files[k]; - for (octave_idx_type k = 0; k < len; k++) - { - std::string fname = fcn_files[k]; + std::string ext; + std::string base = fname; + + size_t pos = fname.rfind ('.'); - std::string ext; - std::string base = fname; + if (pos != NPOS) + { + base = fname.substr (0, pos); + ext = fname.substr (pos); + } + + std::list& file_info_list = fcn_map[base]; - size_t pos = fname.rfind ('.'); + for (std::list::iterator p = file_info_list.begin (); + p != file_info_list.end (); + p++) + { + if (p->dir_name == dir) + { + file_info_list.erase (p); - if (pos != NPOS) - { - base = fname.substr (0, pos); - ext = fname.substr (pos); + if (file_info_list.empty ()) + fcn_map.erase (fname); + + break; + } + } } - std::list& file_info_list = fcn_map[base]; - - for (std::list::iterator p = file_info_list.begin (); - p != file_info_list.end (); - p++) - { - if (p->dir_name == dir) - { - file_info_list.erase (p); - - if (file_info_list.empty ()) - fcn_map.erase (fname); - - break; - } - } + if (remove_hook) + remove_hook (dir); } - - if (remove_hook) - remove_hook (dir); } } @@ -1289,16 +1306,9 @@ std::string path = argv[1]; for (int i = 2; i < argc; i++) - path += dir_path::path_sep_str; - - size_t plen = path.length (); + path += dir_path::path_sep_str + argv[i]; - if (! ((plen == 1 && path[0] == ':') - || (plen > 1 - && path.substr (0, 2) == ("." + dir_path::path_sep_str)))) - path = "." + dir_path::path_sep_str + path; - - load_path::set (path); + load_path::set (path, true); } if (nargout > 0) @@ -1381,12 +1391,6 @@ } } - std::list xpath = load_path::dir_list (); - - // Strip "." for now. Calling path to set the path will restore it. - - xpath.remove ("."); - for (int i = 0; i < nargin; i++) { std::string arg = args(i).string_value (); @@ -1404,28 +1408,10 @@ //dir = regexprep (dir_elts{j}, "//+", "/"); //dir = regexprep (dir, "/$", ""); - if (dir == "." && append) - warning ("addpath: \".\" is always first in the path"); - - file_stat fs (dir); - - if (fs) - { - if (fs.is_dir ()) - { - if (append) - load_path::append (dir); - else - load_path::prepend (dir); - } - else - warning ("addpath: %s: not a directory", dir.c_str ()); - } + if (append) + load_path::append (dir, true); else - { - std::string msg = fs.error (); - warning ("addpath: %s: %s", dir.c_str (), msg.c_str ()); - } + load_path::prepend (dir, true); } } else @@ -1458,8 +1444,6 @@ if (nargin > 0) { - std::list xpath = load_path::dir_list (); - for (int i = 0; i < nargin; i++) { std::string arg = args(i).string_value (); diff -r f9ac7ebf0e19 -r b305874f50ef src/load-path.h --- a/src/load-path.h Wed Jun 28 16:05:24 2006 +0000 +++ b/src/load-path.h Wed Jun 28 22:11:51 2006 +0000 @@ -57,22 +57,22 @@ instance->do_clear (); } - static void set (const std::string& p) + static void set (const std::string& p, bool warn = false) { if (instance_ok ()) - instance->do_set (p); + instance->do_set (p, warn); } - static void append (const std::string& dir) + static void append (const std::string& dir, bool warn = false) { if (instance_ok ()) - instance->do_append (dir); + instance->do_append (dir, warn); } - static void prepend (const std::string& dir) + static void prepend (const std::string& dir, bool warn = false) { if (instance_ok ()) - instance->do_prepend (dir); + instance->do_prepend (dir, warn); } static bool remove (const std::string& dir) @@ -298,11 +298,13 @@ void do_clear (void); - void do_set (const std::string& p); + void do_set (const std::string& p, bool warn); + + void do_append (const std::string& dir, bool warn); - void do_append (const std::string& dir); + void do_prepend (const std::string& dir, bool warn); - void do_prepend (const std::string& dir); + void do_add (const std::string& dir, bool at_end, bool warn); bool do_remove (const std::string& dir);