# HG changeset patch # User jwe # Date 1148680280 0 # Node ID f145cb46d31fc8f8781224e8571c1bfbdb41f9d7 # Parent 5e41e06f6a78b98866b8baa661566312c0df940b [project @ 2006-05-26 21:51:20 by jwe] diff -r 5e41e06f6a78 -r f145cb46d31f src/fn-cache.cc --- a/src/fn-cache.cc Fri May 26 21:42:22 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,252 +0,0 @@ -/* - -Copyright (C) 1996, 1997 John W. Eaton - -This file is part of Octave. - -Octave is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -Octave is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with Octave; see the file COPYING. If not, write to the Free -Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. - -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include "file-stat.h" -#include "str-vec.h" - -#include -#include "dir-ops.h" -#include "dirfns.h" -#include "error.h" -#include "fn-cache.h" -#include "pathsearch.h" - -octave_fcn_file_name_cache *octave_fcn_file_name_cache::instance = 0; - -// Update the cache. Returns TRUE if something needed to be updated. - -// We just accumulate all directories ever referenced in the cache and -// we don't delete any old ones. - -bool -octave_fcn_file_name_cache::update (const std::string& path) -{ - bool something_changed = false; - - dir_path p /* = path.empty () ? Vload_path_dir_path : dir_path (path) */; - - string_vector dirs = p.all_directories (); - - int len = dirs.length (); - - for (int i = 0; i < len; i++) - { - std::string d = dirs[i]; - - if (cache.find (d) != cache.end ()) - { - if (cache[d].update (d)) - something_changed = true; - } - else - { - cache[d] = file_name_cache_elt (d); - something_changed = true; - } - } - - return something_changed; -} - -string_vector -octave_fcn_file_name_cache::list (const std::string& path, bool no_suffix) -{ - string_vector retval; - - if (! instance) - instance = new octave_fcn_file_name_cache (); - - if (instance) - retval = instance->do_list (path, no_suffix); - else - error ("unable to create file name cache object!"); - - return retval; -} - -// Check to see if any of the elements in the cache need to be -// updated, then return the list of names in the cache. - -string_vector -octave_fcn_file_name_cache::do_list (const std::string& path, bool no_suffix) -{ - update (path); - - string_vector fcn_file_names; - string_vector fcn_file_names_no_suffix; - - // For now, always generate the list of function files on each - // call. - - // FIXME -- this could probably be improved by keeping lists - // of all the function files for the current load path and only - // updating that when the load path changes. Have to be careful to - // return the right thing when we are only looking for a subset of - // all the files in the load path. - - int total_len = 0; - - dir_path p /* = path.empty () ? Vload_path_dir_path : dir_path (path) */; - - string_vector dirs = p.all_directories (); - - int ndirs = dirs.length (); - - if (ndirs > 1) - { - for (int i = 0; i < ndirs; i++) - { - std::string d = dirs[i]; - - total_len += cache[d].length (); - } - - fcn_file_names.resize (total_len); - fcn_file_names_no_suffix.resize (total_len); - - int k = 0; - - for (int j = 0; j < ndirs; j++) - { - std::string d = dirs[j]; - - file_name_cache_elt elt = cache[d]; - - int len = elt.length (); - - string_vector ffn = elt.fcn_file_names; - string_vector ffnns = elt.fcn_file_names_no_suffix; - - for (int i = 0; i < len; i++) - { - fcn_file_names[k] = ffn[i]; - fcn_file_names_no_suffix[k] = ffnns[i]; - - k++; - } - } - } - else if (ndirs == 1) - { - std::string d = dirs[0]; - - file_name_cache_elt elt = cache[d]; - - fcn_file_names = elt.fcn_file_names; - fcn_file_names_no_suffix = elt.fcn_file_names_no_suffix; - } - - return no_suffix ? fcn_file_names_no_suffix : fcn_file_names; -} - -// Create a list of the function names in a given directory. Returns -// TRUE if the cache element was out of date. - -bool -file_name_cache_elt::update (const std::string& dir_name) -{ - bool retval = false; - - file_stat file (dir_name); - - // If the directory doesn't exist, delete the names in the cache. - // If it does exist,read it only if it is out of date. - - if (file) - { - if (file.is_newer (timestamp)) - { - retval = true; - - timestamp = file.mtime (); - - dir_entry dir (dir_name); - - if (dir) - { - string_vector tmp = dir.read (); - - int max_len = tmp.length (); - - fcn_file_names.resize (max_len); - fcn_file_names_no_suffix.resize (max_len); - - int k = 0; - int i; - for (i = 0; i < max_len; i++) - { - std::string entry = tmp[i]; - - int len = entry.length (); - -#if defined (ENABLE_DYNAMIC_LINKING) - if ((len > 2 - && entry[len-2] == '.' && entry[len-1] == 'm') - || (len > 4 - && entry[len-4] == '.' && entry[len-3] == 'o' - && entry[len-2] == 'c' && entry[len-1] == 't')) -#else - if (len > 2 - && entry[len-2] == '.' && entry[len-1] == 'm') -#endif - { - fcn_file_names[k] = entry; - - fcn_file_names_no_suffix[k] = (entry[len-1] == 'm') - ? std::string (entry, 0, len-2) - : std::string (entry, 0, len-4); - - k++; - } - } - - fcn_file_names.resize (k); - fcn_file_names_no_suffix.resize (k); - } - else - { - fcn_file_names.resize (0); - fcn_file_names_no_suffix.resize (0); - } - } - } - else - { - fcn_file_names.resize (0); - fcn_file_names_no_suffix.resize (0); - } - - return retval; -} - -/* -;;; Local Variables: *** -;;; mode: C++ *** -;;; End: *** -*/ diff -r 5e41e06f6a78 -r f145cb46d31f src/fn-cache.h --- a/src/fn-cache.h Fri May 26 21:42:22 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -/* - -Copyright (C) 1996, 1997 John W. Eaton - -This file is part of Octave. - -Octave is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -Octave is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with Octave; see the file COPYING. If not, write to the Free -Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. - -*/ - -#if !defined (octave_fn_cache_h) -#define octave_fn_cache_h 1 - -#include -#include - -#include "oct-time.h" - -class string_vector; - -// FIXME -- this should maybe be nested in the -// octave_fcn_file_name_cache class... - -class -file_name_cache_elt -{ -public: - - file_name_cache_elt (void) - : timestamp (static_cast (0)), fcn_file_names (), - fcn_file_names_no_suffix () - { update (std::string ()); } - - file_name_cache_elt (const std::string& dir_name) - : timestamp (static_cast (0)), fcn_file_names (), - fcn_file_names_no_suffix () - { update (dir_name); } - - file_name_cache_elt (const file_name_cache_elt& elt) - { - timestamp = elt.timestamp; - fcn_file_names = elt.fcn_file_names; - fcn_file_names_no_suffix = elt.fcn_file_names_no_suffix; - } - - file_name_cache_elt& operator = (const file_name_cache_elt& elt) - { - if (&elt != this) - { - timestamp = elt.timestamp; - fcn_file_names = elt.fcn_file_names; - fcn_file_names_no_suffix = elt.fcn_file_names_no_suffix; - } - return *this; - } - - ~file_name_cache_elt (void) { } - - int length (void) { return fcn_file_names.length (); } - - bool update (const std::string& dir_name); - - // The time we last read this directory. - octave_time timestamp; - - // The list of file names in this directory. - string_vector fcn_file_names; - - // The list of file names in this directory without the .m or .oct - // suffixes. - string_vector fcn_file_names_no_suffix; -}; - -class -octave_fcn_file_name_cache -{ -protected: - - octave_fcn_file_name_cache (void) : cache () { update (std::string ()); } - -public: - - ~octave_fcn_file_name_cache (void) { } - - bool update (const std::string& path); - - static string_vector list (bool no_suffix = false) - { return list (std::string (), no_suffix); } - - static string_vector list (const std::string& path, bool no_suffix = false); - - static string_vector list_no_suffix (void) - { return list (true); } - - static string_vector list_no_suffix (const std::string& path) - { return list (path, true); } - -private: - - static octave_fcn_file_name_cache* instance; - - // An associative array of all the directory names in the load path - // and the corresponding cache elements. - std::map cache; - - string_vector do_list (const std::string& path, bool no_suffix); -}; - -#endif - -/* -;;; Local Variables: *** -;;; mode: C++ *** -;;; End: *** -*/