return lyx::support::os::internal_path(fromqstr(input));
}
+string const internal_path_list(QString const & input)
+{
+ return lyx::support::os::internal_path_list(fromqstr(input));
+}
+
}
#if defined(__CYGWIN__) || defined(__CYGWIN32__)
QPrefCygwinPathModule * cygwinmod(dialog_->cygwinpathModule);
- rc.cygwin_path_fix = cygwinmod->pathCB->isChecked();
+ rc.cygwin_path_fix = !cygwinmod->pathCB->isChecked();
#endif
QPrefLatexModule * latexmod(dialog_->latexModule);
rc.template_path = internal_path(pathsmod->templateDirED->text());
rc.backupdir_path = internal_path(pathsmod->backupDirED->text());
rc.tempdir_path = internal_path(pathsmod->tempDirED->text());
- rc.path_prefix = fromqstr(pathsmod->pathPrefixED->text());
+ rc.path_prefix = internal_path_list(pathsmod->pathPrefixED->text());
// FIXME: should be a checkbox only
rc.lyxpipes = internal_path(pathsmod->lyxserverDirED->text());
return toqstr(lyx::support::os::external_path(input));
}
+QString const external_path_list(string const & input)
+{
+ return toqstr(lyx::support::os::external_path_list(input));
+}
+
}
#if defined(__CYGWIN__) || defined(__CYGWIN32__)
QPrefCygwinPathModule * cygwinmod(dialog_->cygwinpathModule);
- cygwinmod->pathCB->setChecked(rc.cygwin_path_fix);
+ cygwinmod->pathCB->setChecked(!rc.cygwin_path_fix);
#endif
QPrefLatexModule * latexmod(dialog_->latexModule);
pathsmod->templateDirED->setText(external_path(rc.template_path));
pathsmod->backupDirED->setText(external_path(rc.backupdir_path));
pathsmod->tempDirED->setText(external_path(rc.tempdir_path));
- pathsmod->pathPrefixED->setText(toqstr(rc.path_prefix));
+ pathsmod->pathPrefixED->setText(external_path_list(rc.path_prefix));
// FIXME: should be a checkbox only
pathsmod->lyxserverDirED->setText(external_path(rc.lyxpipes));
for (; it != end; ++it) {
if (it != begin)
ss << separator;
+#if defined(__CYGWIN__) || defined(__CYGWIN32__)
+ // On cygwin, os::external_path returns either posix or
+ // pseudo-win style paths, but here we always need posix style.
+ // This fixes bug 2344.
+ ss << os::internal_path(*it);
+#else
ss << os::external_path(*it);
+#endif
}
setEnv(name, ss.str());
}
latex_path_extension extension,
latex_path_dots dots)
{
- string path = subst(original_path, "\\", "/");
// On cygwin, we may need windows or posix style paths.
- path = os::latex_path(path);
+ string path = os::latex_path(original_path);
path = subst(path, "~", "\\string~");
if (path.find(' ') != string::npos) {
// We can't use '"' because " is sometimes active (e.g. if
// babel is loaded with the "german" option)
if (extension == EXCLUDE_EXTENSION) {
- string const base = ChangeExtension(path, string());
+ // ChangeExtension calls os::internal_path internally
+ // so don't use it to remove the extension.
string const ext = GetExtension(path);
+ string const base = ext.empty() ?
+ path :
+ path.substr(0, path.length() - ext.length() - 1);
// ChangeExtension calls os::internal_path internally
// so don't use it to re-add the extension.
path = "\\string\"" + base + "\\string\"." + ext;
/// Converts a host OS style path to unix style.
std::string internal_path(std::string const & p);
+/// Converts a unix style path list to host OS style.
+std::string external_path_list(std::string const & p);
+
+/// Converts a host OS style path list to unix style.
+std::string internal_path_list(std::string const & p);
+
/**
* Converts a unix style path into a form suitable for inclusion in a LaTeX
* document.
using std::endl;
using std::string;
+using lyx::support::contains;
+
namespace lyx {
namespace support {
bool cygwin_path_fix_ = false;
-} // namespace anon
+// 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] != ':'));
+}
-string external_path(string const & p)
+// This is a test for a win32 style path with forward slashes (pseudo-windows).
+
+bool is_windows_path(string const & p)
{
- string dos_path;
+ return p.empty() ||
+ (!contains(p, '\\') && (p.length() <= 1 || p[1] == ':'));
+}
- // Translate from cygwin path syntax to dos path syntax
- if (cygwin_path_fix_ && is_absolute_path(p)) {
- char dp[PATH_MAX];
- cygwin_conv_to_full_win32_path(p.c_str(), dp);
- dos_path = !dp ? "" : dp;
+
+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;
+ }
}
- else return p;
+ return subst(p, '\\', '/');
+}
- //No backslashes in LaTeX files
- dos_path = subst(dos_path,'\\','/');
+} // namespace anon
- lyxerr[Debug::LATEX]
- << "<Cygwin path correction> ["
- << p << "]->>["
- << dos_path << ']' << endl;
- return dos_path;
+
+string external_path(string const & p)
+{
+ return convert_path(p, cygwin_path_fix_ ? PathStyle(windows)
+ : PathStyle(posix));
}
string internal_path(string const & p)
{
- char posix_path[PATH_MAX];
- posix_path[0] = '\0';
- cygwin_conv_to_posix_path(p.c_str(), posix_path);
- return posix_path;
+ 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));
}
// 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.
- return external_path(p);
+
+ if (cygwin_path_fix_ && is_absolute_path(p)) {
+ string dos_path = convert_path(p, PathStyle(windows));
+ lyxerr[Debug::LATEX]
+ << "<Cygwin path correction> ["
+ << p << "]->>["
+ << dos_path << ']' << endl;
+ return dos_path;
+ }
+
+ return convert_path(p, PathStyle(posix));
}
}
+string external_path_list(string const & p)
+{
+ return p;
+}
+
+
+string internal_path_list(string const & p)
+{
+ return p;
+}
+
+
string latex_path(string const & p)
{
return p;
}
+string external_path_list(string const & p)
+{
+ return subst(p, '/', '\\');
+}
+
+
+string internal_path_list(string const & p)
+{
+ return subst(p, '\\', '/');
+}
+
+
string latex_path(string const & p)
{
- return p;
+ return subst(p, '\\', '/');
}