# HG changeset patch # User John W. Eaton # Date 1217952250 14400 # Node ID 4d13a7a2f6abb53bc3768d3ce2d2747a29692597 # Parent a2ab20ba78f74bb0adddc7b9903e23be46e5df7e dir_path: use singleton class for static data members diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,10 @@ +2008-08-05 John W. Eaton + + * pathsearch.cc (dir_path::init): Move octave_kpathsea_initialized + here from file scope. + * pathsearch.h, pathsearch.cc (class dir_path::static_members): + New singleton class for static members of dir_path. + 2008-08-04 John W. Eaton * oct-env.cc (octave_env::do_set_program_name, diff --git a/liboctave/pathsearch.cc b/liboctave/pathsearch.cc --- a/liboctave/pathsearch.cc +++ b/liboctave/pathsearch.cc @@ -37,11 +37,29 @@ #include "kpse.cc" -char dir_path::path_sep_char = SEPCHAR; +dir_path::static_members *dir_path::static_members::instance = 0; + +dir_path::static_members::static_members (void) + : xpath_sep_char (SEPCHAR), xpath_sep_str (SEPCHAR_STR) { } + +bool +dir_path::static_members::instance_ok (void) +{ + bool retval = true; -std::string dir_path::path_sep_str (SEPCHAR_STR); + if (! instance) + instance = new static_members (); -static bool octave_kpathsea_initialized = false; + if (! instance) + { + (*current_liboctave_error_handler) + ("unable to create dir_path::static_members object!"); + + retval = false; + } + + return retval; +} string_vector dir_path::elements (void) @@ -123,6 +141,8 @@ void dir_path::init (void) { + static bool octave_kpathsea_initialized = false; + if (! octave_kpathsea_initialized) { std::string val = octave_env::getenv ("KPATHSEA_DEBUG"); diff --git a/liboctave/pathsearch.h b/liboctave/pathsearch.h --- a/liboctave/pathsearch.h +++ b/liboctave/pathsearch.h @@ -83,10 +83,58 @@ init (); } - static bool is_path_sep (char c) { return c == path_sep_char; } +private: + + // Use a singleton class for these data members instead of just + // making them static members of the dir_path class so that we can + // ensure proper initialization. + + class static_members + { + public: + + static_members (void); + + static char path_sep_char (void) + { + return instance_ok () ? instance->xpath_sep_char : 0; + } + + static std::string path_sep_str (void) + { + return instance_ok () ? instance->xpath_sep_str : std::string (); + } + + private: + + static static_members *instance; - static char path_sep_char; - static std::string path_sep_str; + static bool instance_ok (void); + + // No copying! + + static_members (const static_members&); + + static_members& operator = (const static_members&); + + char xpath_sep_char; + + std::string xpath_sep_str; + }; + +public: + + static char path_sep_char (void) + { + return static_members::path_sep_char (); + } + + static std::string path_sep_str (void) + { + return static_members::path_sep_str (); + } + + static bool is_path_sep (char c) { return c == path_sep_char (); } private: diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2008-08-05 John W. Eaton + + * dirfns.cc (Fpathsep): Fix usage of dir_path::path_sep_str. + * defaults.cc (set_exec_path, set_image_path): Likewise. + * load-path.h (load_path::set_command_line_path): Likewise. + * load-path.cc (maybe_add_path_elts, load_path::do_initialize, + load_path::do_path, genpath, Fpath): Likewise. + (split_path): Fix usage of dir_path::path_sep_char. + 2008-08-04 John W. Eaton * symtab.cc (symbol_table::fcn_info::fcn_info_rep::find_autoload): diff --git a/src/defaults.cc b/src/defaults.cc --- a/src/defaults.cc +++ b/src/defaults.cc @@ -233,10 +233,10 @@ void set_exec_path (const std::string& path) { - VEXEC_PATH = Vlocal_ver_arch_lib_dir + dir_path::path_sep_str - + Vlocal_api_arch_lib_dir + dir_path::path_sep_str - + Vlocal_arch_lib_dir + dir_path::path_sep_str - + Varch_lib_dir + dir_path::path_sep_str + VEXEC_PATH = Vlocal_ver_arch_lib_dir + dir_path::path_sep_str () + + Vlocal_api_arch_lib_dir + dir_path::path_sep_str () + + Vlocal_arch_lib_dir + dir_path::path_sep_str () + + Varch_lib_dir + dir_path::path_sep_str () + Vbin_dir; // This is static so that even if set_exec_path is called more than @@ -245,7 +245,7 @@ static std::string shell_path = octave_env::getenv ("PATH"); if (! shell_path.empty ()) - VEXEC_PATH += dir_path::path_sep_str + shell_path; + VEXEC_PATH += dir_path::path_sep_str () + shell_path; std::string tpath = path; @@ -253,7 +253,7 @@ tpath = octave_env::getenv ("OCTAVE_EXEC_PATH"); if (! tpath.empty ()) - VEXEC_PATH = tpath + dir_path::path_sep_str + VEXEC_PATH; + VEXEC_PATH = tpath + dir_path::path_sep_str () + VEXEC_PATH; octave_env::putenv ("PATH", VEXEC_PATH); } @@ -269,12 +269,12 @@ tpath = octave_env::getenv ("OCTAVE_IMAGE_PATH"); if (! tpath.empty ()) - VIMAGE_PATH += dir_path::path_sep_str + tpath; + VIMAGE_PATH += dir_path::path_sep_str () + tpath; tpath = genpath (Vimage_dir, ""); if (! tpath.empty ()) - VIMAGE_PATH += dir_path::path_sep_str + tpath; + VIMAGE_PATH += dir_path::path_sep_str () + tpath; } static void diff --git a/src/dirfns.cc b/src/dirfns.cc --- a/src/dirfns.cc +++ b/src/dirfns.cc @@ -662,7 +662,7 @@ octave_value retval; if (args.length () == 0) - retval = dir_path::path_sep_str; + retval = dir_path::path_sep_str (); else print_usage (); diff --git a/src/load-path.cc b/src/load-path.cc --- a/src/load-path.cc +++ b/src/load-path.cc @@ -419,7 +419,7 @@ if (path.empty ()) path = tpath; else - path += dir_path::path_sep_str + tpath; + path += dir_path::path_sep_str () + tpath; } } @@ -448,10 +448,10 @@ std::string xpath = "."; if (! tpath.empty ()) - xpath += dir_path::path_sep_str + tpath; + xpath += dir_path::path_sep_str () + tpath; if (! sys_path.empty ()) - xpath += dir_path::path_sep_str + sys_path; + xpath += dir_path::path_sep_str () + sys_path; do_set (xpath, false); } @@ -473,7 +473,7 @@ std::list retval; size_t beg = 0; - size_t end = p.find (dir_path::path_sep_char); + size_t end = p.find (dir_path::path_sep_char ()); size_t len = p.length (); @@ -489,7 +489,7 @@ if (beg == len) break; - end = p.find (dir_path::path_sep_char, beg); + end = p.find (dir_path::path_sep_char (), beg); } std::string elt = p.substr (beg); @@ -1246,7 +1246,7 @@ xpath = xdirs[0]; for (octave_idx_type i = 1; i < len; i++) - xpath += dir_path::path_sep_str + xdirs[i]; + xpath += dir_path::path_sep_str () + xdirs[i]; return xpath; } @@ -1610,7 +1610,7 @@ file_stat fs (nm); if (fs && fs.is_dir ()) - retval += dir_path::path_sep_str + genpath (nm); + retval += dir_path::path_sep_str () + genpath (nm); } } } @@ -1754,7 +1754,7 @@ std::string path = argv[1]; for (int i = 2; i < argc; i++) - path += dir_path::path_sep_str + argv[i]; + path += dir_path::path_sep_str () + argv[i]; load_path::set (path, true); } diff --git a/src/load-path.h b/src/load-path.h --- a/src/load-path.h +++ b/src/load-path.h @@ -209,7 +209,7 @@ if (command_line_path.empty ()) command_line_path = p; else - command_line_path += dir_path::path_sep_str + p; + command_line_path += dir_path::path_sep_str () + p; } static std::string system_path (void)