diff --git a/src/ChangeLog b/src/ChangeLog index 254b911dda..602d9ff563 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,4 +1,13 @@ - 2004-12-14 Angus Leeming +2004-12-19 Angus Leeming + + * lyx_main.C (init): on a Windows build, remove the ".exe" + extension from the name of the LyX binary when trying to + ascertain the name of the LyX system directory. + (Usually, /../share//). + + * buffer.C (save): s/slashify_path/internal_path/. + +2004-12-14 Angus Leeming * LaTeX.C: (operator()): use os::nulldev() rather than "/dev/null". diff --git a/src/buffer.C b/src/buffer.C index d77b5c2485..3a107fc0ee 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -1286,7 +1286,7 @@ bool Buffer::save() const s = fileName() + '~'; if (!lyxrc.backupdir_path.empty()) s = AddName(lyxrc.backupdir_path, - subst(os::slashify_path(s),'/','!')); + subst(os::internal_path(s),'/','!')); // Rename is the wrong way of making a backup, // this is the correct way. diff --git a/src/lyx_main.C b/src/lyx_main.C index 5e239ae64a..7a6434c29a 100644 --- a/src/lyx_main.C +++ b/src/lyx_main.C @@ -288,8 +288,18 @@ void LyX::init(bool gui) bool followlink; do { // Path of binary/../share/name of binary/ - searchpath += NormalizePath(AddPath(binpath, "../share/") + - OnlyFilename(binname)) + ';'; + string const exe_name = OnlyFilename(binname); +#ifdef _WIN32 + string const lyx_system_dir_name = + suffixIs(exe_name, ".exe") ? + ChangeExtension(exe_name, "") : + exe_name; +#else + string const lyx_system_dir_name = exe_name; +#endif + string const shared_dir_name = + NormalizePath(AddPath(binpath, "../share/")); + searchpath += shared_dir_name + lyx_system_dir_name + ';'; // Follow Symlinks FileInfo file(fullbinpath, true); diff --git a/src/support/ChangeLog b/src/support/ChangeLog index d3bc8207a2..372617fa3d 100644 --- a/src/support/ChangeLog +++ b/src/support/ChangeLog @@ -1,3 +1,17 @@ +2004-12-19 Angus Leeming + + * os.h, os_os2.C, os_unix.C, os_win32.C (slashify_path): remove. + + * os_win32.C (init): ensure that the name of the lyx executable is + stored internally with a unix-style path. + + * os_win32.C (internal_path, external_path): differentiate between + cygwin and windows builds. + + * filetools.C (FileOpenSearch, GetEnvPath, createDirectory, + MakeAbsPath, AddName, MakeRelPath, ChangeExtension): + s/slashify_path/internal_path/. + 2004-12-16 Angus Leeming * mkdir.C: move the HAVE_MKDIR conditional code out of config.h diff --git a/src/support/filetools.C b/src/support/filetools.C index 5f5b62d638..bc98d155e5 100644 --- a/src/support/filetools.C +++ b/src/support/filetools.C @@ -177,7 +177,7 @@ string const FileOpenSearch(string const & path, string const & name, string tmppath = split(path, path_element, ';'); while (notfound && !path_element.empty()) { - path_element = os::slashify_path(path_element); + path_element = os::internal_path(path_element); if (!suffixIs(path_element, '/')) path_element+= '/'; path_element = subst(path_element, "$$LyX", system_lyxdir); @@ -369,7 +369,7 @@ string const GetEnvPath(string const & name) #ifndef __EMX__ string const pathlist = subst(GetEnv(name), ':', ';'); #else - string const pathlist = os::slashify_path(GetEnv(name)); + string const pathlist = os::internal_path(GetEnv(name)); #endif return rtrim(pathlist, ";"); } @@ -573,7 +573,7 @@ int DestroyLyXTmpDir(string const & tmpdir) // Creates directory. Returns true if succesfull bool createDirectory(string const & path, int permission) { - string temp(rtrim(os::slashify_path(path), "/")); + string temp(rtrim(os::internal_path(path), "/")); if (temp.empty()) { Alert::alert(_("Internal error!"), @@ -613,7 +613,7 @@ string const MakeAbsPath(string const & RelPath, string const & BasePath) return RelPath; // Copies given paths - string TempRel(os::slashify_path(RelPath)); + string TempRel(os::internal_path(RelPath)); // Since TempRel is NOT absolute, we can safely replace "//" with "/" TempRel = subst(TempRel, "//", "/"); @@ -664,7 +664,7 @@ string const MakeAbsPath(string const & RelPath, string const & BasePath) } // returns absolute path - return os::slashify_path(TempBase); + return os::internal_path(TempBase); } @@ -679,7 +679,7 @@ string const AddName(string const & path, string const & fname) string buf; if (path != "." && path != "./" && !path.empty()) { - buf = os::slashify_path(path); + buf = os::internal_path(path); if (!suffixIs(path, '/')) buf += '/'; } @@ -939,10 +939,10 @@ string const MakeRelPath(string const & abspath, string const & basepath) string const AddPath(string const & path, string const & path_2) { string buf; - string const path2 = os::slashify_path(path_2); + string const path2 = os::internal_path(path_2); if (!path.empty() && path != "." && path != "./") { - buf = os::slashify_path(path); + buf = os::internal_path(path); if (path[path.length() - 1] != '/') buf += '/'; } @@ -976,7 +976,7 @@ string const ChangeExtension(string const & oldname, string const & extension) else ext = extension; - return os::slashify_path(oldname.substr(0, last_dot) + ext); + return os::internal_path(oldname.substr(0, last_dot) + ext); } diff --git a/src/support/os.h b/src/support/os.h index a07f092922..19b2622788 100644 --- a/src/support/os.h +++ b/src/support/os.h @@ -43,8 +43,6 @@ public: static string::size_type common_path(string const &p1, string const &p2); - // no-op on UNIX, '\\'->'/' on OS/2 and Win32, ':'->'/' on MacOS, etc. - static string slashify_path(string p); // Converts a unix style path to host OS style. static string external_path(string const &p); // Converts a host OS style path to unix style. diff --git a/src/support/os_os2.C b/src/support/os_os2.C index 176cdf616a..08d72a3fe6 100644 --- a/src/support/os_os2.C +++ b/src/support/os_os2.C @@ -34,7 +34,7 @@ void os::init(int argc, char * argv[]) if (rc != NO_ERROR) exit(rc); string p(tmp); - p = slashify_path(p); + p = internal_path(p); binname_ = OnlyFilename(p); binname_.erase(binname_.length()-4, string::npos); binpath_ = OnlyPath(p); @@ -96,8 +96,8 @@ string::size_type os::common_path(string const &p1, string const &p2) { COUNTRYCODE cntry; cntry.country = 0; cntry.codepage = cp_; - string temp1 = slashify_path(p1); - string temp2 = slashify_path(p2); + string temp1 = internal_path(p1); + string temp2 = internal_path(p2); char * tmp1 = const_cast (temp1.c_str()); char * tmp2 = const_cast (temp2.c_str()); /* rc = */ DosMapCase(p1.length(), &cntry, tmp1); @@ -120,7 +120,7 @@ string::size_type os::common_path(string const &p1, string const &p2) { return i; } -string os::slashify_path(string p) { +string os::internal_path(string const & p) { static bool initialized = false; static bool leadbyte[256] = {false}; if (!initialized) { @@ -158,12 +158,7 @@ string os::slashify_path(string p) { } -string os::external_path(string const &p) { - return p; -} - - -string os::internal_path(string const &p) { +string os::external_path(string const & p) { return p; } diff --git a/src/support/os_unix.C b/src/support/os_unix.C index ca2e7d3541..02757899b1 100644 --- a/src/support/os_unix.C +++ b/src/support/os_unix.C @@ -67,15 +67,11 @@ string::size_type os::common_path(string const &p1, string const &p2) { return i; } -string os::slashify_path(string p) { +string os::internal_path(string const & p) { return p; } -string os::external_path(string const &p) { - return p; -} - -string os::internal_path(string const &p) { +string os::external_path(string const & p) { return p; } diff --git a/src/support/os_win32.C b/src/support/os_win32.C index eab3b082e2..d2f84b6356 100644 --- a/src/support/os_win32.C +++ b/src/support/os_win32.C @@ -34,11 +34,12 @@ unsigned long os::cp_ = 0; using std::endl; -void os::init(int /* argc */, char * argv[]) { +void os::init(int /* argc */, char * argv[]) +{ static bool initialized = false; if (initialized) return; initialized = true; - string tmp = argv[0]; + string tmp = internal_path(argv[0]); binname_ = OnlyFilename(tmp); tmp = ExpandPath(tmp); // This expands ./ and ~/ @@ -46,7 +47,7 @@ void os::init(int /* argc */, char * argv[]) { string binsearchpath = GetEnvPath("PATH"); // This will make "src/lyx" work always :-) binsearchpath += ";."; - tmp = argv[0]; + tmp = internal_path(argv[0]); tmp = FileOpenSearch(binsearchpath, tmp); } @@ -94,17 +95,26 @@ string::size_type os::common_path(string const &p1, string const &p2) { return i; } -string os::slashify_path(string p) { - return subst(p, '\\', '/'); -} +string os::external_path(string const & p) +{ + string dos_path; -string os::external_path(string const & p) { - string dos_path=p; +#ifdef __CYGWIN__ + // Translate from cygwin path syntax to dos path syntax if (is_absolute_path(p)) { - char dp[255]; + char dp[MAX_PATH]; cygwin_conv_to_full_win32_path(p.c_str(), dp); - dos_path=subst(dp,'\\','/'); + dos_path = !dp ? "" : dp; } + + else return p; +#else // regular Win32 + dos_path = p; +#endif + + //No backslashes in LaTeX files + dos_path = subst(dos_path,'\\','/'); + lyxerr[Debug::LATEX] << " [" << p << "]->>[" @@ -117,10 +127,15 @@ string os::external_path(string const & p) { // files are mentioned in Win32/DOS syntax. Because LyX uses the dep file // entries to check if any file has been changed we must retranslate // the Win32/DOS pathnames into Cygwin pathnames. -string os::internal_path(string const &p) { - char pp[256]; +string os::internal_path(string const & p) +{ +#ifdef __CYGWIN__ + char pp[MAX_PATH]; cygwin_conv_to_posix_path(p.c_str(), pp); string const posix_path = MakeLatexName(pp); +#else + string const posix_path = subst(p,"\\","/"); +#endif lyxerr[Debug::DEPEND] << " [" << p << "]->>["