From 85bc56614a28eadc6fb4a5cbce5dfa9f4e620b40 Mon Sep 17 00:00:00 2001 From: "Christian W. Zuckschwerdt" Date: Thu, 20 Dec 2018 10:36:13 +0100 Subject: [PATCH] Refactor init and free of cfg --- src/rtl_433.c | 111 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 39 deletions(-) diff --git a/src/rtl_433.c b/src/rtl_433.c index 2078215b..c22382dd 100644 --- a/src/rtl_433.c +++ b/src/rtl_433.c @@ -1342,6 +1342,71 @@ static void parse_conf_option(r_cfg_t *cfg, int opt, char *arg) } } +void r_init_cfg(r_cfg_t *cfg) +{ + cfg->out_block_size = DEFAULT_BUF_LENGTH; + cfg->samp_rate = DEFAULT_SAMPLE_RATE; + cfg->conversion_mode = CONVERT_NATIVE; + + list_ensure_size(&cfg->in_files, 100); + list_ensure_size(&cfg->output_handler, 16); + + cfg->demod = calloc(1, sizeof(*cfg->demod)); + if (!cfg->demod) { + fprintf(stderr, "Could not create demod!\n"); + exit(1); + } + + cfg->demod->level_limit = DEFAULT_LEVEL_LIMIT; + cfg->demod->hop_time = DEFAULT_HOP_TIME; + + list_ensure_size(&cfg->demod->r_devs, 100); + list_ensure_size(&cfg->demod->dumper, 32); +} + +r_cfg_t *r_create_cfg(void) +{ + r_cfg_t *cfg = calloc(1, sizeof(*cfg)); + if (!cfg) { + fprintf(stderr, "Could not create cfg!\n"); + exit(1); + } + + r_init_cfg(cfg); + + return cfg; +} + +void r_free_cfg(r_cfg_t *cfg) +{ + if (cfg->dev) + sdr_deactivate(cfg->dev); + if (cfg->dev) + sdr_close(cfg->dev); + + for (void **iter = cfg->demod->dumper.elems; iter && *iter; ++iter) { + file_info_t const *dumper = *iter; + if (dumper->file && (dumper->file != stdout)) + fclose(dumper->file); + } + list_free_elems(&cfg->demod->dumper, free); + + list_free_elems(&cfg->demod->r_devs, free); + + if (cfg->demod->am_analyze) + am_analyze_free(cfg->demod->am_analyze); + + pulse_detect_free(cfg->demod->pulse_detect); + + free(cfg->demod); + + list_free_elems(&cfg->output_handler, (list_elem_free_fn)data_output_free); + + list_free_elems(&cfg->in_files, NULL); + + //free(cfg); +} + // well-known fields "time", "msg" and "codes" are used to output general decoder messages // well-known field "bits" is only used when verbose bits (-M bits) is requested // well-known field "tag" is only used when output tagging is requested @@ -1361,11 +1426,7 @@ static char const **well_known_output_fields(r_cfg_t *cfg) return well_known_default; } -static r_cfg_t cfg = { - .out_block_size = DEFAULT_BUF_LENGTH, - .samp_rate = DEFAULT_SAMPLE_RATE, - .conversion_mode = CONVERT_NATIVE, -}; +static r_cfg_t cfg; #ifdef _WIN32 BOOL WINAPI @@ -1407,16 +1468,12 @@ int main(int argc, char **argv) { print_version(); // always print the version info + r_init_cfg(&cfg); + setbuf(stdout, NULL); setbuf(stderr, NULL); - list_ensure_size(&cfg.in_files, 100); - list_ensure_size(&cfg.output_handler, 16); - - demod = calloc(1, sizeof(struct dm_state)); - list_ensure_size(&demod->r_devs, 100); - list_ensure_size(&demod->dumper, 32); - cfg.demod = demod; + demod = cfg.demod; demod->pulse_detect = pulse_detect_create(); @@ -1435,9 +1492,6 @@ int main(int argc, char **argv) { } cfg.devices = r_devices; - cfg.demod->level_limit = DEFAULT_LEVEL_LIMIT; - cfg.demod->hop_time = DEFAULT_HOP_TIME; - // if there is no explicit conf file option look for default conf files if (!hasopt('c', argc, argv, OPTSTRING)) { parse_conf_try_default_files(&cfg); @@ -1596,7 +1650,7 @@ int main(int argc, char **argv) { in_file = fopen(demod->load_info.path, "rb"); if (!in_file) { fprintf(stderr, "Opening file: %s failed!\n", cfg.in_filename); - goto out; + break; } } fprintf(stderr, "Test mode active. Reading samples from file: %s\n", cfg.in_filename); // Essential information (not quiet) @@ -1656,7 +1710,7 @@ int main(int argc, char **argv) { free(test_mode_buf); free(test_mode_float_buf); - free(cfg.in_files.elems); + r_free_cfg(&cfg); exit(0); } @@ -1712,28 +1766,7 @@ int main(int argc, char **argv) { if (!cfg.do_exit) fprintf(stderr, "\nLibrary error %d, exiting...\n", r); - for (void **iter = demod->dumper.elems; iter && *iter; ++iter) { - file_info_t const *dumper = *iter; - if (dumper->file && (dumper->file != stdout)) - fclose(dumper->file); - } - list_free_elems(&demod->dumper, free); - - r = sdr_deactivate(cfg.dev); - - list_free_elems(&demod->r_devs, free); - - if (demod->am_analyze) - am_analyze_free(demod->am_analyze); - - pulse_detect_free(demod->pulse_detect); - free(demod); - - sdr_close(cfg.dev); -out: - list_free_elems(&cfg.output_handler, (list_elem_free_fn)data_output_free); - - list_free_elems(&cfg.in_files, NULL); + r_free_cfg(&cfg); return r >= 0 ? r : -r; }