Commit 85e000fa authored by Marian Durkovic's avatar Marian Durkovic

VLM quoting magic for partially quoted strings

parent a658df6d
...@@ -261,26 +261,37 @@ static const char quotes[] = "\"'"; ...@@ -261,26 +261,37 @@ static const char quotes[] = "\"'";
*/ */
static const char *FindCommandEnd (const char *psz_sent) static const char *FindCommandEnd (const char *psz_sent)
{ {
const char quote = strchr (quotes, psz_sent[0]) ? psz_sent[0] : 0; char c, quote = 0;
char c;
if (quote)
psz_sent++; // skip opening quote
while ((c = *psz_sent) != '\0') while ((c = *psz_sent) != '\0')
{ {
if ((quote == '"') && (c == '\\')) if (!quote)
{ {
psz_sent++; // move past backslash if (strchr(quotes,c)) // opening quote
quote = c;
else
if (isspace(c)) // non-escaped space
return psz_sent;
else
if( c == '\\' )
{
psz_sent++; // skip escaped character
if (*psz_sent == '\0') if (*psz_sent == '\0')
return NULL; // cannot escape "nothing" return psz_sent;
}
} }
else else
{
if (c == quote) // non-escaped matching quote if (c == quote) // non-escaped matching quote
return psz_sent + 1; quote = 0;
else else
if ((!quote) && isspace(c)) // non-escaped blank if ((quote == '"') && (c == '\\'))
return psz_sent; {
psz_sent++; // skip escaped character
if (*psz_sent == '\0')
return NULL; // error, closing quote missing
}
}
psz_sent++; psz_sent++;
} }
...@@ -301,28 +312,55 @@ static const char *FindCommandEnd (const char *psz_sent) ...@@ -301,28 +312,55 @@ static const char *FindCommandEnd (const char *psz_sent)
*/ */
static int Unescape (char *out, const char *in) static int Unescape (char *out, const char *in)
{ {
const char quote = strchr (quotes, in[0]) ? in[0] : 0; char c, quote = 0;
if (quote) while ((c = *in++) != '\0')
in++; // skips opening quote
for (;;)
{ {
char c = *in++; if (!quote)
{
if ((c == '\0') || (c == quote)) if (strchr(quotes,c)) // opening quote
break; {
quote = c;
if ((quote == '"') && (c == '\\')) continue;
}
else
if( c == '\\' )
{ {
switch (c = *in++) switch (c = *in++)
{ {
case '"': case '"':
*out++ = '"'; case '\'':
case '\\':
*out++ = c;
continue; continue;
case '\\': case '\0':
*out = '\0';
return 0;
}
if (isspace(c))
{
*out++ = c;
continue;
}
/* None of the special cases - copy the backslash */
*out++ = '\\'; *out++ = '\\';
}
}
else
{
if (c == quote) // non-escaped matching quote
{
quote = 0;
continue;
}
if ((quote == '"') && (c == '\\'))
{
switch (c = *in++)
{
case '"':
case '\\':
*out++ = c;
continue; continue;
case '\0': // should never happen case '\0': // should never happen
...@@ -332,6 +370,7 @@ static int Unescape (char *out, const char *in) ...@@ -332,6 +370,7 @@ static int Unescape (char *out, const char *in)
/* None of the special cases - copy the backslash */ /* None of the special cases - copy the backslash */
*out++ = '\\'; *out++ = '\\';
} }
}
*out++ = c; *out++ = c;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment