mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-26 17:28:13 +00:00
fix bug on -I with rename, part 2
This commit is contained in:
parent
9e2cd33c30
commit
1dee6164de
3 changed files with 17 additions and 15 deletions
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue