Refactor csv_init to output_start

This commit is contained in:
Christian W. Zuckschwerdt 2018-12-19 11:56:34 +01:00
parent 109daef2d3
commit 1bed1426b4
5 changed files with 34 additions and 23 deletions

View file

@ -149,6 +149,7 @@ typedef struct data_output {
void (*print_string)(struct data_output *output, const char *data, char *format);
void (*print_double)(struct data_output *output, double data, char *format);
void (*print_int)(struct data_output *output, int data, char *format);
void (*output_start)(struct data_output *output, const char **fields, int num_fields);
void (*output_poll)(struct data_output *output);
void (*output_free)(struct data_output *output);
FILE *file;
@ -157,16 +158,10 @@ typedef struct data_output {
/** Construct data output for CSV printer
@param file the output stream
@param fields the list of fields to accept and expect. Array is copied, but the actual
strings not. The list may contain duplicates and they are eliminated.
@param num_fields number of fields
@return The auxiliary data to pass along with data_csv_printer to data_print.
You must release this object with data_csv_free once you're done with it.
You must release this object with data_output_free once you're done with it.
*/
struct data_output *data_output_csv_create(FILE *file);
void data_output_csv_init(struct data_output *output, const char **fields, int num_fields);
struct data_output *data_output_json_create(FILE *file);
@ -174,6 +169,15 @@ struct data_output *data_output_kv_create(FILE *file);
struct data_output *data_output_syslog_create(const char *host, const char *port);
/** Setup known field keys and start output, used by CSV only.
@param output the data_output handle from data_output_x_create
@param fields the list of fields to accept and expect. Array is copied, but the actual
strings not. The list may contain duplicates and they are eliminated.
@param num_fields number of fields
*/
void data_output_start(struct data_output *output, const char **fields, int num_fields);
/** Prints a structured data object */
void data_output_print(struct data_output *output, data_t *data);

View file

@ -74,7 +74,6 @@ typedef struct r_cfg {
uint16_t num_r_devices;
char *output_tag;
list_t output_handler;
list_t csv_output_handler;
struct dm_state *demod;
} r_cfg_t;

View file

@ -356,6 +356,13 @@ void data_output_print(data_output_t *output, data_t *data)
}
}
void data_output_start(struct data_output *output, const char **fields, int num_fields)
{
if (!output || !output->output_start)
return;
output->output_start(output, fields, num_fields);
}
void data_output_poll(struct data_output *output)
{
if (!output || !output->output_poll)
@ -744,7 +751,7 @@ static int compare_strings(const void *a, const void *b)
return strcmp(*(char **)a, *(char **)b);
}
void data_output_csv_init(struct data_output *output, const char **fields, int num_fields)
static void data_output_csv_start(struct data_output *output, const char **fields, int num_fields)
{
data_output_csv_t *csv = (data_output_csv_t *)output;
@ -837,6 +844,7 @@ struct data_output *data_output_csv_create(FILE *file)
csv->output.print_string = print_csv_string;
csv->output.print_double = print_json_double;
csv->output.print_int = print_json_int;
csv->output.output_start = data_output_csv_start;
csv->output.output_free = data_output_csv_free;
csv->output.file = file;

View file

@ -845,8 +845,9 @@ static void sdr_callback(unsigned char *iq_buf, uint32_t len, void *ctx) {
}
// find the fields output for CSV
static char const **determine_csv_fields(char const **well_known, list_t *r_devs, int *num_fields)
static char const **determine_csv_fields(r_cfg_t *cfg, char const **well_known, int *num_fields)
{
list_t *r_devs = &cfg->demod->r_devs;
int cur_output_fields = 0;
int num_output_fields = 0;
const char **output_fields = NULL;
@ -882,7 +883,8 @@ static char const **determine_csv_fields(char const **well_known, list_t *r_devs
}
}
*num_fields = num_output_fields;
if (num_fields)
*num_fields = num_output_fields;
return output_fields;
}
@ -907,16 +909,18 @@ static void add_json_output(r_cfg_t *cfg, char *param)
static void add_csv_output(r_cfg_t *cfg, char *param)
{
struct data_output *output = data_output_csv_create(fopen_output(param));
list_push(&cfg->output_handler, output);
list_push(&cfg->csv_output_handler, output);
list_push(&cfg->output_handler, data_output_csv_create(fopen_output(param)));
}
static void init_csv_output(struct data_output *output, char const **well_known, list_t *r_devs)
static void start_outputs(r_cfg_t *cfg, char const **well_known)
{
int num_output_fields;
const char **output_fields = determine_csv_fields(well_known, r_devs, &num_output_fields);
data_output_csv_init(output, output_fields, num_output_fields);
const char **output_fields = determine_csv_fields(cfg, well_known, &num_output_fields);
for (size_t i = 0; i < cfg->output_handler.len; ++i) { // list might contain NULLs
data_output_start(cfg->output_handler.elems[i], output_fields, num_output_fields);
}
free(output_fields);
}
@ -1408,7 +1412,6 @@ int main(int argc, char **argv) {
list_ensure_size(&cfg.in_files, 100);
list_ensure_size(&cfg.output_handler, 16);
list_ensure_size(&cfg.csv_output_handler, 16);
demod = calloc(1, sizeof(struct dm_state));
list_ensure_size(&demod->r_devs, 100);
@ -1514,9 +1517,7 @@ int main(int argc, char **argv) {
}
fprintf(stderr, "\n");
for (void **iter = cfg.csv_output_handler.elems; iter && *iter; ++iter) {
init_csv_output(*iter, well_known_output_fields(&cfg), &cfg.demod->r_devs);
}
start_outputs(&cfg, well_known_output_fields(&cfg));
if (cfg.out_block_size < MINIMAL_BUF_LENGTH ||
cfg.out_block_size > MAXIMAL_BUF_LENGTH) {
@ -1734,7 +1735,6 @@ out:
data_output_free(cfg.output_handler.elems[i]);
}
free(cfg.output_handler.elems);
free(cfg.csv_output_handler.elems);
return r >= 0 ? r : -r;
}

View file

@ -39,7 +39,7 @@ int main()
void *json_output = data_output_json_create(stdout);
void *kv_output = data_output_kv_create(stdout);
void *csv_output = data_output_csv_create(stdout);
data_output_csv_init(csv_output, fields, sizeof fields / sizeof *fields);
data_output_start(csv_output, fields, sizeof fields / sizeof *fields);
data_output_print(json_output, data); fprintf(stdout, "\n");
data_output_print(kv_output, data);