diff --git a/src/support/ForkedCalls.cpp b/src/support/ForkedCalls.cpp index bf8f349056..9957af2119 100644 --- a/src/support/ForkedCalls.cpp +++ b/src/support/ForkedCalls.cpp @@ -324,30 +324,43 @@ int ForkedCall::generateChild() // but do remove the quotes themselves. We do this naively by // replacing the quote with '\0' which is fine if quotes // delimit the entire word. However, if quotes do not delimit the - // entire word (i.e., open quote is inside word), leave them alone. + // entire word (i.e., open quote is inside word), simply discard + // them such as not to break the current word. char inside_quote = 0; char c_before_open_quote = ' '; vector::iterator it = vec.begin(); + vector::iterator itc = vec.begin(); vector::iterator const end = vec.end(); - for (; it != end; ++it) { + for (; it != end; ++it, ++itc) { char const c = *it; if (!inside_quote) { if (c == '\'' || c == '"') { if (c_before_open_quote == ' ') - *it = '\0'; + *itc = '\0'; + else + --itc; inside_quote = c; } else { if (c == ' ') - *it = '\0'; + *itc = '\0'; + else + *itc = c; c_before_open_quote = c; } } else if (c == inside_quote) { - if (c_before_open_quote = ' ') - *it = '\0'; + if (c_before_open_quote == ' ') + *itc = '\0'; + else + --itc; inside_quote = 0; - } + } else + *itc = c; } + // Clear what remains. + for (; itc != end; ++itc) + *itc = '\0'; + // Build an array of pointers to each word. it = vec.begin(); vector argv; diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp index 47b54b4652..2cab1aa980 100644 --- a/src/support/filetools.cpp +++ b/src/support/filetools.cpp @@ -590,8 +590,8 @@ string latexEnvCmdPrefix(string const & path) string const texinputs = getEnv("TEXINPUTS"); if (os::shell() == os::UNIX) - return "env TEXINPUTS='." + sep + texinputs_prefix - + sep + texinputs + "' "; + return "env TEXINPUTS=\"." + sep + texinputs_prefix + + sep + texinputs + "\" "; else return "cmd /d /c set TEXINPUTS=." + sep + texinputs_prefix + sep + texinputs + " & ";