]> git.lyx.org Git - lyx.git/blobdiff - src/support/filetools.cpp
CMake: fix merged build, seems GCC could not handle the namespaces correctly
[lyx.git] / src / support / filetools.cpp
index cd098031740ad48131d0a5fa132538c602b7777a..48ba7ef785ba00463e1df7126883a0fac3abf780 100644 (file)
@@ -23,7 +23,6 @@
 
 #include "support/filetools.h"
 
-#include "support/convert.h"
 #include "support/debug.h"
 #include "support/environment.h"
 #include "support/gettext.h"
@@ -51,6 +50,8 @@
 
 using namespace std;
 
+#define USE_QPROCESS
+
 namespace lyx {
 namespace support {
 
@@ -129,16 +130,27 @@ string const quoteName(string const & name, quote_style style)
 {
        switch(style) {
        case quote_shell:
-               // This does not work for filenames containing " (windows)
-               // or ' (all other OSes). This can't be changed easily, since
-               // we would need to adapt the command line parser in
-               // Forkedcall::generateChild. Therefore we don't pass user
-               // filenames to child processes if possible. We store them in
-               // a python script instead, where we don't have these
-               // limitations.
+               // This does not work on native Windows for filenames
+               // containing the following characters < > : " / \ | ? *
+               // Moreover, it can't be made to work, as, according to
+               // http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx
+               // those are reserved characters, and thus are forbidden.
+               // Please, also note that the command-line parser in
+               // ForkedCall::generateChild cannot deal with filenames
+               // containing " or ', therefore we don't pass user filenames
+               // to child processes if possible. We store them in a python
+               // script instead, where we don't have these limitations.
+#ifndef USE_QPROCESS
                return (os::shell() == os::UNIX) ?
-                       '\'' + name + '\'':
+                       '\'' + subst(name, "'", "\'\\\'\'") + '\'' :
                        '"' + name + '"';
+#else
+               // According to the QProcess parser, a single double
+               // quote is represented by three consecutive ones.
+               // Here we simply escape the double quote and let our
+               // simple parser in Systemcall.cpp do the substitution.
+               return '"' + subst(name, "\"", "\\\"") + '"';
+#endif
        case quote_python:
                return "\"" + subst(subst(name, "\\", "\\\\"), "\"", "\\\"")
                     + "\"";
@@ -523,16 +535,23 @@ string const replaceEnvironmentPath(string const & path)
        static boost::regex envvar_br_re("(.*)" + envvar_br + "(.*)");
        static boost::regex envvar_re("(.*)" + envvar + "(.*)");
        boost::smatch what;
-
-       string result = path;
+       string result;
+       string remaining = path;
        while (1) {
-               regex_match(result, what, envvar_br_re);
+               regex_match(remaining, what, envvar_br_re);
                if (!what[0].matched) {
-                       regex_match(result, what, envvar_re);
-                       if (!what[0].matched)
+                       regex_match(remaining, what, envvar_re);
+                       if (!what[0].matched) {
+                               result += remaining;
                                break;
+                       }
                }
-               result = what.str(1) + getEnv(what.str(2)) + what.str(3);
+               string env_var = getEnv(what.str(2));
+               if (!env_var.empty())
+                       result += what.str(1) + env_var;
+               else
+                       result += what.str(1) + "$" + what.str(2);
+               remaining = what.str(3);
        }
        return result;
 }