struct argv_track *build_argv_track( struct argv_track *argvtp, ... );The function takes pointer to an argv_track structure allocated on a previous call to the function or NULL if you require one to be allocated for you, and then a sequence of string pointers terminated by a NULL.
The function duplicates each string, splits it on whitespace, and if the sub-string begins with a '$' or '%' then it is replaced by its evaluation from the environment and configuration space. This is done by a call to eval_config_default( NULL, sub_string ).
Once all the strings have been split and evaluated the routine then constructs an argv array with a terminating NULL pointer.
The routine then sets the argv and argc elements of the tracking structure and returns a pointer to the track structure.
If the routine is unable to allocate an argv_track structure when required the function returns NULL.
void free_argv_track( struct argv_track *argvtp );This function frees up the argv_track structure and any associated memory that was allocated during the string duplication.
static void print_argv( int argc, char *argv[] ) { int t=0; while (t<argc) { printf("argv[%d]=%s\n",t,argv[t]); t++; } return; } int main( int argc, char *argv[] ) { struct argv_track *argvtp; printf("Original argv\n"); print_argv( argc, argv ); set_config_string( "WIDTH", "50" ); argvtp = build_argv_track( NULL, "$USER %WIDTH", argv[1], NULL ); printf("New argv\n"); print_argv( argvtp->argc, argvtp->argv ); free_argv_track( argvtp ); return(0); }Would give behave as follows
$ argv_test this is a test Original argv argv[0]=argv_test argv[1]=this argv[2]=is argv[3]=a argv[4]=test New argv argv[0]=eric argv[1]=50 argv[2]=this