From df0f74471274ba68b3f75f2ed3cc555953b330c1 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Fri, 11 Sep 2015 20:39:06 -0400 Subject: [PATCH] allow ORS/OFS/OPS to be multi-char --- c/cli/mlrcli.c | 113 ++++++++++++++++++++++++---------- c/cli/mlrcli.h | 3 +- c/mapping/mapper_join.c | 4 +- c/output/lrec_writer_pprint.c | 19 +++--- c/output/lrec_writer_xtab.c | 12 ++-- c/output/lrec_writers.h | 12 ++-- 6 files changed, 108 insertions(+), 55 deletions(-) diff --git a/c/cli/mlrcli.c b/c/cli/mlrcli.c index 1dbd78d37..2473aa6f7 100644 --- a/c/cli/mlrcli.c +++ b/c/cli/mlrcli.c @@ -200,15 +200,40 @@ cli_opts_t* parse_command_line(int argc, char** argv) { cli_opts_t* popts = mlr_malloc_or_die(sizeof(cli_opts_t)); memset(popts, 0, sizeof(*popts)); + // xxx integrate these with DEFAULT_XS ... + lhmss_t* default_orses = lhmss_alloc(); + lhmss_put(default_orses, "dkvp", "\n"); + lhmss_put(default_orses, "csv", "\r\n"); + lhmss_put(default_orses, "csvlite", "\n"); + lhmss_put(default_orses, "nidx", "\n"); + lhmss_put(default_orses, "xtab", "\n"); + lhmss_put(default_orses, "pprint", "\n"); + + lhmss_t* default_ofses = lhmss_alloc(); + lhmss_put(default_ofses, "dkvp", ","); + lhmss_put(default_ofses, "csv", ","); + lhmss_put(default_ofses, "csvlite", ","); + lhmss_put(default_ofses, "nidx", " "); + lhmss_put(default_ofses, "xtab", " "); + lhmss_put(default_ofses, "pprint", " "); + + lhmss_t* default_opses = lhmss_alloc(); + lhmss_put(default_opses, "dkvp", "="); + lhmss_put(default_opses, "csv", "X"); + lhmss_put(default_opses, "csvlite", "X"); + lhmss_put(default_opses, "nidx", "X"); + lhmss_put(default_opses, "xtab", "X"); + lhmss_put(default_opses, "pprint", "X"); + popts->irs = DEFAULT_RS[0]; // xxx temp popts->ifs = DEFAULT_FS[0]; popts->ips = DEFAULT_PS[0]; popts->allow_repeat_ifs = FALSE; popts->allow_repeat_ips = FALSE; - popts->ors = DEFAULT_RS; - popts->ofs = DEFAULT_FS; - popts->ops = DEFAULT_PS; + popts->ors = NULL; + popts->ofs = NULL; + popts->ops = NULL; popts->ofmt = DEFAULT_OFMT; popts->oquoting = DEFAULT_OQUOTING; @@ -216,8 +241,8 @@ cli_opts_t* parse_command_line(int argc, char** argv) { popts->plrec_writer = NULL; popts->filenames = NULL; - popts->ifmt = "dkvp"; - char* ofmt = "dkvp"; + popts->ifile_fmt = "dkvp"; + popts->ofile_fmt = "dkvp"; popts->use_mmap_for_read = TRUE; int left_align_pprint = TRUE; @@ -288,8 +313,8 @@ cli_opts_t* parse_command_line(int argc, char** argv) { } else if (streq(argv[argi], "-p")) { - popts->ifmt = "nidx"; - ofmt = "nidx"; + popts->ifile_fmt = "nidx"; + popts->ofile_fmt = "nidx"; popts->ifs = ' '; popts->ofs = " "; popts->allow_repeat_ifs = TRUE; @@ -314,40 +339,40 @@ cli_opts_t* parse_command_line(int argc, char** argv) { argi++; } - else if (streq(argv[argi], "--csv")) { popts->ifmt = ofmt = "csv"; } - else if (streq(argv[argi], "--icsv")) { popts->ifmt = "csv"; } - else if (streq(argv[argi], "--ocsv")) { ofmt = "csv"; } + else if (streq(argv[argi], "--csv")) { popts->ifile_fmt = popts->ofile_fmt = "csv"; } + else if (streq(argv[argi], "--icsv")) { popts->ifile_fmt = "csv"; } + else if (streq(argv[argi], "--ocsv")) { popts->ofile_fmt = "csv"; } - else if (streq(argv[argi], "--csvlite")) { popts->ifmt = ofmt = "csvlite"; } - else if (streq(argv[argi], "--icsvlite")) { popts->ifmt = "csvlite"; } - else if (streq(argv[argi], "--ocsvlite")) { ofmt = "csvlite"; } + else if (streq(argv[argi], "--csvlite")) { popts->ifile_fmt = popts->ofile_fmt = "csvlite"; } + else if (streq(argv[argi], "--icsvlite")) { popts->ifile_fmt = "csvlite"; } + else if (streq(argv[argi], "--ocsvlite")) { popts->ofile_fmt = "csvlite"; } - else if (streq(argv[argi], "--dkvp")) { popts->ifmt = ofmt = "dkvp"; } - else if (streq(argv[argi], "--idkvp")) { popts->ifmt = "dkvp"; } - else if (streq(argv[argi], "--odkvp")) { ofmt = "dkvp"; } + else if (streq(argv[argi], "--dkvp")) { popts->ifile_fmt = popts->ofile_fmt = "dkvp"; } + else if (streq(argv[argi], "--idkvp")) { popts->ifile_fmt = "dkvp"; } + else if (streq(argv[argi], "--odkvp")) { popts->ofile_fmt = "dkvp"; } - else if (streq(argv[argi], "--nidx")) { popts->ifmt = ofmt = "nidx"; } - else if (streq(argv[argi], "--inidx")) { popts->ifmt = "nidx"; } - else if (streq(argv[argi], "--onidx")) { ofmt = "nidx"; } + else if (streq(argv[argi], "--nidx")) { popts->ifile_fmt = popts->ofile_fmt = "nidx"; } + else if (streq(argv[argi], "--inidx")) { popts->ifile_fmt = "nidx"; } + else if (streq(argv[argi], "--onidx")) { popts->ofile_fmt = "nidx"; } - else if (streq(argv[argi], "--xtab")) { popts->ifmt = ofmt = "xtab"; } - else if (streq(argv[argi], "--ixtab")) { popts->ifmt = "xtab"; } - else if (streq(argv[argi], "--oxtab")) { ofmt = "xtab"; } + else if (streq(argv[argi], "--xtab")) { popts->ifile_fmt = popts->ofile_fmt = "xtab"; } + else if (streq(argv[argi], "--ixtab")) { popts->ifile_fmt = "xtab"; } + else if (streq(argv[argi], "--oxtab")) { popts->ofile_fmt = "xtab"; } else if (streq(argv[argi], "--ipprint")) { - popts->ifmt = "csvlite"; + popts->ifile_fmt = "csvlite"; popts->ifs = ' '; popts->allow_repeat_ifs = TRUE; } else if (streq(argv[argi], "--opprint")) { - ofmt = "pprint"; + popts->ofile_fmt = "pprint"; } else if (streq(argv[argi], "--pprint")) { - popts->ifmt = "csvlite"; + popts->ifile_fmt = "csvlite"; popts->ifs = ' '; popts->allow_repeat_ifs = TRUE; - ofmt = "pprint"; + popts->ofile_fmt = "pprint"; } else if (streq(argv[argi], "--right")) { left_align_pprint = FALSE; @@ -355,7 +380,7 @@ cli_opts_t* parse_command_line(int argc, char** argv) { else if (streq(argv[argi], "--ofmt")) { check_arg_count(argv, argi, argc, 2); - popts->ofmt = argv[argi+1]; + popts->ofile_fmt = argv[argi+1]; argi++; } @@ -387,12 +412,32 @@ cli_opts_t* parse_command_line(int argc, char** argv) { nusage(argv[0], argv[argi]); } - if (streq(ofmt, "dkvp")) popts->plrec_writer = lrec_writer_dkvp_alloc(popts->ors, popts->ofs, popts->ops); - else if (streq(ofmt, "csv")) popts->plrec_writer = lrec_writer_csv_alloc(popts->ors, popts->ofs, popts->oquoting); - else if (streq(ofmt, "csvlite")) popts->plrec_writer = lrec_writer_csvlite_alloc(popts->ors, popts->ofs); - else if (streq(ofmt, "nidx")) popts->plrec_writer = lrec_writer_nidx_alloc(popts->ors, popts->ofs); - else if (streq(ofmt, "xtab")) popts->plrec_writer = lrec_writer_xtab_alloc(); - else if (streq(ofmt, "pprint")) popts->plrec_writer = lrec_writer_pprint_alloc(left_align_pprint); + if (popts->ors == NULL) + popts->ors = lhmss_get(default_orses, popts->ofile_fmt); + if (popts->ofs == NULL) + popts->ofs = lhmss_get(default_ofses, popts->ofile_fmt); + if (popts->ops == NULL) + popts->ops = lhmss_get(default_opses, popts->ofile_fmt); + + if (popts->ors == NULL) { + fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n", argv[0], __FILE__, __LINE__); + exit(1); + } + if (popts->ofs == NULL) { + fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n", argv[0], __FILE__, __LINE__); + exit(1); + } + if (popts->ops == NULL) { + fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n", argv[0], __FILE__, __LINE__); + exit(1); + } + + if (streq(popts->ofile_fmt, "dkvp")) popts->plrec_writer = lrec_writer_dkvp_alloc(popts->ors, popts->ofs, popts->ops); + else if (streq(popts->ofile_fmt, "csv")) popts->plrec_writer = lrec_writer_csv_alloc(popts->ors, popts->ofs, popts->oquoting); + else if (streq(popts->ofile_fmt, "csvlite")) popts->plrec_writer = lrec_writer_csvlite_alloc(popts->ors, popts->ofs); + else if (streq(popts->ofile_fmt, "nidx")) popts->plrec_writer = lrec_writer_nidx_alloc(popts->ors, popts->ofs); + else if (streq(popts->ofile_fmt, "xtab")) popts->plrec_writer = lrec_writer_xtab_alloc(popts->ors, popts->ofs); + else if (streq(popts->ofile_fmt, "pprint")) popts->plrec_writer = lrec_writer_pprint_alloc(popts->ors, popts->ofs, left_align_pprint); else { main_usage(argv[0], 1); } @@ -439,7 +484,7 @@ cli_opts_t* parse_command_line(int argc, char** argv) { if (argi == argc) popts->use_mmap_for_read = FALSE; - popts->plrec_reader = lrec_reader_alloc(popts->ifmt, popts->use_mmap_for_read, + popts->plrec_reader = lrec_reader_alloc(popts->ifile_fmt, popts->use_mmap_for_read, popts->irs, popts->ifs, popts->allow_repeat_ifs, popts->ips, popts->allow_repeat_ips); if (popts->plrec_reader == NULL) main_usage(argv[0], 1); diff --git a/c/cli/mlrcli.h b/c/cli/mlrcli.h index 3d9209799..bd38734cd 100644 --- a/c/cli/mlrcli.h +++ b/c/cli/mlrcli.h @@ -23,7 +23,8 @@ typedef struct _cli_opts_t { int allow_repeat_ifs; int allow_repeat_ips; int use_mmap_for_read; - char* ifmt; + char* ifile_fmt; + char* ofile_fmt; char* ors; char* ofs; diff --git a/c/mapping/mapper_join.c b/c/mapping/mapper_join.c index b6d44f7bd..1e0b1e944 100644 --- a/c/mapping/mapper_join.c +++ b/c/mapping/mapper_join.c @@ -35,7 +35,7 @@ typedef struct _mapper_join_opts_t { char ips; int allow_repeat_ifs; int allow_repeat_ips; - char* ifmt; + char* ifile_fmt; int use_mmap_for_read; } mapper_join_opts_t; @@ -237,7 +237,7 @@ static void mapper_join_free(void* pvstate) { static void merge_options(mapper_join_opts_t* popts) { if (popts->input_file_format == NULL) - popts->input_file_format = MLR_GLOBALS.popts->ifmt; + popts->input_file_format = MLR_GLOBALS.popts->ifile_fmt; if (popts->irs == OPTION_UNSPECIFIED) popts->irs = MLR_GLOBALS.popts->irs; if (popts->ifs == OPTION_UNSPECIFIED) diff --git a/c/output/lrec_writer_pprint.c b/c/output/lrec_writer_pprint.c index 2fff373c6..425b4fe5e 100644 --- a/c/output/lrec_writer_pprint.c +++ b/c/output/lrec_writer_pprint.c @@ -11,12 +11,13 @@ typedef struct _lrec_writer_pprint_state_t { slls_t* pprev_keys; int left_align; long long num_blocks_written; + char* ors; + char* ofs; } lrec_writer_pprint_state_t; -static void print_and_free_record_list(sllv_t* precords, FILE* output_stream, int left_align); +static void print_and_free_record_list(sllv_t* precords, FILE* output_stream, char* ors, char* ofs, int left_align); // ---------------------------------------------------------------- -// xxx use ORS here static void lrec_writer_pprint_process(FILE* output_stream, lrec_t* prec, void* pvstate) { lrec_writer_pprint_state_t* pstate = pvstate; @@ -32,8 +33,8 @@ static void lrec_writer_pprint_process(FILE* output_stream, lrec_t* prec, void* if (drain) { if (pstate->num_blocks_written > 0LL) // xxx cmt - fputc('\n', output_stream); - print_and_free_record_list(pstate->precords, output_stream, pstate->left_align); + fputs(pstate->ors, output_stream); + print_and_free_record_list(pstate->precords, output_stream, pstate->ors, pstate->ofs, pstate->left_align); if (pstate->pprev_keys != NULL) { slls_free(pstate->pprev_keys); pstate->pprev_keys = NULL; @@ -49,7 +50,7 @@ static void lrec_writer_pprint_process(FILE* output_stream, lrec_t* prec, void* } // ---------------------------------------------------------------- -static void print_and_free_record_list(sllv_t* precords, FILE* output_stream, int left_align) { +static void print_and_free_record_list(sllv_t* precords, FILE* output_stream, char* ors, char* ofs, int left_align) { if (precords->length == 0) return; lrec_t* prec1 = precords->phead->pvdata; @@ -96,7 +97,7 @@ static void print_and_free_record_list(sllv_t* precords, FILE* output_stream, in fprintf(output_stream, "%s", pe->key); } } - fputc('\n', output_stream); + fputs(ors, output_stream); } j = 0; @@ -123,7 +124,7 @@ static void print_and_free_record_list(sllv_t* precords, FILE* output_stream, in fprintf(output_stream, "%s", value); } } - fputc('\n', output_stream); + fputs(ors, output_stream); lrec_free(prec); // xxx cmt mem-mgmt } @@ -144,12 +145,14 @@ static void lrec_writer_pprint_free(void* pvstate) { } } -lrec_writer_t* lrec_writer_pprint_alloc(int left_align) { +lrec_writer_t* lrec_writer_pprint_alloc(char* ors, char* ofs, int left_align) { lrec_writer_t* plrec_writer = mlr_malloc_or_die(sizeof(lrec_writer_t)); lrec_writer_pprint_state_t* pstate = mlr_malloc_or_die(sizeof(lrec_writer_pprint_state_t)); pstate->precords = sllv_alloc(); pstate->pprev_keys = NULL; + pstate->ors = ors; + pstate->ofs = ofs; pstate->left_align = left_align; pstate->num_blocks_written = 0LL; diff --git a/c/output/lrec_writer_xtab.c b/c/output/lrec_writer_xtab.c index 39bad0a5a..8eadec118 100644 --- a/c/output/lrec_writer_xtab.c +++ b/c/output/lrec_writer_xtab.c @@ -4,6 +4,8 @@ #include "output/lrec_writers.h" typedef struct _lrec_writer_xtab_state_t { + char* ors; + char* ofs; long long record_count; } lrec_writer_xtab_state_t; @@ -13,7 +15,7 @@ static void lrec_writer_xtab_process(FILE* output_stream, lrec_t* prec, void* pv return; lrec_writer_xtab_state_t* pstate = pvstate; if (pstate->record_count > 0LL) - fprintf(output_stream, "\n"); + fputs(pstate->ors, output_stream); pstate->record_count++; int max_key_width = 1; @@ -28,8 +30,8 @@ static void lrec_writer_xtab_process(FILE* output_stream, lrec_t* prec, void* pv fprintf(output_stream, "%s", pe->key); int d = max_key_width - strlen_for_utf8_display(pe->key); for (int i = 0; i < d; i++) - fputc(' ', output_stream); - fprintf(output_stream, " %s\n", pe->value); + fputs(pstate->ofs, output_stream); + fprintf(output_stream, "%s%s%s", pstate->ofs, pe->value, pstate->ors); } lrec_free(prec); // xxx cmt mem-mgmt } @@ -37,10 +39,12 @@ static void lrec_writer_xtab_process(FILE* output_stream, lrec_t* prec, void* pv static void lrec_writer_xtab_free(void* pvstate) { } -lrec_writer_t* lrec_writer_xtab_alloc() { +lrec_writer_t* lrec_writer_xtab_alloc(char* ors, char* ofs) { lrec_writer_t* plrec_writer = mlr_malloc_or_die(sizeof(lrec_writer_t)); lrec_writer_xtab_state_t* pstate = mlr_malloc_or_die(sizeof(lrec_writer_xtab_state_t)); + pstate->ors = ors; + pstate->ofs = ofs; pstate->record_count = 0LL; plrec_writer->pvstate = pstate; diff --git a/c/output/lrec_writers.h b/c/output/lrec_writers.h index 8fc4c1653..f96ad2592 100644 --- a/c/output/lrec_writers.h +++ b/c/output/lrec_writers.h @@ -2,11 +2,11 @@ #define LREC_WRITERS_H #include "output/lrec_writer.h" -lrec_writer_t* lrec_writer_csv_alloc(char* rs, char* fs, int oquoting); -lrec_writer_t* lrec_writer_csvlite_alloc(char* rs, char* fs); -lrec_writer_t* lrec_writer_dkvp_alloc(char* rs, char* fs, char* ps); -lrec_writer_t* lrec_writer_nidx_alloc(char* rs, char* fs); -lrec_writer_t* lrec_writer_pprint_alloc(int left_align); -lrec_writer_t* lrec_writer_xtab_alloc(); +lrec_writer_t* lrec_writer_csv_alloc(char* ors, char* ofs, int oquoting); +lrec_writer_t* lrec_writer_csvlite_alloc(char* ors, char* ofs); +lrec_writer_t* lrec_writer_dkvp_alloc(char* ors, char* ofs, char* ops); +lrec_writer_t* lrec_writer_nidx_alloc(char* ors, char* ofs); +lrec_writer_t* lrec_writer_pprint_alloc(char* ors, char*ofs, int left_align); +lrec_writer_t* lrec_writer_xtab_alloc(char* ors, char* ofs); #endif // LREC_WRITERS_H