/* fir-tools/src/fir2csv/999_main.c * * Copyright: ©2014, Laurence Withers * Author: Laurence Withers * License: GPLv3 */ void usage(void) { fputs("Usage:\n\n" " " APP_NAME " [options] coeff.txt\n\n" "Options:\n" " -h, --help Display this screen.\n" " -V, --version Display version number.\n" " -o, --output Output file (default: stdout).\n" " -n, --num Number of points (default: 1000).\n" " -t, --tabs Use tabs rather than commas in output.\n" "", stdout); } const struct option options[] = { { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'V' }, { "output", required_argument, 0, 'o' }, { "num", required_argument, 0, 'n' }, { "tabs", no_argument, 0, 't' }, { 0, 0, 0, 0 } }; const char* optstr = "hn:o:V"; int main(int argc, char* argv[]) { char* output_fname = 0, * tmp_fname, * endp; FILE* fp; int num_points = 1000; struct fir_filter_t* fi; while(1) { switch(getopt_long(argc, argv, optstr, options, 0)) { case -1: goto opts_done; case '?': return 1; case 'h': usage(); return 0; case 'V': fputs(APP_NAME " " VERSION "\n", stdout); return 0; case 'o': output_fname = optarg; break; case 'n': errno = 0; num_points = strtol(optarg, &endp, 0); if(errno || !endp || *endp || num_points < 2) { fputs(APP_NAME ": invalid number of points. Expecting integer " "> 1.\n", stderr); return 1; } break; case 't': csv_sep = '\t'; break; } } opts_done: if(optind != (argc - 1)) { usage(); return 1; } fi = load_filter(argv[optind]); if(output_fname) { tmp_fname = malloc(strlen(output_fname) + 10); strcpy(tmp_fname, output_fname); strcat(tmp_fname, ".new"); fp = fopen(tmp_fname, "w"); if(!fp) { fprintf(stderr, APP_NAME ": error opening \"%s\" for output: %m.\n", tmp_fname); return 1; } } else { fp = stdout; } fir2csv(fi, num_points, fp); if(output_fname) { if(fflush(fp) || fsync(fileno(fp)) || rename(tmp_fname, output_fname)) { fprintf(stderr, APP_NAME ": error writing to \"%s\": %m.\n", output_fname); unlink(tmp_fname); return 1; } } return 0; } /* options for text editors vim: expandtab:ts=4:sw=4 */