fix bug on -I with rename, part 2

This commit is contained in:
John Kerl 2019-09-02 14:18:01 -04:00
parent 9e2cd33c30
commit 1dee6164de
3 changed files with 17 additions and 15 deletions

View file

@ -254,9 +254,10 @@ cli_opts_t* parse_command_line(int argc, char** argv, sllv_t** ppmapper_list) {
// mappers operate on all input files. Also retain information needed to construct them
// for each input file, for in-place mode.
popts->mapper_argb = argi;
popts->argv = argv;
popts->original_argv = argv;
popts->non_in_place_argv = copy_argv(argv);
popts->argc = argc;
*ppmapper_list = cli_parse_mappers(argv, &argi, argc, popts, &no_input);
*ppmapper_list = cli_parse_mappers(popts->non_in_place_argv, &argi, argc, popts, &no_input);
for ( ; argi < argc; argi++) {
slls_append(popts->filenames, argv[argi], NO_FREE);
@ -334,10 +335,9 @@ sllv_t* cli_parse_mappers(char** argv, int* pargi, int argc, cli_opts_t* popts,
// is on the command line that the verbs and their arguments end and the filenames
// begin.
char** xargv = popts->do_in_place ? copy_argv(popts->argv) : popts->argv;
while (TRUE) {
check_arg_count(xargv, argi, argc, 1);
char* verb = xargv[argi];
check_arg_count(argv, argi, argc, 1);
char* verb = argv[argi];
mapper_setup_t* pmapper_setup = look_up_mapper_setup(verb);
if (pmapper_setup == NULL) {
@ -347,7 +347,7 @@ sllv_t* cli_parse_mappers(char** argv, int* pargi, int argc, cli_opts_t* popts,
}
if ((argc - argi) >= 2) {
if (streq(xargv[argi+1], "-h") || streq(xargv[argi+1], "--help")) {
if (streq(argv[argi+1], "-h") || streq(argv[argi+1], "--help")) {
pmapper_setup->pusage_func(stdout, MLR_GLOBALS.bargv0, verb);
exit(0);
}
@ -356,7 +356,7 @@ sllv_t* cli_parse_mappers(char** argv, int* pargi, int argc, cli_opts_t* popts,
// It's up to the parse func to print its usage on CLI-parse failure.
// Also note: this assumes main reader/writer opts are all parsed
// *before* mapper parse-CLI methods are invoked.
mapper_t* pmapper = pmapper_setup->pparse_func(&argi, argc, xargv,
mapper_t* pmapper = pmapper_setup->pparse_func(&argi, argc, argv,
&popts->reader_opts, &popts->writer_opts);
if (pmapper == NULL) {
exit(1);
@ -369,13 +369,10 @@ sllv_t* cli_parse_mappers(char** argv, int* pargi, int argc, cli_opts_t* popts,
sllv_append(pmapper_list, pmapper);
if (argi >= argc || !streq(xargv[argi], "then"))
if (argi >= argc || !streq(argv[argi], "then"))
break;
argi++;
}
if (popts->do_in_place) {
free_argv_copy(xargv);
}
*pargi = argi;
return pmapper_list;
@ -387,6 +384,7 @@ void cli_opts_free(cli_opts_t* popts) {
return;
slls_free(popts->filenames);
free_argv_copy(popts->non_in_place_argv);
free(popts);
free_opt_singletons();
}

View file

@ -82,9 +82,13 @@ typedef struct _cli_opts_t {
cli_reader_opts_t reader_opts;
cli_writer_opts_t writer_opts;
// These are used to construct the mapper list. In particular,
// for in-place mode they're reconstructed for each file.
char** argv;
// These are used to construct the mapper list. In particular, for in-place mode
// they're reconstructed for each file. We make copies since each pass through a
// CLI-parser operates destructively, principally by running strtok over
// comma-delimited field-name lists.
char** original_argv;
char** non_in_place_argv;
int argc;
int mapper_argb;

View file

@ -69,7 +69,7 @@ static int do_stream_chained_in_place(context_t* pctx, cli_opts_t* popts) {
int argi = popts->mapper_argb;
int unused;
char** argv_copy = copy_argv(popts->argv);
char** argv_copy = copy_argv(popts->original_argv);
sllv_t* pmapper_list = cli_parse_mappers(argv_copy, &argi, popts->argc, popts, &unused);
MLR_INTERNAL_CODING_ERROR_IF(pmapper_list->length < 1); // Should not have been allowed by the CLI parser.