static int exec_what (int what, int has_envp) { SLang_Array_Type *at_argv = NULL; SLang_Array_Type *at_envp = NULL; char **argv = NULL, **envp = NULL; char *path = NULL; int status = -1; if (has_envp) { if (NULL == (envp = pop_argv (&at_envp))) goto free_and_return; } if (NULL == (argv = pop_argv (&at_argv))) goto free_and_return; if (-1 == SLang_pop_slstring (&path)) goto free_and_return; status = call_what (what, path, argv, envp); free_and_return: if (path != NULL) SLang_free_slstring (path); if (argv != NULL) SLfree ((char *)argv); if (at_argv != NULL) SLang_free_array (at_argv); if (envp != NULL) SLfree ((char *)envp); if (at_envp != NULL) SLang_free_array (at_envp); return status; }
static void get_file_args(char *filename, argv_buf *abp, argv_buf *xabp) { argv_stack stck; int i; char **argv; ARGV_STACK_INIT(&stck); i = 0; argv = read_args_file(filename); while (argv) { while (argv[i]) { if (strcmp(argv[i], "-args_file") == 0) { char **new_argv; char *fname; if (!argv[++i]) usage("-args_file"); fname = argv[i++]; new_argv = read_args_file(fname); if (new_argv) { if (argv[i]) push_argv(&stck, argv, i); else efree(argv); i = 0; argv = new_argv; } } else { if (strcmp(argv[i], "-extra") == 0) { i++; while (argv[i]) save_arg(xabp, argv[i++]); break; } save_arg(abp, argv[i++]); } } efree(argv); pop_argv(&stck, &argv, &i); } }