123 lines
2.7 KiB
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
|
|
*/
|