From 889e0f5c36c8bf927e537d42dd37f5786c1c4fc3 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Fri, 14 Dec 2018 11:41:16 +0100 Subject: [PATCH] Fix bug #9622 The backslash is the escape character used in our parser. Hence, when used as a path separator on Windows, it has to be itself escaped or the path enclosed in either double or single quotes. Windows users are maybe trained to quote paths containing spaces but not paths with backslashes. So, we automatically escape the backslashes when they are not already enclosed in quotes. --- src/Format.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/Format.cpp b/src/Format.cpp index ab09d4a6de..a6727a2d81 100644 --- a/src/Format.cpp +++ b/src/Format.cpp @@ -682,6 +682,28 @@ bool Formats::view(Buffer const & buffer, FileName const & filename, string command = format->viewer(); + // Escape backslashes if not already in double or single quotes. + // We cannot simply quote the whole command as there may be arguments. + if (contains(command, '\\')) { + bool inquote1 = false; + bool inquote2 = false; + string::iterator cit = command.begin(); + for (; cit != command.end(); ++cit) { + switch (*cit) { + case '"': + inquote1 = !inquote1; + break; + case '\'': + inquote2 = !inquote2; + break; + case '\\': + if (!inquote1 && !inquote2) + cit = ++command.insert(cit, '\\'); + break; + } + } + } + if (format_name == "dvi" && !lyxrc.view_dvi_paper_option.empty()) { string paper_size = buffer.params().paperSizeName(BufferParams::XDVI); -- 2.39.5