summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2005-06-28 21:33:54 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2005-06-28 21:33:54 +0000
commit36468000bd33128efd958e13a014feb99118dbd1 (patch)
treef50afe4f1d7c0f81c02170cf0d12b883618fe2ad
parent83b6eea920d941c8426b8b5c3ba8715ccc6aa851 (diff)
downloadmailutils-36468000bd33128efd958e13a014feb99118dbd1.tar.gz
mailutils-36468000bd33128efd958e13a014feb99118dbd1.tar.bz2
(argcv_scan,argcv_quoted_length,argcv_quote_copy): Fixed handling of unmatched quotes.
-rw-r--r--mailbox/argcv.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/mailbox/argcv.c b/mailbox/argcv.c
index ed9fd13e3..feefd7710 100644
--- a/mailbox/argcv.c
+++ b/mailbox/argcv.c
@@ -90,6 +90,8 @@ argcv_scan (int len, const char *command, const char *delim, const char* cmnt,
else
i++; /* skip the escaped character */
}
+ if (expect_delim)
+ i--;
i--;
break;
}
@@ -177,7 +179,7 @@ argcv_quoted_length (const char *str, int *quote)
len++;
*quote = 1;
}
- else if (*str == '"')
+ else if (*str == '"' || *str == '\'')
{
len += 2;
*quote = 1;
@@ -195,21 +197,32 @@ argcv_quoted_length (const char *str, int *quote)
void
argcv_unquote_copy (char *dst, const char *src, size_t n)
{
- int i;
+ int i = 0;
int c;
- int expect_delim = 0;
-
- for (i = 0; i < n; )
+ int expect_delim = 0;
+
+ while (i < n)
{
switch (src[i])
{
case '\'':
case '"':
- ++i;
- if (expect_delim)
- expect_delim = 0;
+ if (!expect_delim)
+ {
+ char *p;
+
+ for (p = src+i+1; *p && *p != src[i]; p++)
+ if (*p == '\\')
+ p++;
+ if (*p)
+ expect_delim = src[i++];
+ else
+ *dst++ = src[i++];
+ }
+ else if (expect_delim == src[i])
+ ++i;
else
- expect_delim = src[i];
+ *dst++ = src[i++];
break;
case '\\':
@@ -274,10 +287,10 @@ argcv_quote_copy (char *dst, const char *src)
{
for (; *src; src++)
{
- if (*src == '"')
+ if (*src == '"' || *src == '\'')
{
*dst++ = '\\';
- *dst++ = '"';
+ *dst++ = *src;
}
else if (*src != '\t' && *src != '\\' && isprint(*src))
*dst++ = *src;

Return to:

Send suggestions and report system problems to the System administrator.