8#include "tpcclibConfig.h"
22static char *info[] = {
23 "Join all TACs in TAC files into one file, keeping each TAC separate.",
24 "Sample times can be different. Mid frame time is always used.",
26 "Usage: @P [options] outputfile tacfiles",
30 " Program does not mind if the time or calibration units cannot be",
31 " converted to match.",
34 "See also: tacblend, tacadd, avgttac, tacnames, tacformat, tac2xml",
36 "Keywords: TAC, tool, plotting",
55int main(
int argc,
char **argv)
57 int ai, help=0, version=0, verbose=1;
59 char tacfile[FILENAME_MAX], outfile[FILENAME_MAX];
60 int fileNr=0, file1=0;
66 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
67 tacfile[0]=outfile[0]=(char)0;
69 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
71 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
72 if(strcasecmp(cptr,
"F")==0 || strcasecmp(cptr,
"FORCE")==0) {
73 forceMode=1;
continue;
75 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
84 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
89 if(ai<argc)
strlcpy(outfile, argv[ai++], FILENAME_MAX);
90 for(; ai<argc; ai++) {
91 if(fileNr==0) file1=ai;
97 for(ai=0; ai<argc; ai++) printf(
"%s ", argv[ai]);
99 printf(
"fileNr := %d\n", fileNr);
100 printf(
"outfile := %s\n", outfile);
101 printf(
"forceMode := %d\n", forceMode);
106 if(!outfile[0]) {
tpcPrintUsage(argv[0], info, stdout);
return(1);}
108 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
112 fprintf(stderr,
"Error: only one input file specified.\n");
117 for(ai=file1; ai<argc; ai++) {
118 strlcpy(tacfile, argv[ai], FILENAME_MAX);
119 if(access(tacfile, 0) == -1) {
120 fprintf(stderr,
"Error: input file %s does not exist.\n", tacfile);
123 if(strcasecmp(outfile, tacfile)==0) {
124 fprintf(stderr,
"Error: input file would be overwritten.\n");
135 taclist=(
TAC*)malloc(fileNr*
sizeof(
TAC));
137 fprintf(stderr,
"Error: out of memory.\n");
141 for(
int i=0; i<fileNr; i++)
tacInit(taclist+i);
143 for(ai=file1; ai<argc; ai++) {
144 strlcpy(tacfile, argv[ai], FILENAME_MAX);
145 if(verbose>1) printf(
"reading %s\n", tacfile);
147 if(
tacRead(taclist+i, tacfile, &status)) {
149 for(
int j=0; j<i; j++)
tacFree(taclist+j);
150 free(taclist);
return(3);
153 printf(
"fileformat := %s\n",
tacFormattxt(taclist[i].format));
154 printf(
"tacNr := %d\n", taclist[i].tacNr);
155 printf(
"sampleNr := %d\n", taclist[i].sampleNr);
161 if(verbose>1) printf(
"checking data...\n");
164 for(
int i=1; i<fileNr; i++) {
174 fprintf(stderr,
"Error: non-compatible TAC units.\n");
175 for(
int i=0; i<fileNr; i++)
tacFree(taclist+i);
176 free(taclist);
return(4);
182 int rs[fileNr], cs[fileNr];
185 printf(
"adding %d TACs with %d samples\n", taclist[0].tacNr, taclist[0].sampleNr);
188 for(
int i=1; i<fileNr; i++) {
189 cs[i]=taclist[0].
tacNr;
190 if(taclist[i].tacNr<1)
continue;
192 printf(
"adding %d TACs with %d samples\n", taclist[i].tacNr, taclist[i].sampleNr);
197 for(
int j=0; j<i; j++) {
198 if(taclist[i].tacNr<1 || taclist[j].tacNr<1)
continue;
199 if(
tacCompareTimes(taclist+j, taclist+i, 0.001, 0.001, NULL)==0) {ti=j;
break;}
201 if(verbose>1 && ti>=0) {
202 printf(
" equal sample times in %s and %s\n", argv[file1+i], argv[file1+ti]); fflush(stdout);}
203 if(ti<0) rs[i]=taclist[0].
sampleNr;
else rs[i]=rs[ti];
204 if(verbose>2) printf(
" adding TACs to index %d,%d\n", rs[i], cs[i]);
210 fprintf(stderr,
"Error: cannot allocate memory.\n");
211 for(
int j=0; j<i; j++)
tacFree(taclist+j);
212 free(taclist);
return(6);
215 printf(
" allocated for %d TACs and %d samples\n", taclist[0]._tacNr, taclist[0]._sampleNr);
220 if(verbose>3) {printf(
" adding new sample times\n"); fflush(stdout);}
221 for(
int j=0; j<taclist[i].
sampleNr; j++) {
222 taclist[0].
x[taclist[0].
sampleNr+j]=taclist[i].
x[j];
229 if(verbose>3) {printf(
" adding new TACs\n"); fflush(stdout);}
230 for(
int ci=0; ci<taclist[i].
tacNr; ci++) {
231 strcpy(taclist[0].c[cs[i]+ci].name, taclist[i].c[ci].name);
232 for(
int ri=0; ri<taclist[i].
sampleNr; ri++) {
233 taclist[0].
c[cs[i]+ci].
y[rs[i]+ri]=taclist[i].
c[ci].
y[ri];
249 if(verbose>1) printf(
"writing %s\n", outfile);
250 FILE *fp; fp=fopen(outfile,
"w");
252 fprintf(stderr,
"Error: cannot open file for writing.\n");
253 for(
int i=0; i<fileNr; i++)
tacFree(taclist+i);
261 for(
int i=0; i<fileNr; i++)
tacFree(taclist+i);
266 printf(
"%d TACs from %d files saved in %s\n", taclist[0].tacNr, fileNr, outfile);
271 for(
int i=0; i<fileNr; i++)
tacFree(taclist+i);
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacAllocateMoreSamples(TAC *tac, int addNr)
Allocate memory for more samples in TAC data.
int tacAllocateMore(TAC *tac, int tacNr)
int tacCompareTimes(TAC *d1, TAC *d2, const double test_abs, const double test_rel, TPCSTATUS *status)
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
char * tacFormattxt(tacformat c)
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
int tacYUnitConvert(TAC *tac, const int u, TPCSTATUS *status)
int tacXUnitConvert(TAC *tac, const int u, TPCSTATUS *status)
Header file for library libtpcextensions.
@ WEIGHTING_OFF
Not weighted or weights not available (weights for all included samples are 1.0).
@ TPCERROR_UNKNOWN_UNIT
Unknown data unit.
Header file for library libtpcift.
Header file for library libtpctac.
@ TAC_FORMAT_UNKNOWN
Unknown format.