fir-tools/src/fir2csv/999_main.c

123 lines
2.7 KiB
C

/* fir-tools/src/fir2csv/999_main.c
*
* Copyright: ©2014, Laurence Withers
* Author: Laurence Withers <l@lwithers.me.uk>
* 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 <path> Output file (default: stdout).\n"
" -n, --num <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
*/