blob: 9d5d0bcb0f0e32b95e27d32efe6d725479d28f76 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include "cache.h"
#include "quote.h"
/* Help to copy the thing properly quoted for the shell safety.
* any single quote is replaced with '\'', any exclamation point
* is replaced with '\!', and the whole thing is enclosed in a
*
* E.g.
* original sq_quote result
* name ==> name ==> 'name'
* a b ==> a b ==> 'a b'
* a'b ==> a'\''b ==> 'a'\''b'
* a!b ==> a'\!'b ==> 'a'\!'b'
*/
#define EMIT(x) ( (++len < n) && (*bp++ = (x)) )
size_t sq_quote_buf(char *dst, size_t n, const char *src)
{
char c;
char *bp = dst;
size_t len = 0;
EMIT('\'');
while ((c = *src++)) {
if (c == '\'' || c == '!') {
EMIT('\'');
EMIT('\\');
EMIT(c);
EMIT('\'');
} else {
EMIT(c);
}
}
EMIT('\'');
if ( n )
*bp = 0;
return len;
}
char *sq_quote(const char *src)
{
char *buf;
size_t cnt;
cnt = sq_quote_buf(NULL, 0, src) + 1;
buf = xmalloc(cnt);
sq_quote_buf(buf, cnt, src);
return buf;
}
|