TPCCLIB
Loading...
Searching...
No Matches
parget.c
Go to the documentation of this file.
1
7/*****************************************************************************/
8#include "tpcclibConfig.h"
9/*****************************************************************************/
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13#include <math.h>
14/*****************************************************************************/
15#include "tpcextensions.h"
16#include "tpcift.h"
17#include "tpcpar.h"
18/*****************************************************************************/
19
20/*****************************************************************************/
21static char *info[] = {
22 "Print to screen the parameter value for specified parameter and TAC,",
23 "based on the name or number of the parameter and TAC in the file.",
24 " ",
25 "Usage: @P [options] parfile parametername tacname",
26 " ",
27 "Options:",
28 " -SD | -CL1 | -CL2",
29 " Parameter SD or CL value is printed instead of parameter itself.",
30 " -stdoptions", // List standard options like --help, -v, etc
31 " ",
32 "Example:",
33 " @P ab123fitk3.res k3 putam",
34 " ",
35 "See also: paradd, parformat, parrenp, parsort, pardiff, rescoll",
36 " ",
37 "Keywords: parameter, tool, reporting, software testing",
38 0};
39/*****************************************************************************/
40
41/*****************************************************************************/
42/* Turn on the globbing of the command line, since it is disabled by default in
43 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
44 In Unix&Linux wildcard command line processing is enabled by default. */
45/*
46#undef _CRT_glob
47#define _CRT_glob -1
48*/
49int _dowildcard = -1;
50/*****************************************************************************/
51
52/*****************************************************************************/
56int main(int argc, char **argv)
57{
58 int ai, help=0, version=0, verbose=1;
59 char parfile[FILENAME_MAX], parname[FILENAME_MAX], tacname[FILENAME_MAX];
60 int printWhat=0; // 0=parameter, 1=SD, 2=CL1, 3=CL2
61
62 /*
63 * Get arguments
64 */
65 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
66 parfile[0]=parname[0]=tacname[0]=(char)0;
67 /* Options */
68 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
69 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
70 char *cptr=argv[ai]+1; if(*cptr=='-') {cptr++; if(!*cptr) continue;}
71 if(!strcasecmp(cptr, "SD")) {printWhat=1; continue;}
72 if(!strcasecmp(cptr, "CL1")) {printWhat=2; continue;}
73 if(!strcasecmp(cptr, "CL2")) {printWhat=3; continue;}
74 if(!strncasecmp(cptr, "PAR", 1)) {printWhat=0; continue;}
75 fprintf(stderr, "Error: invalid option '%s'\n", argv[ai]);
76 return(1);
77 } else break;
78
79 TPCSTATUS status; statusInit(&status);
80 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
81 status.verbose=verbose-1;
82
83 /* Print help or version? */
84 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
85 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
86 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
87
88 /* Process other arguments, starting from the first non-option */
89 if(ai<argc) strlcpy(parfile, argv[ai++], FILENAME_MAX);
90 if(ai<argc) strlcpy(parname, argv[ai++], FILENAME_MAX);
91 if(ai<argc) strlcpy(tacname, argv[ai++], FILENAME_MAX);
92 if(ai<argc) {fprintf(stderr, "Error: too many arguments: '%s'.\n", argv[ai]); return(1);}
93
94 /* Check that we got what we need */
95 if(!tacname[0]) {tpcPrintUsage(argv[0], info, stderr); return(1);}
96
97 /* In verbose mode print arguments and options */
98 if(verbose>1) {
99 printf("parfile := %s\n", parfile);
100 printf("parname := %s\n", parname);
101 printf("tacname := %s\n", tacname);
102 printf("printWhat := %d\n", printWhat);
103 }
104
105
106 /*
107 * Read the file
108 */
109 if(verbose>1) printf("reading %s\n", parfile);
110 PAR par; parInit(&par);
111 if(parRead(&par, parfile, &status)!=TPCERROR_OK) {
112 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
113 parFree(&par); return(2);
114 }
115 if(verbose>2) {
116 printf("fileformat := %s\n", parFormattxt(par.format));
117 printf("parNr := %d\n", par.parNr);
118 printf("tacNr := %d\n", par.tacNr);
119 }
120
121 /*
122 * Select the parameter to be shown
123 */
124 int parNr=0, tacNr=0;
125 parNr=parSelectParameters(&par, parname, 1, &status);
126 tacNr=parSelectTACs(&par, tacname, 1, &status);
127 if(verbose>2) {
128 printf("%d parameter(s) match '%s'\n", parNr, parname);
129 printf("%d TAC(s) match '%s'\n", tacNr, tacname);
130 }
131 if(parNr==0) fprintf(stderr, "Error: no parameter matches '%s'.\n", parname);
132 if(tacNr==0) fprintf(stderr, "Error: no TAC matches '%s'.\n", tacname);
133 if(parNr==0 || tacNr==0) {parFree(&par); return(3);}
134 if(tacNr>1 || parNr>1) {
135 fprintf(stderr, "Error: cannot identify a single parameter value.\n");
136 printf("The following parameters would match the given parameter and TAC name:\n");
137 for(int pi=0; pi<par.parNr; pi++) if(par.n[pi].sw) {
138 for(int ti=0; ti<par.tacNr; ti++) if(par.r[ti].sw)
139 printf(" %s\t%s\n", par.n[pi].name, par.r[ti].name);
140 }
141 parFree(&par); return(3);
142 }
143
144 /*
145 * Get and print the selected parameter value
146 */
147 double v=nan("");
148 for(int pi=0; pi<par.parNr; pi++) if(par.n[pi].sw) {
149 for(int ti=0; ti<par.tacNr; ti++) if(par.r[ti].sw) {
150 if(printWhat==1) v=par.r[ti].sd[pi];
151 else if(printWhat==2) v=par.r[ti].cl1[pi];
152 else if(printWhat==3) v=par.r[ti].cl2[pi];
153 else v=par.r[ti].p[pi];
154 }
155 }
156 /* Free memory */
157 parFree(&par);
158 /* Check */
159 if(isnan(v)) {fprintf(stderr, "Error: requested a missing value.\n"); return(5);}
160 /* and print */
161 fprintf(stdout, "%g\n", v);
162
163 return(0);
164}
165/*****************************************************************************/
166
167/*****************************************************************************/
void parFree(PAR *par)
Definition par.c:75
void parInit(PAR *par)
Definition par.c:25
char * parFormattxt(parformat c)
Definition pario.c:59
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
Definition pario.c:232
int parSelectTACs(PAR *d, const char *region_name, int reset, TPCSTATUS *status)
Definition parselect.c:24
int parSelectParameters(PAR *d, const char *par_name, int reset, TPCSTATUS *status)
Definition parselect.c:120
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:47
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:169
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:339
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:114
void statusInit(TPCSTATUS *s)
Definition statusmsg.c:104
char * errorMsg(tpcerror e)
Definition statusmsg.c:68
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition statusmsg.c:142
size_t strlcpy(char *dst, const char *src, size_t dstsize)
Definition stringext.c:632
Definition tpcpar.h:100
int format
Definition tpcpar.h:102
int parNr
Definition tpcpar.h:108
int tacNr
Definition tpcpar.h:104
PARR * r
Definition tpcpar.h:114
PARN * n
Definition tpcpar.h:112
char sw
Definition tpcpar.h:94
char name[MAX_PARNAME_LEN+1]
Definition tpcpar.h:82
char name[MAX_TACNAME_LEN+1]
Definition tpcpar.h:50
double * cl2
Definition tpcpar.h:70
char sw
Definition tpcpar.h:74
double * p
Definition tpcpar.h:64
double * sd
Definition tpcpar.h:66
double * cl1
Definition tpcpar.h:68
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
@ TPCERROR_OK
No error.
Header file for library libtpcift.
Header file for libtpcpar.