8#include "tpcclibConfig.h"
20static char *info[] = {
21 "Collect the contents of parameter files.",
23 "Usage: @P [options] newfile filename(s)",
27 " List of parameter numbers or names to be copied; all by default.",
29 " List of TAC numbers or names to be copied; all by default.",
33 " @P all.par ut????srtm.res",
35 "See also: paradd, iftedit, parformat, parrenp, parmean, parai, rescoll",
37 "Keywords: parameter, tool, format, CSV, RES, FIT",
56int main(
int argc,
char **argv)
58 int ai, help=0, version=0, verbose=1;
59 char newfile[FILENAME_MAX], parfile[FILENAME_MAX];
60 char *pars=NULL, *tacs=NULL;
66 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
67 newfile[0]=parfile[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(strncasecmp(cptr,
"PAR=", 4)==0 &&
strnlen(cptr, 5)>4) {
73 pars=
strdup(cptr+4);
continue;
74 }
else if(strncasecmp(cptr,
"TAC=", 4)==0 &&
strnlen(cptr, 5)>4) {
75 tacs=
strdup(cptr+4);
continue;
77 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
82 if(help==2) {
tpcHtmlUsage(argv[0], info,
""); free(pars); free(tacs);
return(0);}
83 if(help) {
tpcPrintUsage(argv[0], info, stdout); free(pars); free(tacs);
return(0);}
84 if(version) {
tpcPrintBuild(argv[0], stdout); free(pars); free(tacs);
return(0);}
91 if(ai==argc) {
tpcPrintUsage(argv[0], info, stdout); free(pars); free(tacs);
return(1);}
92 if(ai<argc)
strlcpy(newfile, argv[ai++], FILENAME_MAX);
94 fprintf(stderr,
"Error: missing names for data files.\n");
95 free(pars); free(tacs);
return(1);
100 for(; ai<argc; ai++) {
101 if(verbose>2) {printf(
"file %d: %s\n", 1+fileNr, argv[ai]); fflush(stdout);}
107 fprintf(stderr,
"Error: missing parameter files.\n");
108 free(pars); free(tacs);
return(1);
113 printf(
"fileNr := %d\n", fileNr);
114 printf(
"newfile := %s\n", newfile);
115 if(pars!=NULL) printf(
"pars := '%s'\n", pars);
116 if(tacs!=NULL) printf(
"tacs := '%s'\n", tacs);
124 if(verbose>0) {printf(
"reading %d files\n", fileNr); fflush(stdout);}
125 PAR *parlist=(
PAR*)malloc(fileNr*
sizeof(
PAR));
127 fprintf(stderr,
"Error: cannot allocate memory.\n"); free(pars); free(tacs);
return(2);
130 for(
int fi=0; fi<fileNr; fi++)
parInit(parlist+fi);
131 for(
int fi=0; fi<fileNr; fi++) {
133 strlcpy(parfile, argv[ffi+fi], FILENAME_MAX);
134 if(verbose>0) {printf(
"%s\n", parfile); fflush(stdout);}
135 if(verbose>2) printf(
"index=%d\n", pfileNr);
136 if(
parRead(parlist+pfileNr, parfile, &status)) {
138 for(
int j=0; j<pfileNr; j++)
parFree(parlist+j);
139 free(parlist); free(pars); free(tacs);
return(2);
142 printf(
" fileformat := %s\n",
parFormattxt(parlist[pfileNr].format));
143 printf(
" parNr := %d\n", parlist[pfileNr].parNr);
144 printf(
" tacNr := %d\n", parlist[pfileNr].tacNr);
146 if(cptr!=NULL) printf(
" studyNr := %s\n", cptr);
152 iftPut(&parlist[pfileNr].h,
"studynr", studynr, 0, NULL);
166 fprintf(stderr,
"Warning: specified parameter(s) not found in %s.\n", parfile);
167 parFree(parlist+pfileNr);
continue;
169 if(parNr<parlist[pfileNr].parNr) {
170 int i=parlist[pfileNr].
parNr-1;
172 if(parlist[pfileNr].n[i].sw==0)
parDeletePar(parlist+pfileNr, i);
175 if(verbose>1) printf(
" parNrFinal := %d\n", parlist[pfileNr].parNr);
190 fprintf(stderr,
"Warning: specified TAC(s) not found in %s.\n", parfile);
191 parFree(parlist+pfileNr);
continue;
193 if(tacNr<parlist[pfileNr].tacNr) {
194 int i=parlist[pfileNr].
tacNr-1;
196 if(parlist[pfileNr].r[i].sw==0)
parDeleteTAC(parlist+pfileNr, i);
199 if(verbose>1) printf(
" tacNrFinal := %d\n", parlist[pfileNr].tacNr);
206 free(pars); free(tacs);
209 fprintf(stderr,
"Error: files do not contain specified TACs or parameters.\n");
210 for(
int j=0; j<fileNr; j++)
parFree(parlist+j);
211 free(parlist);
return(3);
218 if(verbose>0) {printf(
"preparing the collection\n"); fflush(stdout);}
220 if(verbose>1) {printf(
"listing TACs\n"); fflush(stdout);}
222 for(
int fi=0; fi<fileNr; fi++)
223 for(
int ci=0; ci<parlist[fi].
tacNr; ci++)
224 iftPut(&tacnames, parlist[fi].r[ci].name, NULL, 0, NULL);
226 if(verbose>2) {printf(
"TACs:\n");
iftWrite(&tacnames, stdout, NULL); printf(
"\n");}
228 if(verbose>1) {printf(
"listing parameters\n"); fflush(stdout);}
230 for(
int fi=0; fi<fileNr; fi++)
231 for(
int pi=0; pi<parlist[fi].
parNr; pi++)
232 iftPut(&parnames, parlist[fi].n[pi].name, NULL, 0, NULL);
234 if(verbose>2) {printf(
"Parameters:\n");
iftWrite(&parnames, stdout, NULL); printf(
"\n");}
237 printf(
"TACs := %d\n", tacnames.
keyNr);
238 printf(
"Parameters := %d\n", parnames.
keyNr);
242 fprintf(stderr,
"Error: cannot allocate memory.\n");
244 for(
int j=0; j<fileNr; j++)
parFree(parlist+j);
245 free(parlist);
return(4);
251 for(
int i=0; i<parnames.
keyNr; i++)
261 for(
int fi=0; fi<fileNr; fi++) {
262 for(
int ti=0; ti<tacnames.
keyNr; ti++) {
264 for(
int ri=0; ri<parlist[fi].
tacNr; ri++) {
265 if(strcasecmp(parlist[fi].r[ri].name, tacnames.
item[ti].
key)==0) {
271 if(tacnames.
keyNr>1) {
277 for(
int pi=0; pi<parnames.
keyNr; pi++) {
278 for(
int pj=0; pj<parlist[fi].
parNr; pj++)
279 if(strcasecmp(parlist[fi].n[pj].name, parnames.
item[pi].
key)==0)
280 par.
r[par.
tacNr].
p[pi]=parlist[fi].
r[ri].
p[pj];
290 for(
int i=0; i<fileNr; i++)
parFree(parlist+i);
297 if(verbose>1) printf(
" saving\n");
299 FILE *fp=fopen(newfile,
"w");
301 fprintf(stderr,
"Error: cannot open file for writing.\n");
310 if(verbose>0) printf(
"written %s\n", newfile);
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
int iftDeleteDuplicateKeys(IFT *ift, TPCSTATUS *status)
int iftWrite(IFT *ift, FILE *fp, TPCSTATUS *status)
int parDeletePar(PAR *par, int pi)
int parAllocate(PAR *par, int parNr, int tacNr)
char * parIsStudyNr(PAR *par)
int parDeleteTAC(PAR *par, int ti)
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 parFormatFromExtension(const char *s)
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)
size_t strlcat(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.
int studynrFromFilename(const char *fname, char *studynr, int force)
Header file for library libtpcextensions.
#define MAX_TACNAME_LEN
Max length of TAC ID name (not including trailing zero).
#define MAX_STUDYNR_LEN
Define max study number length.
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator).