Commit 7803d0e1 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Move the body of cli_quote() to vsb_quote() and give it a, presently

unused, "how" argument flag.

We currently have far too many "quote this string properly" implementations
in varnish, hopefully, this will replace most of them.

Once this stabilizes, vsb_quote() will be contributed back to FreeBSD.




git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@3515 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent fd499846
......@@ -77,6 +77,7 @@ char *vsb_data(struct vsb *);
int vsb_len(struct vsb *);
int vsb_done(const struct vsb *);
void vsb_delete(struct vsb *);
void vsb_quote(struct vsb *s, const char *p, int how);
#ifdef __cplusplus
};
#endif
......
......@@ -72,48 +72,8 @@ cli_out(struct cli *cli, const char *fmt, ...)
void
cli_quote(struct cli *cli, const char *s)
{
const char *q;
int quote = 0;
for (q = s; *q != '\0'; q++) {
if (!isgraph(*q) || *q == '"') {
quote++;
break;
}
}
if (!quote) {
(void)vsb_cat(cli->sb, s);
return;
}
(void)vsb_putc(cli->sb, '"');
for (q = s; *q != '\0'; q++) {
switch (*q) {
case ' ':
(void)vsb_putc(cli->sb, *q);
break;
case '\\':
case '"':
(void)vsb_putc(cli->sb, '\\');
(void)vsb_putc(cli->sb, *q);
break;
case '\n':
(void)vsb_cat(cli->sb, "\\n");
break;
case '\r':
(void)vsb_cat(cli->sb, "\\r");
break;
case '\t':
(void)vsb_cat(cli->sb, "\\t");
break;
default:
if (isgraph(*q))
(void)vsb_putc(cli->sb, *q);
else
(void)vsb_printf(cli->sb, "\\%o", *q);
break;
}
}
(void)vsb_putc(cli->sb, '"');
vsb_quote(cli->sb, s, 0);
}
void
......
......@@ -476,3 +476,55 @@ vsb_done(const struct vsb *s)
return(VSB_ISFINISHED(s));
}
/*
* Quote a string
*/
void
vsb_quote(struct vsb *s, const char *p, int how)
{
const char *q;
int quote = 0;
(void)how; /* For future enhancements */
for (q = p; *q != '\0'; q++) {
if (!isgraph(*q) || *q == '"') {
quote++;
break;
}
}
if (!quote) {
(void)vsb_cat(s, p);
return;
}
(void)vsb_putc(s, '"');
for (q = p; *q != '\0'; q++) {
switch (*q) {
case ' ':
(void)vsb_putc(s, *q);
break;
case '\\':
case '"':
(void)vsb_putc(s, '\\');
(void)vsb_putc(s, *q);
break;
case '\n':
(void)vsb_cat(s, "\\n");
break;
case '\r':
(void)vsb_cat(s, "\\r");
break;
case '\t':
(void)vsb_cat(s, "\\t");
break;
default:
if (isgraph(*q))
(void)vsb_putc(s, *q);
else
(void)vsb_printf(s, "\\%o", *q);
break;
}
}
(void)vsb_putc(s, '"');
}
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