From 8cdfbeedcf26b43f449d5563e0b2d4285daf7b6f Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 10 Nov 2000 01:03:05 +0000 Subject: [PATCH] *** empty log message *** --- dtool/src/dtoolutil/executionEnvironment.cxx | 7 +-- dtool/src/dtoolutil/executionEnvironment.h | 3 +- dtool/src/dtoolutil/filename.cxx | 51 ++++++++++++++++++-- dtool/src/dtoolutil/filename.h | 2 + panda/src/framework/framework.cxx | 2 +- 5 files changed, 57 insertions(+), 8 deletions(-) diff --git a/dtool/src/dtoolutil/executionEnvironment.cxx b/dtool/src/dtoolutil/executionEnvironment.cxx index 584d3a35a1..c6502519cc 100644 --- a/dtool/src/dtoolutil/executionEnvironment.cxx +++ b/dtool/src/dtoolutil/executionEnvironment.cxx @@ -5,6 +5,8 @@ #include "executionEnvironment.h" #include +#include +#include // for perror #ifdef WIN32_VC // Windows requires this for getcwd(). @@ -12,7 +14,6 @@ #define getcwd _getcwd #endif -#include // We define the symbol PREREAD_ENVIRONMENT if we cannot rely on // getenv() to read environment variables at static init time. In @@ -57,7 +58,7 @@ ExecutionEnvironment() { // Access: Public, Static // Description: Returns the name of the current working directory. //////////////////////////////////////////////////////////////////// -string ExecutionEnvironment:: +Filename ExecutionEnvironment:: get_cwd() { // getcwd() requires us to allocate a dynamic buffer and grow it on // demand. @@ -79,7 +80,7 @@ get_cwd() { assert(buffer != (char *)NULL); } - return string(buffer); + return Filename::from_os_specific(buffer); } //////////////////////////////////////////////////////////////////// diff --git a/dtool/src/dtoolutil/executionEnvironment.h b/dtool/src/dtoolutil/executionEnvironment.h index f55e460948..d7ec220626 100644 --- a/dtool/src/dtoolutil/executionEnvironment.h +++ b/dtool/src/dtoolutil/executionEnvironment.h @@ -9,6 +9,7 @@ #include #include "vector_string.h" +#include "filename.h" #include @@ -33,7 +34,7 @@ public: INLINE static string get_binary_name(); - static string get_cwd(); + static Filename get_cwd(); private: bool ns_has_environment_variable(const string &var) const; diff --git a/dtool/src/dtoolutil/filename.cxx b/dtool/src/dtoolutil/filename.cxx index f344c01e61..97970c9f9b 100644 --- a/dtool/src/dtoolutil/filename.cxx +++ b/dtool/src/dtoolutil/filename.cxx @@ -14,6 +14,7 @@ #include "filename.h" #include "dSearchPath.h" +#include "executionEnvironment.h" #include // For rename() #include @@ -191,10 +192,13 @@ Filename:: Filename(const Filename &dirname, const Filename &basename) { if (dirname.empty()) { (*this) = basename; - } else if (basename.empty()) { - (*this) = dirname; } else { - (*this) = dirname.get_fullpath() + "/" + basename.get_fullpath(); + string dirpath = dirname.get_fullpath(); + if (dirpath[dirpath.length() - 1] == '/') { + (*this) = dirpath + basename.get_fullpath(); + } else { + (*this) = dirpath + "/" + basename.get_fullpath(); + } } _flags = 0; } @@ -474,6 +478,45 @@ standardize() { (*this) = result; } +//////////////////////////////////////////////////////////////////// +// Function: Filename::make_absolute +// Access: Public +// Description: Converts the filename to a fully-qualified pathname +// from the root (if it is a relative pathname), and +// then standardizes it (see standardize()). +// +// This is sometimes a little problematic, since it may +// convert the file to its 'true' absolute pathname, +// which could be an ugly NFS-named file, irrespective +// of symbolic links +// (e.g. /.automount/dimbo/root/usr2/fit/people/drose +// instead of /fit/people/drose); besides being ugly, +// filenames like this may not be consistent across +// multiple different platforms. +//////////////////////////////////////////////////////////////////// +void Filename:: +make_absolute() { + make_absolute(ExecutionEnvironment::get_cwd()); +} + +//////////////////////////////////////////////////////////////////// +// Function: Filename::make_absolute +// Access: Public +// Description: Converts the filename to a fully-qualified filename +// from the root (if it is a relative filename), and +// then standardizes it (see standardize()). This +// flavor accepts a specific starting directory that the +// filename is known to be relative to. +//////////////////////////////////////////////////////////////////// +void Filename:: +make_absolute(const Filename &start_directory) { + if (is_local()) { + (*this) = Filename(start_directory, _filename); + } + + standardize(); +} + //////////////////////////////////////////////////////////////////// // Function: Filename::to_os_specific // Access: Public @@ -485,6 +528,8 @@ standardize() { // instance). Returns the string representing the // converted filename, but does not change the Filename // itself. +// +// See also from_os_specific(). //////////////////////////////////////////////////////////////////// string Filename:: to_os_specific() const { diff --git a/dtool/src/dtoolutil/filename.h b/dtool/src/dtoolutil/filename.h index b92d9ec028..b24dd502e9 100644 --- a/dtool/src/dtoolutil/filename.h +++ b/dtool/src/dtoolutil/filename.h @@ -116,6 +116,8 @@ public: // The following functions deal with the outside world. INLINE bool is_local() const; + void make_absolute(); + void make_absolute(const Filename &start_directory); string to_os_specific() const; diff --git a/panda/src/framework/framework.cxx b/panda/src/framework/framework.cxx index 1f177d624b..f73a06b0b0 100644 --- a/panda/src/framework/framework.cxx +++ b/panda/src/framework/framework.cxx @@ -900,7 +900,7 @@ int framework_main(int argc, char *argv[]) { for (int a = 1; a < argc; a++) if ((argv[a] != (char*)0L) && ((argv[a])[0] != '-') && ((argv[a])[0] != '+') && ((argv[a])[0] != '#')) - files.push_back(argv[a]); + files.push_back(Filename::from_os_specific(argv[a])); // load display modules GraphicsPipe::resolve_modules();