Skip to content

Commit

Permalink
quote: provide sq_dequote_to_argv_array
Browse files Browse the repository at this point in the history
This is similar to sq_dequote_to_argv, but more convenient
if you have an argv_array. It's tempting to just feed the
components of the argv_array to sq_dequote_to_argv instead,
but:

  1. It wouldn't maintain the NULL-termination invariant
     of argv_array.

  2. It doesn't match the memory ownership policy of
     argv_array (in which each component is free-able, not a
     pointer into a separate buffer).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
peff authored and gitster committed Sep 14, 2011
1 parent c1189ca commit 37e8161
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 3 deletions.
23 changes: 20 additions & 3 deletions quote.c
@@ -1,5 +1,6 @@
#include "cache.h"
#include "quote.h"
#include "argv-array.h"

int quote_path_fully = 1;

Expand Down Expand Up @@ -120,7 +121,9 @@ 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)
static int sq_dequote_to_argv_internal(char *arg,
const char ***argv, int *nr, int *alloc,
struct argv_array *array)
{
char *next = arg;

Expand All @@ -130,13 +133,27 @@ int sq_dequote_to_argv(char *arg, const char ***argv, int *nr, int *alloc)
char *dequoted = sq_dequote_step(next, &next);
if (!dequoted)
return -1;
ALLOC_GROW(*argv, *nr + 1, *alloc);
(*argv)[(*nr)++] = dequoted;
if (argv) {
ALLOC_GROW(*argv, *nr + 1, *alloc);
(*argv)[(*nr)++] = dequoted;
}
if (array)
argv_array_push(array, dequoted);
} while (next);

return 0;
}

int sq_dequote_to_argv(char *arg, const char ***argv, int *nr, int *alloc)
{
return sq_dequote_to_argv_internal(arg, argv, nr, alloc, NULL);
}

int sq_dequote_to_argv_array(char *arg, struct argv_array *array)
{
return sq_dequote_to_argv_internal(arg, NULL, NULL, NULL, array);
}

/* 1 means: quote as octal
* 0 means: quote as octal if (quote_path_fully)
* -1 means: never quote
Expand Down
8 changes: 8 additions & 0 deletions quote.h
Expand Up @@ -45,6 +45,14 @@ extern char *sq_dequote(char *);
*/
extern int sq_dequote_to_argv(char *arg, const char ***argv, int *nr, int *alloc);

/*
* Same as above, but store the unquoted strings in an argv_array. We will
* still modify arg in place, but unlike sq_dequote_to_argv, the argv_array
* will duplicate and take ownership of the strings.
*/
struct argv_array;
extern int sq_dequote_to_argv_array(char *arg, struct argv_array *);

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);
extern void quote_two_c_style(struct strbuf *, const char *, const char *, int);
Expand Down

0 comments on commit 37e8161

Please sign in to comment.