TPCCLIB
Toggle main menu visibility
Loading...
Searching...
No Matches
libtpcpar
parxmlio.c
Go to the documentation of this file.
1
4
/*****************************************************************************/
5
#include "tpcclibConfig.h"
6
/*****************************************************************************/
7
#include "
tpcextensions.h
"
8
#include "
tpcift.h
"
9
#include "
tpccsv.h
"
10
/*****************************************************************************/
11
#include <stdio.h>
12
#include <stdlib.h>
13
#include <math.h>
14
#include <time.h>
15
#include <string.h>
16
/*****************************************************************************/
17
#include "
tpcpar.h
"
18
/*****************************************************************************/
19
20
/*****************************************************************************/
26
int
parWriteXML
(
28
PAR
*par,
30
FILE *fp,
32
TPCSTATUS
*status
33
) {
34
int
verbose=0;
if
(status!=NULL) verbose=status->
verbose
;
35
if
(verbose>0) printf(
"%s()\n"
, __func__);
36
if
(fp==NULL) {
37
statusSet
(status, __func__, __FILE__, __LINE__,
TPCERROR_CANNOT_WRITE
);
38
return
TPCERROR_CANNOT_WRITE
;
39
}
40
if
(par==NULL || par->
tacNr
<1 || par->
parNr
<1) {
41
statusSet
(status, __func__, __FILE__, __LINE__,
TPCERROR_NO_DATA
);
42
return
TPCERROR_NO_DATA
;
43
}
44
45
/* Calculate column number */
46
int
colNr=par->
parNr
+1;
// including tac name
47
if
(
parIsModel
(par)>0) colNr++;
48
for
(
int
pi=0; pi<par->
parNr
; pi++) {
49
if
(
parSDWithPar
(par, pi)) colNr++;
50
if
(
parCLWithPar
(par, pi)) colNr+=2;
51
}
52
if
(
parIsWSS
(par)) colNr++;
53
if
(
parIsFitRange
(par)>0) colNr+=2;
54
if
(
parIsDataNr
(par)>0) colNr++;
55
if
(
parIsFitNr
(par)>0) colNr++;
56
if
(verbose>1) printf(
" colNr := %d\n"
, colNr);
57
58
/* Write XML header */
59
if
(verbose>2) printf(
"writing XML header\n"
);
60
int
n=fprintf(fp,
"<?xml version=\"1.0\"?>\n"
);
61
if
(n<1) {
62
statusSet
(status, __func__, __FILE__, __LINE__,
TPCERROR_CANNOT_WRITE
);
63
return
TPCERROR_CANNOT_WRITE
;
64
}
65
fprintf(fp,
"<ss:Workbook xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">\n"
);
66
fprintf(fp,
" <ss:Styles>\n"
);
67
fprintf(fp,
" <ss:Style ss:ID=\"1\">\n"
);
68
fprintf(fp,
" <ss:Font ss:Bold=\"1\"/>\n"
);
69
fprintf(fp,
" </ss:Style>\n"
);
70
fprintf(fp,
" </ss:Styles>\n"
);
71
fprintf(fp,
" <ss:Worksheet ss:Name=\"Sheet1\">\n"
);
72
fprintf(fp,
" <ss:Table>\n"
);
73
74
/* Set column widths */
75
for
(
int
i=0; i<colNr; i++) fprintf(fp,
" <ss:Column ss:Width=\"80\"/>\n"
);
76
77
/* Write the title line */
78
if
(verbose>2) printf(
"writing title line\n"
);
79
fprintf(fp,
" <ss:Row ss:StyleID=\"1\">\n"
);
80
fprintf(fp,
" <ss:Cell>\n"
);
81
fprintf(fp,
" <ss:Data ss:Type=\"String\">Parameters</ss:Data>\n"
);
82
fprintf(fp,
" </ss:Cell>\n"
);
83
/* model id */
84
if
(
parIsModel
(par)>0) {
85
fprintf(fp,
" <ss:Cell>\n"
);
86
fprintf(fp,
" <ss:Data ss:Type=\"String\">Model</ss:Data>\n"
);
87
fprintf(fp,
" </ss:Cell>\n"
);
88
}
89
/* parameter names with units, and SD and/or CLs, if available */
90
for
(
int
pi=0; pi<par->
parNr
; pi++) {
91
if
(par->
n
[pi].
unit
==
UNIT_UNKNOWN
) {
92
fprintf(fp,
" <ss:Cell>\n"
);
93
fprintf(fp,
" <ss:Data ss:Type=\"String\">%s</ss:Data>\n"
, par->
n
[pi].
name
);
94
fprintf(fp,
" </ss:Cell>\n"
);
95
}
else
{
96
fprintf(fp,
" <ss:Cell>\n"
);
97
fprintf(fp,
" <ss:Data ss:Type=\"String\">%s[%s]</ss:Data>\n"
,
98
par->
n
[pi].
name
,
unitName
(par->
n
[pi].
unit
));
99
fprintf(fp,
" </ss:Cell>\n"
);
100
}
101
if
(
parSDWithPar
(par, pi)) {
102
fprintf(fp,
" <ss:Cell>\n"
);
103
fprintf(fp,
" <ss:Data ss:Type=\"String\">SD</ss:Data>\n"
);
104
fprintf(fp,
" </ss:Cell>\n"
);
105
}
106
if
(
parCLWithPar
(par, pi)) {
107
fprintf(fp,
" <ss:Cell>\n"
);
108
fprintf(fp,
" <ss:Data ss:Type=\"String\">95%%CL1</ss:Data>\n"
);
109
fprintf(fp,
" </ss:Cell>\n"
);
110
fprintf(fp,
" <ss:Cell>\n"
);
111
fprintf(fp,
" <ss:Data ss:Type=\"String\">95%%CL2</ss:Data>\n"
);
112
fprintf(fp,
" </ss:Cell>\n"
);
113
}
114
}
115
if
(
parIsWSS
(par)) {
116
fprintf(fp,
" <ss:Cell>\n"
);
117
fprintf(fp,
" <ss:Data ss:Type=\"String\">WSS</ss:Data>\n"
);
118
fprintf(fp,
" </ss:Cell>\n"
);
119
}
120
if
(
parIsFitRange
(par)>0) {
121
fprintf(fp,
" <ss:Cell>\n"
);
122
fprintf(fp,
" <ss:Data ss:Type=\"String\">Start[min]</ss:Data>\n"
);
123
fprintf(fp,
" </ss:Cell>\n"
);
124
fprintf(fp,
" <ss:Cell>\n"
);
125
fprintf(fp,
" <ss:Data ss:Type=\"String\">End[min]</ss:Data>\n"
);
126
fprintf(fp,
" </ss:Cell>\n"
);
127
}
128
if
(
parIsDataNr
(par)>0) {
129
fprintf(fp,
" <ss:Cell>\n"
);
130
fprintf(fp,
" <ss:Data ss:Type=\"String\">DataNr</ss:Data>\n"
);
131
fprintf(fp,
" </ss:Cell>\n"
);
132
}
133
if
(
parIsFitNr
(par)>0) {
134
fprintf(fp,
" <ss:Cell>\n"
);
135
fprintf(fp,
" <ss:Data ss:Type=\"String\">FitNr</ss:Data>\n"
);
136
fprintf(fp,
" </ss:Cell>\n"
);
137
}
138
/* End the title line */
139
n=fprintf(fp,
" </ss:Row>\n"
);
140
if
(n<1) {
141
statusSet
(status, __func__, __FILE__, __LINE__,
TPCERROR_CANNOT_WRITE
);
142
return
TPCERROR_CANNOT_WRITE
;
143
}
144
145
/* Write parameters */
146
if
(verbose>2) printf(
"writing data table\n"
);
147
for
(
int
ri=0; ri<par->
tacNr
; ri++) {
148
if
(verbose>3) printf(
" for region %d\n"
, 1+ri);
149
/* Start the line */
150
fprintf(fp,
" <ss:Row>\n"
);
151
/* Region names and parameter values */
152
fprintf(fp,
" <ss:Cell>\n"
);
153
char
*senc=
strEncodeForXML
(par->
r
[ri].
name
);
154
if
(senc==NULL) fprintf(fp,
" <ss:Data ss:Type=\"String\">%s</ss:Data>\n"
, par->
r
[ri].
name
);
155
else
{fprintf(fp,
" <ss:Data ss:Type=\"String\">%s</ss:Data>\n"
, senc); free(senc);}
156
fprintf(fp,
" </ss:Cell>\n"
);
157
if
(
parIsModel
(par)>0) {
158
fprintf(fp,
" <ss:Cell>\n"
);
159
fprintf(fp,
" <ss:Data ss:Type=\"String\">%s</ss:Data>\n"
,
modelCode
(par->
r
[ri].
model
));
160
fprintf(fp,
" </ss:Cell>\n"
);
161
}
162
for
(
int
pi=0; pi<par->
parNr
; pi++) {
163
fprintf(fp,
" <ss:Cell>\n"
);
164
if
(isnan(par->
r
[ri].
p
[pi])) fprintf(fp,
" <ss:Data ss:Type=\"Number\"></ss:Data>\n"
);
165
else
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n"
, par->
r
[ri].
p
[pi]);
166
fprintf(fp,
" </ss:Cell>\n"
);
167
if
(
parSDWithPar
(par, pi)) {
168
fprintf(fp,
" <ss:Cell>\n"
);
169
if
(isnan(par->
r
[ri].
sd
[pi])) fprintf(fp,
" <ss:Data ss:Type=\"Number\"></ss:Data>\n"
);
170
else
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n"
, par->
r
[ri].
sd
[pi]);
171
fprintf(fp,
" </ss:Cell>\n"
);
172
}
173
if
(
parCLWithPar
(par, pi)) {
174
fprintf(fp,
" <ss:Cell>\n"
);
175
if
(isnan(par->
r
[ri].
cl1
[pi])) fprintf(fp,
" <ss:Data ss:Type=\"Number\"></ss:Data>\n"
);
176
else
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n"
, par->
r
[ri].
cl1
[pi]);
177
fprintf(fp,
" </ss:Cell>\n"
);
178
fprintf(fp,
" <ss:Cell>\n"
);
179
if
(isnan(par->
r
[ri].
cl2
[pi])) fprintf(fp,
" <ss:Data ss:Type=\"Number\"></ss:Data>\n"
);
180
else
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n"
, par->
r
[ri].
cl2
[pi]);
181
fprintf(fp,
" </ss:Cell>\n"
);
182
}
183
}
184
/* WSS etc */
185
if
(
parIsWSS
(par)) {
186
fprintf(fp,
" <ss:Cell>\n"
);
187
if
(isnan(par->
r
[ri].
wss
)) fprintf(fp,
" <ss:Data ss:Type=\"Number\"></ss:Data>\n"
);
188
else
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n"
, par->
r
[ri].
wss
);
189
fprintf(fp,
" </ss:Cell>\n"
);
190
}
191
if
(
parIsFitRange
(par)>0) {
192
fprintf(fp,
" <ss:Cell>\n"
);
193
if
(isnan(par->
r
[ri].
start
)) fprintf(fp,
" <ss:Data ss:Type=\"Number\"></ss:Data>\n"
);
194
else
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n"
, par->
r
[ri].
start
);
195
fprintf(fp,
" </ss:Cell>\n"
);
196
fprintf(fp,
" <ss:Cell>\n"
);
197
if
(isnan(par->
r
[ri].
end
)) fprintf(fp,
" <ss:Data ss:Type=\"Number\"></ss:Data>\n"
);
198
else
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%g</ss:Data>\n"
, par->
r
[ri].
end
);
199
fprintf(fp,
" </ss:Cell>\n"
);
200
}
201
if
(
parIsDataNr
(par)>0) {
202
fprintf(fp,
" <ss:Cell>\n"
);
203
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%d</ss:Data>\n"
, par->
r
[ri].
dataNr
);
204
fprintf(fp,
" </ss:Cell>\n"
);
205
}
206
if
(
parIsFitNr
(par)>0) {
207
fprintf(fp,
" <ss:Cell>\n"
);
208
fprintf(fp,
" <ss:Data ss:Type=\"Number\">%d</ss:Data>\n"
, par->
r
[ri].
fitNr
);
209
fprintf(fp,
" </ss:Cell>\n"
);
210
}
211
/* End the line */
212
n=fprintf(fp,
" </ss:Row>\n"
);
213
if
(n<1) {
214
statusSet
(status, __func__, __FILE__, __LINE__,
TPCERROR_CANNOT_WRITE
);
215
return
TPCERROR_CANNOT_WRITE
;
216
}
217
}
218
219
/* Write XML end part */
220
fprintf(fp,
" </ss:Table>\n"
);
221
fprintf(fp,
" </ss:Worksheet>\n"
);
222
n=fprintf(fp,
"</ss:Workbook>\n"
);
223
if
(n<1) {
224
statusSet
(status, __func__, __FILE__, __LINE__,
TPCERROR_CANNOT_WRITE
);
225
return
TPCERROR_CANNOT_WRITE
;
226
}
227
228
statusSet
(status, __func__, __FILE__, __LINE__,
TPCERROR_OK
);
229
return
(
TPCERROR_OK
);
230
}
231
/*****************************************************************************/
232
233
/*****************************************************************************/
modelCode
char * modelCode(const unsigned int i)
Definition
modell.c:176
parIsFitRange
int parIsFitRange(PAR *par)
Definition
par.c:267
parSDWithPar
int parSDWithPar(PAR *par, int pi)
Definition
par.c:307
parCLWithPar
int parCLWithPar(PAR *par, int pi)
Definition
par.c:325
parIsFitNr
int parIsFitNr(PAR *par)
Definition
par.c:343
parIsWSS
int parIsWSS(PAR *par)
Definition
par.c:252
parIsDataNr
int parIsDataNr(PAR *par)
Definition
par.c:362
parIsModel
int parIsModel(PAR *par)
Definition
par.c:288
parWriteXML
int parWriteXML(PAR *par, FILE *fp, TPCSTATUS *status)
Definition
parxmlio.c:26
statusSet
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition
statusmsg.c:142
strEncodeForXML
char * strEncodeForXML(const char *s)
Definition
stringext.c:729
PAR
Definition
tpcpar.h:100
PAR::parNr
int parNr
Definition
tpcpar.h:108
PAR::tacNr
int tacNr
Definition
tpcpar.h:104
PAR::r
PARR * r
Definition
tpcpar.h:114
PAR::n
PARN * n
Definition
tpcpar.h:112
PARN::unit
int unit
Definition
tpcpar.h:86
PARN::name
char name[MAX_PARNAME_LEN+1]
Definition
tpcpar.h:82
PARR::wss
double wss
Definition
tpcpar.h:72
PARR::fitNr
int fitNr
Definition
tpcpar.h:58
PARR::name
char name[MAX_TACNAME_LEN+1]
Definition
tpcpar.h:50
PARR::dataNr
int dataNr
Definition
tpcpar.h:62
PARR::cl2
double * cl2
Definition
tpcpar.h:70
PARR::model
unsigned int model
Definition
tpcpar.h:48
PARR::p
double * p
Definition
tpcpar.h:64
PARR::start
double start
Definition
tpcpar.h:52
PARR::sd
double * sd
Definition
tpcpar.h:66
PARR::cl1
double * cl1
Definition
tpcpar.h:68
PARR::end
double end
Definition
tpcpar.h:54
TPCSTATUS
Definition
tpcextensions.h:241
TPCSTATUS::verbose
int verbose
Verbose level, used by statusPrint() etc.
Definition
tpcextensions.h:242
tpccsv.h
Header file for library libtpccsv.
tpcextensions.h
Header file for library libtpcextensions.
UNIT_UNKNOWN
@ UNIT_UNKNOWN
Unknown unit.
Definition
tpcextensions.h:85
TPCERROR_OK
@ TPCERROR_OK
No error.
Definition
tpcextensions.h:191
TPCERROR_NO_DATA
@ TPCERROR_NO_DATA
File contains no data.
Definition
tpcextensions.h:203
TPCERROR_CANNOT_WRITE
@ TPCERROR_CANNOT_WRITE
Cannot write file.
Definition
tpcextensions.h:199
unitName
char * unitName(int unit_code)
Definition
units.c:143
tpcift.h
Header file for library libtpcift.
tpcpar.h
Header file for libtpcpar.
Generated on
for TPCCLIB by
1.17.0