Refactor csv_init to output_start
This commit is contained in:
parent
109daef2d3
commit
1bed1426b4
5 changed files with 34 additions and 23 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
10
src/data.c
10
src/data.c
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue