/** * \file os_cygwin.C * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * * \author Ruurd A. Reitsma * \author Claus Hentschel * \author Angus Leeming * * Full author contact details are available in file CREDITS. * * Various OS specific functions */ #include #include "support/os.h" #include "support/lstrings.h" #include "debug.h" #include #include #include using std::endl; using std::string; using lyx::support::contains; namespace lyx { namespace support { namespace os { void os::init(int, char *[]) {} string current_root() { return string("/"); } string::size_type common_path(string const & p1, string const & p2) { string::size_type i = 0; string::size_type p1_len = p1.length(); string::size_type p2_len = p2.length(); while (i < p1_len && i < p2_len && uppercase(p1[i]) == uppercase(p2[i])) ++i; if ((i < p1_len && i < p2_len) || (i < p1_len && p1[i] != '/' && i == p2_len) || (i < p2_len && p2[i] != '/' && i == p1_len)) { if (i) --i; // here was the last match while (i && p1[i] != '/') --i; } return i; } namespace { bool cygwin_path_fix_ = false; // In both is_posix_path() and is_windows_path() it is assumed that // a valid posix or pseudo-windows path is passed. They simply tell // whether the path looks posix/pseudo-windows or not. bool is_posix_path(string const & p) { return p.empty() || (!contains(p, '\\') && (p.length() <= 1 || p[1] != ':')); } // This is a test for a win32 style path with forward slashes (pseudo-windows). bool is_windows_path(string const & p) { return p.empty() || (!contains(p, '\\') && (p.length() <= 1 || p[1] == ':')); } enum PathStyle { posix, windows }; string convert_path(string const & p, PathStyle const & target) { char path_buf[PATH_MAX]; if ((target == posix && is_posix_path(p)) || (target == windows && is_windows_path(p))) return p; path_buf[0] = '\0'; if (target == posix) cygwin_conv_to_posix_path(p.c_str(), path_buf); else cygwin_conv_to_win32_path(p.c_str(), path_buf); return subst(path_buf[0] ? path_buf : p, '\\', '/'); } string convert_path_list(string const & p, PathStyle const & target) { char const * const pc = p.c_str(); PathStyle const actual = cygwin_posix_path_list_p(pc) ? posix : windows; if (target != actual) { int const target_size = (target == posix) ? cygwin_win32_to_posix_path_list_buf_size(pc) : cygwin_posix_to_win32_path_list_buf_size(pc); char * ptr = new char[target_size]; if (ptr) { if (target == posix) cygwin_win32_to_posix_path_list(pc, ptr); else cygwin_posix_to_win32_path_list(pc, ptr); string path_list = subst(ptr, '\\', '/'); delete ptr; return path_list; } } return subst(p, '\\', '/'); } } // namespace anon string external_path(string const & p) { return convert_path(p, cygwin_path_fix_ ? PathStyle(windows) : PathStyle(posix)); } string internal_path(string const & p) { return convert_path(p, PathStyle(posix)); } string external_path_list(string const & p) { return convert_path_list(p, cygwin_path_fix_ ? PathStyle(windows) : PathStyle(posix)); } string internal_path_list(string const & p) { return convert_path_list(p, PathStyle(posix)); } string latex_path(string const & p) { // We may need a posix style path or a windows style path (depending // on cygwin_path_fix_), but we use always forward slashes, since it // gets written into a .tex file. if (cygwin_path_fix_ && is_absolute_path(p)) { string dos_path = convert_path(p, PathStyle(windows)); lyxerr[Debug::LATEX] << " [" << p << "]->>[" << dos_path << ']' << endl; return dos_path; } return convert_path(p, PathStyle(posix)); } bool is_absolute_path(string const & p) { if (p.empty()) return false; bool isDosPath = (p.length() > 1 && p[1] == ':'); bool isUnixPath = (p[0] == '/'); return isDosPath || isUnixPath; } // returns a string suitable to be passed to popen when // reading a pipe char const * popen_read_mode() { return "r"; } string const & nulldev() { static string const nulldev_ = "/dev/null"; return nulldev_; } shell_type shell() { return UNIX; } char path_separator() { return ':'; } void cygwin_path_fix(bool use_cygwin_paths) { cygwin_path_fix_ = use_cygwin_paths; } } // namespace os } // namespace support } // namespace lyx