aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Couder <chriscool@tuxfamily.org>2009-03-29 11:44:52 +0200
committerJunio C Hamano <gitster@pobox.com>2009-03-30 01:22:53 -0700
commiteaa759b9141f125d7e55a4b08b60497845d3c52e (patch)
treea10153bea4a6ae128be98c08d55f6b5a66fbe912
parentebbc088e13e1bf0dbf8eb08b00519602c176f864 (diff)
downloadgit-eaa759b9141f125d7e55a4b08b60497845d3c52e.tar.gz
git-eaa759b9141f125d7e55a4b08b60497845d3c52e.tar.xz
quote: add "sq_dequote_to_argv" to put unwrapped args in an argv array
This new function unwraps the space separated shell quoted elements in its first argument and places them in the argv array passed as its second argument. Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--quote.c17
-rw-r--r--quote.h1
2 files changed, 18 insertions, 0 deletions
diff --git a/quote.c b/quote.c
index ea49c7a99..7a49fcf69 100644
--- a/quote.c
+++ b/quote.c
@@ -120,6 +120,23 @@ char *sq_dequote(char *arg)
return sq_dequote_step(arg, NULL);
}
+int sq_dequote_to_argv(char *arg, const char ***argv, int *nr, int *alloc)
+{
+ char *next = arg;
+
+ if (!*arg)
+ return 0;
+ do {
+ char *dequoted = sq_dequote_step(next, &next);
+ if (!dequoted)
+ return -1;
+ ALLOC_GROW(*argv, *nr + 1, *alloc);
+ (*argv)[(*nr)++] = dequoted;
+ } while (next);
+
+ return 0;
+}
+
/* 1 means: quote as octal
* 0 means: quote as octal if (quote_path_fully)
* -1 means: never quote
diff --git a/quote.h b/quote.h
index 2315105fa..66730f2bf 100644
--- a/quote.h
+++ b/quote.h
@@ -46,6 +46,7 @@ extern char *sq_dequote(char *);
* is no more argument to be dequoted, "next" is updated to point to NULL.
*/
extern char *sq_dequote_step(char *arg, char **next);
+extern int sq_dequote_to_argv(char *arg, const char ***argv, int *nr, int *alloc);
extern int unquote_c_style(struct strbuf *, const char *quoted, const char **endp);
extern size_t quote_c_style(const char *name, struct strbuf *, FILE *, int no_dq);