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>
		
	
		
			
				
	
	
		
			21 lines
		
	
	
		
			463 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			21 lines
		
	
	
		
			463 B
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef ARGV_ARRAY_H
 | 
						|
#define ARGV_ARRAY_H
 | 
						|
 | 
						|
extern const char **empty_argv;
 | 
						|
 | 
						|
struct argv_array {
 | 
						|
	const char **argv;
 | 
						|
	int argc;
 | 
						|
	int alloc;
 | 
						|
};
 | 
						|
 | 
						|
#define ARGV_ARRAY_INIT { empty_argv, 0, 0 }
 | 
						|
 | 
						|
void argv_array_init(struct argv_array *);
 | 
						|
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_clear(struct argv_array *);
 | 
						|
 | 
						|
#endif /* ARGV_ARRAY_H */
 |