Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
Enhanced sq_quote()
author
H. Peter Anvin
<hpa@zytor.com>
Mon, 10 Oct 2005 21:46:10 +0000
(14:46 -0700)
committer
Junio C Hamano
<junkio@cox.net>
Mon, 10 Oct 2005 21:46:10 +0000
(14:46 -0700)
Create function to sq_quote into a buffer
Handle !'s for csh-based shells
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
quote.c
patch
|
blob
|
history
quote.h
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (from parent 1:
4769948
)
diff --git
a/quote.c
b/quote.c
index 5e6fda311c5f5fdaa20b7e9d64e46c13b7d9cce8..9d5d0bcb0f0e32b95e27d32efe6d725479d28f76 100644
(file)
--- a/
quote.c
+++ b/
quote.c
@@
-2,40
+2,52
@@
#include "quote.h"
/* Help to copy the thing properly quoted for the shell safety.
#include "quote.h"
/* Help to copy the thing properly quoted for the shell safety.
- * any single quote is replaced with '\'', an
d the caller is
- *
expected to enclose the result within a single quote pair.
+ * any single quote is replaced with '\'', an
y 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'
*
* 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'
*/
*/
-char *sq_quote(const char *src)
-{
- static char *buf = NULL;
- int cnt, c;
- const char *cp;
- char *bp;
+#define EMIT(x) ( (++len < n) && (*bp++ = (x)) )
- /* count bytes needed to store the quoted string. */
- for (cnt = 3, cp = src; *cp; cnt++, cp++)
- if (*cp == '\'')
- cnt += 3;
+size_t sq_quote_buf(char *dst, size_t n, const char *src)
+{
+ char c;
+ char *bp = dst;
+ size_t len = 0;
- buf = xmalloc(cnt);
- bp = buf;
- *bp++ = '\'';
+ EMIT('\'');
while ((c = *src++)) {
while ((c = *src++)) {
- if (c != '\'')
- *bp++ = c;
- else {
- bp = strcpy(bp, "'\\''");
- bp += 4;
+ if (c == '\'' || c == '!') {
+ EMIT('\'');
+ EMIT('\\');
+ EMIT(c);
+ EMIT('\'');
+ } else {
+ EMIT(c);
}
}
}
}
- *bp++ = '\'';
- *bp = 0;
+ 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;
}
return buf;
}
diff --git
a/quote.h
b/quote.h
index c8cfb3a12482b0a2398d7d9e164c37e5473b44b8..50ce1df976671b5e9fac83368ae5ea28211a432a 100644
(file)
--- a/
quote.h
+++ b/
quote.h
@@
-1,10
+1,12
@@
#ifndef QUOTE_H
#define QUOTE_H
#ifndef QUOTE_H
#define QUOTE_H
+#include <stddef.h>
/* Help to copy the thing properly quoted for the shell safety.
/* Help to copy the thing properly quoted for the shell safety.
- * any single quote is replaced with '\'', and the whole thing
- * is enclosed in a single quote pair.
+ * any single quote is replaced with '\'', any exclamation point
+ * is replaced with '\!', and the whole thing is enclosed in a
+ * single quote pair.
*
* For example, if you are passing the result to system() as an
* argument:
*
* For example, if you are passing the result to system() as an
* argument:
@@
-19,8
+21,13
@@
*
* Note that the above examples leak memory! Remember to free result from
* sq_quote() in a real application.
*
* Note that the above examples leak memory! Remember to free result from
* sq_quote() in a real application.
+ *
+ * sq_quote_buf() writes to an existing buffer of specified size; it
+ * will return the number of characters that would have been written
+ * excluding the final null regardless of the buffer size.
*/
char *sq_quote(const char *src);
*/
char *sq_quote(const char *src);
+size_t sq_quote_buf(char *dst, size_t n, const char *src);
#endif
#endif