summaryrefslogtreecommitdiff
path: root/win32/win32.c
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-05 07:21:20 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-06-05 07:21:20 +0000
commit3a7b4c03636858e9b8b84a8771252006dcc53881 (patch)
tree04e81875714aa605cfce739214bcbd8506fb94ac /win32/win32.c
parent82c551e974b58489f82268bda749939dc40b0c65 (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.c51
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: