The submodule code recently grew generic code to build a
dynamic argv array. Many other parts of the code can reuse
this, too, so let's make it generically available.
There are two enhancements not found in the original code:
  1. We now handle the NULL-termination invariant properly,
     even when no strings have been pushed (before, you
     could have an empty, NULL argv). This was not a problem
     for the submodule code, which always pushed at least
     one argument, but was not sufficiently safe for
     generic code.
  2. There is a formatted variant of the "push" function.
     This is a convenience function which was not needed by
     the submodule code, but will make it easier to port
     other users to the new code.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
	
		
			
				
	
	
		
			47 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
argv-array API
 | 
						|
==============
 | 
						|
 | 
						|
The argv-array API allows one to dynamically build and store
 | 
						|
NULL-terminated lists.  An argv-array maintains the invariant that the
 | 
						|
`argv` member always points to a non-NULL array, and that the array is
 | 
						|
always NULL-terminated at the element pointed to by `argv[argc]`. This
 | 
						|
makes the result suitable for passing to functions expecting to receive
 | 
						|
argv from main(), or the link:api-run-command.html[run-command API].
 | 
						|
 | 
						|
The link:api-string-list.html[string-list API] is similar, but cannot be
 | 
						|
used for these purposes; instead of storing a straight string pointer,
 | 
						|
it contains an item structure with a `util` field that is not compatible
 | 
						|
with the traditional argv interface.
 | 
						|
 | 
						|
Each `argv_array` manages its own memory. Any strings pushed into the
 | 
						|
array are duplicated, and all memory is freed by argv_array_clear().
 | 
						|
 | 
						|
Data Structures
 | 
						|
---------------
 | 
						|
 | 
						|
`struct argv_array`::
 | 
						|
 | 
						|
	A single array. This should be initialized by assignment from
 | 
						|
	`ARGV_ARRAY_INIT`, or by calling `argv_array_init`. The `argv`
 | 
						|
	member contains the actual array; the `argc` member contains the
 | 
						|
	number of elements in the array, not including the terminating
 | 
						|
	NULL.
 | 
						|
 | 
						|
Functions
 | 
						|
---------
 | 
						|
 | 
						|
`argv_array_init`::
 | 
						|
	Initialize an array. This is no different than assigning from
 | 
						|
	`ARGV_ARRAY_INIT`.
 | 
						|
 | 
						|
`argv_array_push`::
 | 
						|
	Push a copy of a string onto the end of the array.
 | 
						|
 | 
						|
`argv_array_pushf`::
 | 
						|
	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_clear`::
 | 
						|
	Free all memory associated with the array and return it to the
 | 
						|
	initial, empty state.
 |