diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-06-05 07:21:20 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-06-05 07:21:20 +0000 |
commit | 3a7b4c03636858e9b8b84a8771252006dcc53881 (patch) | |
tree | 04e81875714aa605cfce739214bcbd8506fb94ac /win32/win32.c | |
parent | 82c551e974b58489f82268bda749939dc40b0c65 (diff) |
merge revision(s) 13602:
* win32/win32.c (make_cmdvector): adjust escaped successive
double-quote handling. (merge from trunk)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@16838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32/win32.c')
-rw-r--r-- | win32/win32.c | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/win32/win32.c b/win32/win32.c index aa46011e8a..3c16e57df1 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -1291,10 +1291,13 @@ rb_w32_cmdvector(const char *cmd, char ***vec) if (!(slashes & 1)) { if (!quote) quote = *ptr; - else if (quote == *ptr) + else if (quote == *ptr) { + if (quote == '"' && quote == ptr[1]) + ptr++; quote = '\0'; - escape++; + } } + escape++; slashes = 0; break; @@ -1321,10 +1324,10 @@ rb_w32_cmdvector(const char *cmd, char ***vec) // if (escape) { - char *p = base; + char *p = base, c; slashes = quote = 0; while (p < base + len) { - switch (*p) { + switch (c = *p) { case '\\': p++; if (quote != '\'') slashes++; @@ -1332,33 +1335,27 @@ rb_w32_cmdvector(const char *cmd, char ***vec) case '\'': case '"': + if (!(slashes & 1) && quote && quote != c) { + p++; + slashes = 0; + break; + } + memcpy(p - ((slashes + 1) >> 1), p + (~slashes & 1), + base + len - p); + len -= ((slashes + 1) >> 1) + (~slashes & 1); + p -= (slashes + 1) >> 1; if (!(slashes & 1)) { - if (!quote) - quote = *p; - else if (quote == *p) + if (quote) { + if (quote == '"' && quote == *p) + p++; quote = '\0'; - else { - p++; - slashes = 0; - break; } + else + quote = c; } - if (base + slashes == p) { - base += slashes >> 1; - len -= slashes >> 1; - slashes &= 1; - } - if (base == p) { - base = ++p; - --len; - } - else { - memcpy(p - ((slashes + 1) >> 1), p + (~slashes & 1), base + len - p); - slashes >>= 1; - p -= slashes; - len -= slashes + 1; - slashes = 0; - } + else + p++; + slashes = 0; break; default: |