Commit f6fe750d authored by Joel E. Denny's avatar Joel E. Denny
Browse files

quotearg: fix right quote escaping when it's in quote_these_too

* lib/quotearg.c (quotearg_buffer_restyled): Upon seeing a right
quote, be sure to prepend only one backslash.
* tests/test-quotearg.c (use_quote_double_quotes): New function.
(main): Test it.
parent 3293597e
2009-08-22 Joel E. Denny <jdenny@clemson.edu>
quotearg: fix right quote escaping when it's in quote_these_too
* lib/quotearg.c (quotearg_buffer_restyled): Upon seeing a right
quote, be sure to prepend only one backslash.
* tests/test-quotearg.c (use_quote_double_quotes): New function.
(main): Test it.
2009-08-22 Joel E. Denny <jdenny@clemson.edu>
 
quotearg-tests: test escaping of embedded locale quotes
......@@ -280,6 +280,7 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
{
unsigned char c;
unsigned char esc;
bool is_right_quote = false;
if (backslash_escapes
&& quote_string_len
......@@ -288,7 +289,7 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
{
if (elide_outer_quotes)
goto force_outer_quoting_style;
STORE ('\\');
is_right_quote = true;
}
c = arg[i];
......@@ -521,6 +522,11 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
STORE ('0' + ((c >> 3) & 7));
c = '0' + (c & 7);
}
else if (is_right_quote)
{
STORE ('\\');
is_right_quote = false;
}
if (ilim <= i + 1)
break;
STORE (c);
......@@ -534,7 +540,8 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
if (! ((backslash_escapes || elide_outer_quotes)
&& quote_these_too
&& quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
&& quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
&& !is_right_quote)
goto store_c;
store_escape:
......
......@@ -263,6 +263,15 @@ use_quotearg (const char *str, size_t *len)
return p;
}
static char *
use_quote_double_quotes (const char *str, size_t *len)
{
char *p = *len == SIZE_MAX ? quotearg_char (str, '"')
: quotearg_char_mem (str, *len, '"');
*len = strlen (p);
return p;
}
static char *
use_quotearg_colon (const char *str, size_t *len)
{
......@@ -287,6 +296,8 @@ main (int argc, char *argv[])
set_quoting_style (NULL, i);
compare_strings (use_quotearg_buffer, &results_g[i].group1);
compare_strings (use_quotearg, &results_g[i].group2);
if (i == c_quoting_style)
compare_strings (use_quote_double_quotes, &results_g[i].group2);
compare_strings (use_quotearg_colon, &results_g[i].group3);
}
......@@ -301,12 +312,14 @@ main (int argc, char *argv[])
== QA_ELIDE_NULL_BYTES);
compare_strings (use_quotearg_buffer, &flag_results[1].group1);
compare_strings (use_quotearg, &flag_results[1].group2);
compare_strings (use_quote_double_quotes, &flag_results[1].group2);
compare_strings (use_quotearg_colon, &flag_results[1].group3);
ASSERT (set_quoting_flags (NULL, QA_SPLIT_TRIGRAPHS)
== QA_ELIDE_OUTER_QUOTES);
compare_strings (use_quotearg_buffer, &flag_results[2].group1);
compare_strings (use_quotearg, &flag_results[2].group2);
compare_strings (use_quote_double_quotes, &flag_results[2].group2);
compare_strings (use_quotearg_colon, &flag_results[2].group3);
ASSERT (set_quoting_flags (NULL, 0) == QA_SPLIT_TRIGRAPHS);
......
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