mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-21 02:23:20 +00:00
allow ORS/OFS/OPS to be multi-char
This commit is contained in:
parent
fc64c7510b
commit
df0f744712
6 changed files with 108 additions and 55 deletions
113
c/cli/mlrcli.c
113
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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue