8#include "tpcclibConfig.h"
21static char *info[] = {
22 "Insert parameter values from parameter file 2 into another, optionally new,",
23 "parameter file 1. If file1 does not exist, it will be created.",
25 "Usage: @P [options] file1 file2",
29 " List of parameter numbers or names to be copied; all by default.",
31 " List of TAC numbers or names to be copied; all by default.",
33 " Existing file1 is overwritten.",
35 " Nothing is actually copied, application only lists what it would do.",
39 "Create a new parameter file which contains only parameters 1-3",
40 " @P -ovr -par=1-3 ab123new.res ab123fitk3.res",
43 "Create a new parameter file which contains only regions 'caud' and 'putam'",
44 " @P -ovr -tac=caud,putam ab234new.csv ab234srtm.csv",
47 "Combine parameter BPnd in region 'putam' from given studies into one file",
48 "in MS Windows command prompt window, and then convert it to XML format",
49 "supported by MS Excel",
51 " for %g in (s6789*.res) do @P -par=BPnd -tac=putam combined.res %g",
52 " parformat -f=xml combined.res",
54 "See also: parformat, parget, parsort, pardiff, parmean, tacadd, rescoll",
56 "Keywords: parameter, tool, reporting, software testing",
75int main(
int argc,
char **argv)
77 int ai, help=0, version=0, verbose=1;
82 char *cptr, parfile1[FILENAME_MAX], parfile2[FILENAME_MAX];
83 char *pars=NULL, *tacs=NULL;
91 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
93 parfile1[0]=parfile2[0]=(char)0;
95 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
97 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
98 if(strncasecmp(cptr,
"OVR", 2)==0) {
99 overwrite=1;
continue;
100 }
else if(strncasecmp(cptr,
"DRY", 2)==0) {
102 }
else if(strncasecmp(cptr,
"PAR=", 4)==0 &&
strnlen(cptr, 5)>4) {
103 pars=
strdup(cptr+4);
continue;
104 }
else if(strncasecmp(cptr,
"TAC=", 4)==0 &&
strnlen(cptr, 5)>4) {
105 tacs=
strdup(cptr+4);
continue;
107 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
116 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
121 for(; ai<argc; ai++) {
123 strlcpy(parfile1, argv[ai], FILENAME_MAX);
continue;
124 }
else if(!parfile2[0]) {
125 strlcpy(parfile2, argv[ai], FILENAME_MAX);
continue;
127 fprintf(stderr,
"Error: too many arguments: '%s'.\n", argv[ai]);
134 free(pars); free(tacs);
return(1);
139 printf(
"parfile1 := %s\n", parfile1);
140 printf(
"parfile2 := %s\n", parfile2);
141 printf(
"overwrite := %d\n", overwrite);
142 printf(
"drymode := %d\n", drymode);
143 if(pars!=NULL) printf(
"pars := '%s'\n", pars);
144 if(tacs!=NULL) printf(
"tacs := '%s'\n", tacs);
150 if(verbose>1) printf(
"trying to read %s\n", parfile1);
151 ret=
parRead(&par1, parfile1, &status);
155 if(drymode) printf(
"File %s would be overwritten.\n", parfile1);
156 else if(verbose>=0) printf(
"File %s is overwritten.\n", parfile1);
158 }
else if(verbose>1) {
160 printf(
"parNr1 := %d\n", par1.
tacNr);
161 printf(
"tacNr1 := %d\n", par1.
tacNr);
166 if(drymode) printf(
"File %s would be created.\n", parfile1);
167 else if(verbose>=0) printf(
"File %s did not exist and was created.\n", parfile1);
172 parFree(&par1); free(pars); free(tacs);
return(2);
179 if(verbose>1) printf(
"reading %s\n", parfile2);
180 ret=
parRead(&par2, parfile2, &status);
183 parFree(&par2); free(pars); free(tacs);
return(3);
187 printf(
"parNr2 := %d\n", par2.
parNr);
188 printf(
"tacNr2 := %d\n", par2.
tacNr);
191 printf(
"file contents:\n");
193 printf(
"----------------\n");
199 int parNr=0, tacNr=0;
208 if(n==0) fprintf(stderr,
"Warning: %d parameter(s) match '%s'\n", n, buf);
209 else if(verbose>2) printf(
"%d parameter(s) match '%s'\n", n, buf);
214 fprintf(stderr,
"Error: no parameter(s) to add.\n");
215 parFree(&par2); free(pars); free(tacs);
return(4);
217 if(verbose>2 || drymode) {
218 for(
int i=0; i<par2.
parNr; i++)
219 if(par2.
n[i].
sw) printf(
"selected_parameter: %s\n", par2.
n[i].
name);
229 if(n==0) fprintf(stderr,
"Warning: %d TAC(s) match '%s'\n", n, buf);
230 else if(verbose>2) printf(
"%d TAC(s) match '%s'\n", n, buf);
235 fprintf(stderr,
"Error: no TAC(s) to add.\n");
236 parFree(&par2); free(pars); free(tacs);
return(5);
238 if(verbose>2 || drymode) {
239 for(
int i=0; i<par2.
tacNr; i++)
240 if(par2.
r[i].
sw) printf(
"selected_tac: %s\n", par2.
r[i].
name);
243 free(pars); free(tacs);
248 if(parNr!=par2.
parNr) {
255 if(tacNr!=par2.
tacNr) {
269 printf(
"%d parameter(s) and %d TAC(s) would be written in %s\n", par2.
parNr, par2.
tacNr, parfile1);
275 if(verbose>1) printf(
" saving\n");
276 fp=fopen(parfile1,
"w");
278 fprintf(stderr,
"Error: cannot open file for writing.\n");
287 if(verbose>0) printf(
"%s saved.\n", parfile1);
297 if(verbose>1) printf(
"reading %s\n", parfile1);
298 ret=
parRead(&par1, parfile1, &status);
305 printf(
"parNr1 := %d\n", par1.
parNr);
306 printf(
"tacNr1 := %d\n", par1.
tacNr);
310 int sametacs=0, samepars=0;
314 if(samepars) printf(
"All parameters match.\n");
else printf(
"Parameters do not match.\n");
315 if(sametacs) printf(
"All TACs match.\n");
else printf(
"TACs do not match.\n");
325 printf(
"%d parameter(s) would be written in %s\n", parNr, parfile1);
330 if(verbose>1) printf(
"adding %d parameter(s) in %s\n", parNr, parfile1);
335 fprintf(stderr,
"Error: cannot add parameters to data.\n");
340 int ti, pi, pj=par1.
parNr;
341 for(pi=0; pi<par2.
parNr; pi++, pj++) {
344 for(ti=0; ti<par1.
tacNr; ti++) {
345 par1.
r[ti].
p[pj]=par2.
r[ti].
p[pi];
346 par1.
r[ti].
sd[pj]=par2.
r[ti].
sd[pi];
347 par1.
r[ti].
cl1[pj]=par2.
r[ti].
cl1[pi];
348 par1.
r[ti].
cl2[pj]=par2.
r[ti].
cl2[pi];
354 for(ti=0; ti<par1.
tacNr; ti++) par1.
r[ti].
wss=nan(
"");
358 if(verbose>1) printf(
" saving\n");
359 fp=fopen(parfile1,
"w");
361 fprintf(stderr,
"Error: cannot open file for writing.\n");
370 if(verbose>0) printf(
"%d parameter(s) saved in %s\n", parNr, parfile1);
380 printf(
"%d TAC(s) would be written in %s\n", tacNr, parfile1);
385 if(verbose>1) printf(
"adding %d TAC(s) in %s\n", tacNr, parfile1);
390 fprintf(stderr,
"Error: cannot add TACs to data.\n");
395 if(verbose>2) printf(
"copying...\n");
396 int pi, ti, tj=par1.
tacNr;
397 for(ti=0; ti<par2.
tacNr; ti++, tj++) {
405 for(pi=0; pi<par2.
parNr; pi++) {
406 par1.
r[tj].
p[pi]=par2.
r[ti].
p[pi];
407 par1.
r[tj].
sd[pi]=par2.
r[ti].
sd[pi];
408 par1.
r[tj].
cl1[pi]=par2.
r[ti].
cl1[pi];
409 par1.
r[tj].
cl2[pi]=par2.
r[ti].
cl2[pi];
415 if(verbose>1) printf(
" saving\n");
416 fp=fopen(parfile1,
"w");
418 fprintf(stderr,
"Error: cannot open file for writing.\n");
427 if(verbose>0) printf(
"%d TAC(s) saved in %s\n", tacNr, parfile1);
436 if(verbose>1) printf(
"%d common TAC names\n%d common parameter names\n", tacNr, parNr);
438 fprintf(stderr,
"Error: incompatible contents for adding.\n");
446 fprintf(stderr,
"Error: incompatible contents for adding.\n");
453 printf(
"%d new parameter(s) would be written in %s\n", par1.
parNr-parNr, parfile1);
458 if(verbose>1) printf(
" saving\n");
459 fp=fopen(parfile1,
"w");
461 fprintf(stderr,
"Error: cannot open file for writing.\n");
470 printf(
"%d new parameter(s) saved in %s\n", par1.
parNr-parNr, parfile1);
478 fprintf(stderr,
"Error: incompatible contents for adding.\n");
int parDeletePar(PAR *par, int pi)
int parDeleteTAC(PAR *par, int ti)
int parAllocateMore(PAR *par, int parNr, int tacNr)
int parSelectByAnother(PAR *d1, PAR *d2, int *pn, int *pr, TPCSTATUS *status)
int parCombineTACs(PAR *d1, PAR *d2, TPCSTATUS *status)
int parCompareTacNames(PAR *d1, PAR *d2, const int i, const int casens, TPCSTATUS *status)
int parCompareParameterNames(PAR *d1, PAR *d2, const int i, const int casens, TPCSTATUS *status)
char * parFormattxt(parformat c)
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
int parSelectTACs(PAR *d, const char *region_name, int reset, TPCSTATUS *status)
int parSelectParameters(PAR *d, const char *par_name, int reset, TPCSTATUS *status)
int parSelectedTACs(PAR *d)
int parSelectedParameters(PAR *d)
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)
int strTokenNr(const char *s1, const char *s2)
char * strdup(const char *s)
size_t strnlen(const char *s, size_t n)
int strTokenNCpy(const char *s1, const char *s2, int i, char *s3, int count)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char name[MAX_PARNAME_LEN+1]
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
@ TPCERROR_CANNOT_OPEN
Cannot open file.
Header file for library libtpcift.
Header file for libtpcpar.
@ PAR_FORMAT_CSV_UK
UK CSV.
@ PAR_FORMAT_UNKNOWN
Unknown format.