Skip to content

Commit

Permalink
argv-array: add pop function
Browse files Browse the repository at this point in the history
Sometimes we build a set of similar command lines, differing
only in the final arguments (e.g., "fetch --multiple"). To
use argv_array for this, you have to either push the same
set of elements repeatedly, or break the abstraction by
manually manipulating the array's internal members.

Instead, let's provide a sanctioned "pop" function to remove
elements from the end.

Signed-off-by: Jeff King <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
peff authored and gitster committed Sep 3, 2012
1 parent 9e234af commit fe4a0a2
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Documentation/technical/api-argv-array.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ Functions
Format a string and push it onto the end of the array. This is a
convenience wrapper combining `strbuf_addf` and `argv_array_push`.

`argv_array_pop`::
Remove the final element from the array. If there are no
elements in the array, do nothing.

`argv_array_clear`::
Free all memory associated with the array and return it to the
initial, empty state.
9 changes: 9 additions & 0 deletions argv-array.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,15 @@ void argv_array_pushl(struct argv_array *array, ...)
va_end(ap);
}

void argv_array_pop(struct argv_array *array)
{
if (!array->argc)
return;
free((char *)array->argv[array->argc - 1]);
array->argv[array->argc - 1] = NULL;
array->argc--;
}

void argv_array_clear(struct argv_array *array)
{
if (array->argv != empty_argv) {
Expand Down
1 change: 1 addition & 0 deletions argv-array.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ void argv_array_push(struct argv_array *, const char *);
__attribute__((format (printf,2,3)))
void argv_array_pushf(struct argv_array *, const char *fmt, ...);
void argv_array_pushl(struct argv_array *, ...);
void argv_array_pop(struct argv_array *);
void argv_array_clear(struct argv_array *);

#endif /* ARGV_ARRAY_H */

0 comments on commit fe4a0a2

Please sign in to comment.