quote: provide sq_dequote_to_argv_array
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>
This commit is contained in:
parent
c1189caeaf
commit
37e8161a04
23
quote.c
23
quote.c
@ -1,5 +1,6 @@
|
|||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "quote.h"
|
#include "quote.h"
|
||||||
|
#include "argv-array.h"
|
||||||
|
|
||||||
int quote_path_fully = 1;
|
int quote_path_fully = 1;
|
||||||
|
|
||||||
@ -120,7 +121,9 @@ char *sq_dequote(char *arg)
|
|||||||
return sq_dequote_step(arg, NULL);
|
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;
|
char *next = arg;
|
||||||
|
|
||||||
@ -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);
|
char *dequoted = sq_dequote_step(next, &next);
|
||||||
if (!dequoted)
|
if (!dequoted)
|
||||||
return -1;
|
return -1;
|
||||||
ALLOC_GROW(*argv, *nr + 1, *alloc);
|
if (argv) {
|
||||||
(*argv)[(*nr)++] = dequoted;
|
ALLOC_GROW(*argv, *nr + 1, *alloc);
|
||||||
|
(*argv)[(*nr)++] = dequoted;
|
||||||
|
}
|
||||||
|
if (array)
|
||||||
|
argv_array_push(array, dequoted);
|
||||||
} while (next);
|
} while (next);
|
||||||
|
|
||||||
return 0;
|
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
|
/* 1 means: quote as octal
|
||||||
* 0 means: quote as octal if (quote_path_fully)
|
* 0 means: quote as octal if (quote_path_fully)
|
||||||
* -1 means: never quote
|
* -1 means: never quote
|
||||||
|
8
quote.h
8
quote.h
@ -45,6 +45,14 @@ extern char *sq_dequote(char *);
|
|||||||
*/
|
*/
|
||||||
extern int sq_dequote_to_argv(char *arg, const char ***argv, int *nr, int *alloc);
|
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 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 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);
|
extern void quote_two_c_style(struct strbuf *, const char *, const char *, int);
|
||||||
|
Loading…
Reference in New Issue
Block a user