X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fquotearg.c;h=06f5fea843f5bd46fd68656a648ee60a67488269;hb=6e93b42a69e7a51b301e7ab383022dd4f59c2081;hp=124f74274ee6241a0376a53c18bcd921b53a9c30;hpb=3c3d25cda666d07b6b0d3c3f998e3e652d79cf2d;p=gnulib.git diff --git a/lib/quotearg.c b/lib/quotearg.c index 124f74274..06f5fea84 100644 --- a/lib/quotearg.c +++ b/lib/quotearg.c @@ -17,6 +17,8 @@ /* Written by Paul Eggert */ +/* FIXME: Multibyte characters are not supported yet. */ + #if HAVE_CONFIG_H # include #endif @@ -37,6 +39,13 @@ # define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) #endif +#if ENABLE_NLS +# include +# define _(text) gettext (text) +#else +# define _(text) text +#endif + #if HAVE_LIMITS_H # include #endif @@ -76,6 +85,7 @@ char const *const quoting_style_args[] = "shell-always", "c", "escape", + "locale", 0 }; @@ -86,7 +96,8 @@ enum quoting_style const quoting_style_vals[] = shell_quoting_style, shell_always_quoting_style, c_quoting_style, - escape_quoting_style + escape_quoting_style, + locale_quoting_style }; /* The default quoting options. */ @@ -150,8 +161,9 @@ quotearg_buffer (char *buffer, size_t buffersize, { unsigned char c; size_t i; - size_t len; - int quote_mark; + size_t len = 0; + char const *quote_string; + size_t quote_string_len; struct quoting_options const *p = o ? o : &default_quoting_options; enum quoting_style quoting_style = p->style; #define STORE(c) \ @@ -174,7 +186,6 @@ quotearg_buffer (char *buffer, size_t buffersize, break; default: - len = 0; for (i = 0; ; i++) { if (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize) @@ -199,31 +210,39 @@ quotearg_buffer (char *buffer, size_t buffersize, STORE (c); } - needs_quoting:; + + len = 0; break; } } /* Fall through. */ case shell_always_quoting_style: - quote_mark = '\''; + STORE ('\''); + quote_string = "'"; + quote_string_len = 1; break; case c_quoting_style: - quote_mark = '"'; + STORE ('"'); + quote_string = "\""; + quote_string_len = 1; + break; + + case locale_quoting_style: + for (quote_string = _("`"); *quote_string; quote_string++) + STORE (*quote_string); + quote_string = _("'"); + quote_string_len = strlen (quote_string); break; default: - quote_mark = 0; + quote_string = 0; + quote_string_len = 0; break; } - len = 0; - - if (quote_mark) - STORE (quote_mark); - for (i = 0; ! (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize); i++) { c = arg[i]; @@ -245,6 +264,7 @@ quotearg_buffer (char *buffer, size_t buffersize, case c_quoting_style: case escape_quoting_style: + case locale_quoting_style: switch (c) { case '?': /* Do not generate trigraphs. */ @@ -258,16 +278,12 @@ quotearg_buffer (char *buffer, size_t buffersize, case '\t': c = 't'; goto store_escape; case '\v': c = 'v'; goto store_escape; - case '"': - if (quoting_style == c_quoting_style) - goto store_escape; - break; + case ' ': break; - case ' ': - if (quoting_style == c_quoting_style) - goto store_c; - /* Fall through. */ default: + if (quote_string_len + && strncmp (arg + i, quote_string, quote_string_len) == 0) + goto store_escape; if (!ISGRAPH (c)) { STORE ('\\'); @@ -290,8 +306,9 @@ quotearg_buffer (char *buffer, size_t buffersize, STORE (c); } - if (quote_mark) - STORE (quote_mark); + if (quote_string) + for (; *quote_string; quote_string++) + STORE (*quote_string); done: if (len < buffersize) @@ -356,6 +373,21 @@ quotearg (char const *arg) } char * +quotearg_n_style (unsigned int n, enum quoting_style s, char const *arg) +{ + struct quoting_options o; + o.style = s; + memset (o.quote_these_too, 0, sizeof o.quote_these_too); + return quotearg_n_options (n, arg, &o); +} + +char * +quotearg_style (enum quoting_style s, char const *arg) +{ + return quotearg_n_style (0, s, arg); +} + +char * quotearg_char (char const *arg, char ch) { struct quoting_options options;