TPCCLIB
Loading...
Searching...
No Matches
par.c File Reference

PAR struct processing. More...

#include "tpcclibConfig.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include "tpcextensions.h"
#include "tpcmodels.h"
#include "tpcift.h"
#include "tpcpar.h"

Go to the source code of this file.

Functions

void parInit (PAR *par)
void parrInit (PARR *parr)
void parnInit (PARN *parn)
void parFree (PAR *par)
void parrFree (PARR *parr)
int parAllocate (PAR *par, int parNr, int tacNr)
int parrAllocate (PARR *parr, int parNr)
int parAllocateMore (PAR *par, int parNr, int tacNr)
int parIsWSS (PAR *par)
int parIsFitRange (PAR *par)
int parIsModel (PAR *par)
int parSDWithPar (PAR *par, int pi)
int parCLWithPar (PAR *par, int pi)
int parIsFitNr (PAR *par)
int parIsDataNr (PAR *par)
char * parIsOptcrit (PAR *par)
char * parIsStudyNr (PAR *par)
int parSetStudyNr (PAR *par, const char *s)
void parEnsureNames (PAR *d)
int parDeletePar (PAR *par, int pi)
int parDeleteTAC (PAR *par, int ti)

Detailed Description

PAR struct processing.

Definition in file par.c.

Function Documentation

◆ parAllocate()

int parAllocate ( PAR * par,
int parNr,
int tacNr )

Allocate memory for PAR data.

Any previous contents are deleted.

Returns
Returns TPCERROR status.
See also
parInit, parFree, parAllocateMore, parAllocateWithTAC
Parameters
parPointer to initiated PAR struct data; any old contents are deleted. tacNr and parNr inside the struct are set to or kept at zero.
parNrNr of parameters to allocate
tacNrNr of parameter sets (TACs) to allocate

Definition at line 108 of file par.c.

116 {
117 if(par==NULL) return TPCERROR_FAIL;
118 /* Delete any previous contents */
119 parFree(par);
120 /* If no memory is requested, then just return */
121 if(parNr<1 && tacNr<1) return TPCERROR_OK;
122 if(parNr<1 || tacNr<1) return TPCERROR_FAIL;
123
124 /* Allocate memory for PARR data */
125 int ret;
126 par->r=(PARR*)malloc(tacNr*sizeof(PARR));
127 if(par->r==NULL) return TPCERROR_OUT_OF_MEMORY;
128 for(int i=0; i<tacNr; i++) {
129 parrInit(&par->r[i]);
130 ret=parrAllocate(par->r+i, parNr); if(ret!=TPCERROR_OK) return ret;
131 }
132 par->_tacNr=tacNr;
133
134 /* Allocate memory for parameter names and units */
135 par->n=(PARN*)malloc(parNr*sizeof(PARN));
136 if(par->n==NULL) return TPCERROR_OUT_OF_MEMORY;
137 for(int i=0; i<parNr; i++) parnInit(&par->n[i]);
138 par->_parNr=parNr;
139
140 return TPCERROR_OK;
141}
void parFree(PAR *par)
Definition par.c:75
int parrAllocate(PARR *parr, int parNr)
Definition par.c:150
void parrInit(PARR *parr)
Definition par.c:41
void parnInit(PARN *parn)
Definition par.c:59
int _parNr
Definition tpcpar.h:110
PARR * r
Definition tpcpar.h:114
int _tacNr
Definition tpcpar.h:106
PARN * n
Definition tpcpar.h:112
Definition tpcpar.h:80
Definition tpcpar.h:46
@ TPCERROR_FAIL
General error.
@ TPCERROR_OUT_OF_MEMORY
Cannot allocate memory.
@ TPCERROR_OK
No error.

Referenced by parAllocate(), parAllocateWithTAC(), parExamplePerfectBolus(), parExampleRadiowaterBolus(), parExampleTTACs(), parFromIFT(), parReadCSV(), parReadFIT(), and parReadRES().

◆ parAllocateMore()

int parAllocateMore ( PAR * par,
int parNr,
int tacNr )

Allocate more memory for PAR data. Previous contents are preserved.

Returns
Returns TPCERROR status.
See also
parAllocate, parInit, parRead, parFree
Parameters
parPointer to initiated and previously allocated PAR struct data; any old contents are preserved, including tacNr and parNr.
parNrNr of additional parameters to allocate; if struct contains unused space for requested parameters already, then nothing is done.
tacNrNr of additional parameter sets (TACs) to allocate; if struct contains unused space for requested parameters already, then nothing is done.

Definition at line 183 of file par.c.

193 {
194 if(par==NULL) return TPCERROR_FAIL;
195 if(par->_parNr<1 || par->_tacNr<1) return TPCERROR_FAIL;
196 if(parNr<0 || tacNr<0) return TPCERROR_FAIL;
197 /* Check if there is enough space already */
198 int newTacNr, addTacNr, newParNr, addParNr;
199 newTacNr=par->tacNr+tacNr; addTacNr=newTacNr-par->_tacNr;
200 newParNr=par->parNr+parNr; addParNr=newParNr-par->_parNr;
201 if(addTacNr<=0 && addParNr<=0) return TPCERROR_OK;
202
203 /* Reallocate memory for parameter names and units, if necessary */
204 if(addParNr>0) {
205 PARN *parnPtr;
206 parnPtr=realloc(par->n, sizeof(PARN)*newParNr);
207 if(parnPtr==NULL) return TPCERROR_OUT_OF_MEMORY;
208 par->n=parnPtr;
209 parnPtr+=par->_parNr; for(int i=0; i<addParNr; i++) parnInit(parnPtr++);
210 }
211
212 /* Reallocate memory for parameters of previous TACs, if necessary */
213 if(addParNr>0) {
214 int i, j;
215 for(i=0; i<par->tacNr; i++) {
216 par->r[i].p=realloc(par->r[i].p, sizeof(double)*newParNr);
217 par->r[i].sd=realloc(par->r[i].sd, sizeof(double)*newParNr);
218 par->r[i].cl1=realloc(par->r[i].cl1, sizeof(double)*newParNr);
219 par->r[i].cl2=realloc(par->r[i].cl2, sizeof(double)*newParNr);
220 if(par->r[i].p==NULL || par->r[i].sd==NULL || par->r[i].cl1==NULL || par->r[i].cl2==NULL)
222 for(j=par->parNr; j<newParNr; j++)
223 par->r[i].p[j]=par->r[i].sd[j]=par->r[i].cl1[j]=par->r[i].cl2[j]=nan("");
224 }
225 }
226
227 /* Allocate memory for more TACs, if necessary */
228 if(addTacNr>0) {
229 PARR *parrPtr;
230 parrPtr=realloc(par->r, sizeof(PARR)*newTacNr);
231 if(parrPtr==NULL) return TPCERROR_OUT_OF_MEMORY;
232 par->r=parrPtr;
233 parrPtr+=par->_tacNr;
234 for(int i=0; i<addTacNr; i++, parrPtr++) {
235 parrInit(parrPtr);
236 if(parrAllocate(parrPtr, newParNr)!=TPCERROR_OK)
238 }
239 }
240
241 par->_parNr=newParNr;
242 par->_tacNr=newTacNr;
243 return TPCERROR_OK;
244}
int parNr
Definition tpcpar.h:108
int tacNr
Definition tpcpar.h:104
double * cl2
Definition tpcpar.h:70
double * p
Definition tpcpar.h:64
double * sd
Definition tpcpar.h:66
double * cl1
Definition tpcpar.h:68

Referenced by parAllocateMore(), and parCombineTACs().

◆ parCLWithPar()

int parCLWithPar ( PAR * par,
int pi )

Check if specified parameter has confidence limits in at least one of the regions.

See also
parSDWithPar, parIsWSS
Returns
Returns 1 if CLs exist, and 0 if not (or in case of an error).
Parameters
parPointer to parameter data.
piIndex of parameter [0..parNr-1] to check.

Definition at line 326 of file par.c.

331 {
332 if(par==NULL || par->tacNr<1 || pi<0 || pi>=par->parNr) return(0);
333 for(int i=0; i<par->tacNr; i++)
334 if(!isnan(par->r[i].cl1[pi]) && !isnan(par->r[i].cl2[pi])) return(1);
335 return(0);
336}

Referenced by parCLWithPar(), parWriteCSV(), and parWriteXML().

◆ parDeletePar()

int parDeletePar ( PAR * par,
int pi )

Deletes the specified parameter (column) from data.

Returns
Returns TPCERROR status.
See also
parDeleteTAC
Parameters
parPointer to parameter data.
piIndex of parameter [0..parNr-1] to remove.

Definition at line 479 of file par.c.

484 {
485 if(par==NULL || par->tacNr<1 || pi<0 || pi>=par->parNr) return(TPCERROR_FAIL);
486 if(pi==par->parNr-1) {par->parNr--; return(TPCERROR_OK);}
487
488 int i, j;
489
490 /* Parameter name and unit */
491 PARN parn;
492 memcpy(&parn, &par->n[pi], sizeof(PARN));
493 for(i=pi+1; i<par->parNr; i++)
494 memcpy(&par->n[i-1], &par->n[i], sizeof(PARN));
495 memcpy(&par->n[par->parNr-1], &parn, sizeof(PARN));
496
497 /* Parameter values */
498 double p, sd, cl1, cl2;
499 for(j=0; j<par->tacNr; j++) {
500 p=par->r[j].p[pi]; sd=par->r[j].sd[pi];
501 cl1=par->r[j].cl1[pi]; cl2=par->r[j].cl2[pi];
502 for(i=pi+1; i<par->parNr; i++) {
503 par->r[j].p[i-1]=par->r[j].p[i]; par->r[j].sd[i-1]=par->r[j].sd[i];
504 par->r[j].cl1[i-1]=par->r[j].cl1[i]; par->r[j].cl2[i-1]=par->r[j].cl2[i];
505 }
506 par->r[j].p[par->parNr-1]=p; par->r[j].sd[par->parNr-1]=sd;
507 par->r[j].cl1[par->parNr-1]=cl1; par->r[j].cl2[par->parNr-1]=cl2;
508 }
509
510 par->parNr--;
511 return(TPCERROR_OK);
512}

Referenced by parDeletePar(), parReadCSV(), and parReadRES().

◆ parDeleteTAC()

int parDeleteTAC ( PAR * par,
int ti )

Deletes the specified TAC (row) from data.

Returns
Returns TPCERROR status.
See also
parDeletePar, parSortByName
Parameters
parPointer to parameter data.
tiIndex of TAC [0..tacNr-1] to remove.

Definition at line 520 of file par.c.

525 {
526 if(par==NULL || par->tacNr<1 || ti<0 || ti>=par->tacNr) return(TPCERROR_FAIL);
527 /* Free the memory allocated for the TAC */
528 parrFree(par->r+ti);
529 /* If the last TAC is to be deleted, then just reduce the tacNr */
530 if(ti==par->tacNr-1) {par->tacNr--; return(TPCERROR_OK);}
531 /* Otherwise move the following TACs in its place */
532 for(int i=ti+1; i<par->tacNr; i++) par->r[i-1]=par->r[i];
533 par->tacNr--; parrInit(par->r+par->tacNr);
534 return(TPCERROR_OK);
535}
void parrFree(PARR *parr)
Definition par.c:87

Referenced by parDeleteTAC().

◆ parEnsureNames()

void parEnsureNames ( PAR * d)

Ensure that PAR struct contains a name for each TAC and parameters. If not available, then index+1 is written as name.

See also
parSetStudyNr, parSortByName
Parameters
dPointer to parameter data.

Definition at line 450 of file par.c.

453 {
454 if(d==NULL || d->tacNr<1 || d->parNr<1) return;
455 /* Ensure TAC names */
456 int u, n;
457 u=d->tacNr; n=1; while((u/=10)>=1) n++;
459 for(int i=0; i<d->tacNr; i++) {
460 if(strlen(d->r[i].name)<1 || strcmp(d->r[i].name, ".")==0)
461 sprintf(d->r[i].name, "%0*d", n, 1+i);
462 }
463 /* Ensure parameter names */
464 u=d->parNr; n=1; while((u/=10)>=1) n++;
466 for(int i=0; i<d->parNr; i++) {
467 if(strlen(d->n[i].name)<1 || strcmp(d->n[i].name, ".")==0)
468 sprintf(d->n[i].name, "P%0*d", n, 1+i);
469 }
470 return;
471}
char name[MAX_PARNAME_LEN+1]
Definition tpcpar.h:82
char name[MAX_TACNAME_LEN+1]
Definition tpcpar.h:50
#define MAX_TACNAME_LEN
Max length of TAC ID name (not including trailing zero).
#define MAX_PARNAME_LEN
Max string length for PAR name.

Referenced by parEnsureNames().

◆ parFree()

void parFree ( PAR * par)

Free memory allocated for PAR. All data is cleared.

See also
parInit, parAllocate, parRead
Parameters
parPointer to PAR struct

Definition at line 75 of file par.c.

78 {
79 if(par==NULL) return;
80 for(int i=0; i<par->_tacNr; i++) parrFree(par->r+i);
81 free(par->r);
82 free(par->n);
83 iftFree(&par->h);
84 parInit(par);
85}
void iftFree(IFT *ift)
Definition ift.c:37
void parInit(PAR *par)
Definition par.c:25
IFT h
Optional (but often useful) header information.
Definition tpcpar.h:147

Referenced by parAllocate(), parFree(), parFromIFT(), parRead(), parReadCSV(), parReadFIT(), and parReadRES().

◆ parInit()

void parInit ( PAR * par)

Initiate the PAR struct before any use.

Author
Vesa Oikonen
See also
parrInit, parnInit, parFree, parAllocate, parRead
Parameters
parPointer to PAR

Definition at line 25 of file par.c.

28 {
29 if(par==NULL) return;
31 par->tacNr=par->_tacNr=0;
32 par->parNr=par->_parNr=0;
33 par->n=NULL;
34 par->r=NULL;
35 iftInit(&par->h);
36}
void iftInit(IFT *ift)
Definition ift.c:21
int format
Definition tpcpar.h:102
@ PAR_FORMAT_UNKNOWN
Unknown format.
Definition tpcpar.h:28

Referenced by parFree(), and parInit().

◆ parIsDataNr()

int parIsDataNr ( PAR * par)

Check if any of parameter sets has dataNr specified.

See also
parIsFitNr, parIsWSS
Returns
Returns 0 if not, 1 if the same in each set, and 2 if variable.
Parameters
parPointer to parameter data

Definition at line 363 of file par.c.

366 {
367 if(par==NULL || par->tacNr<1) return(0);
368 int ri, ret=0;
369 for(ri=0; ri<par->tacNr; ri++) {
370 if(ret==0 && par->r[ri].dataNr>0) ret=1;
371 if(ri>0 && par->r[ri].dataNr!=par->r[ri-1].dataNr) {ret=2; break;}
372 }
373 return(ret);
374}
int dataNr
Definition tpcpar.h:62

Referenced by parIsDataNr(), parToIFT(), parWriteCSV(), and parWriteXML().

◆ parIsFitNr()

int parIsFitNr ( PAR * par)

Check if any of parameter sets has fitNr specified.

See also
parIsDataNr, parIsWSS
Returns
Returns 0 if not, 1 if the same in each set, and 2 if variable.
Parameters
parPointer to parameter data.

Definition at line 344 of file par.c.

347 {
348 if(par==NULL || par->tacNr<1) return(0);
349 int ri, ret=0;
350 for(ri=0; ri<par->tacNr; ri++) {
351 if(ret==0 && par->r[ri].fitNr>0) ret=1;
352 if(ri>0 && par->r[ri].fitNr!=par->r[ri-1].fitNr) {ret=2; break;}
353 }
354 return(ret);
355}
int fitNr
Definition tpcpar.h:58

Referenced by parIsFitNr(), parToIFT(), parWriteCSV(), and parWriteXML().

◆ parIsFitRange()

int parIsFitRange ( PAR * par)

Check if any of parameter sets has fit range specified.

See also
parIsFitNr, parIsDataNr, parIsWSS
Returns
Returns 0 if not, 1 if the same in each set, and 2 if variable.
Parameters
parPointer to parameter data.

Definition at line 267 of file par.c.

270 {
271 if(par==NULL || par->tacNr<1) return(0);
272 int ri, ret=0;
273 for(ri=0; ri<par->tacNr; ri++) {
274 if(!isnan(par->r[ri].start) || !isnan(par->r[ri].end)) ret=1;
275 if(ri==0 || ret==0) continue;
276 if(!doubleMatch(par->r[ri].start, par->r[0].start, 0.01)) {ret=2; break;}
277 if(!doubleMatch(par->r[ri].end, par->r[0].end, 0.01)) {ret=2; break;}
278 }
279 return(ret);
280}
int doubleMatch(const double v1, const double v2, const double lim)
Definition doubleutil.c:27
double start
Definition tpcpar.h:52
double end
Definition tpcpar.h:54

Referenced by parIsFitRange(), parToIFT(), parWriteCSV(), and parWriteXML().

◆ parIsModel()

int parIsModel ( PAR * par)

Check if any of parameter sets has model id specified.

See also
parIsFitNr, parIsWSS, parRead, parIsOptcrit
Returns
Returns 0 if not, 1 if the same in each set, and 2 if variable.
Parameters
parPointer to parameter data.

Definition at line 288 of file par.c.

291 {
292 if(par==NULL || par->tacNr<1) return(0);
293 int ret=0;
294 unsigned int mn=modelNr();;
295 for(int ri=0; ri<par->tacNr; ri++) {
296 if(ret==0 && par->r[ri].model>0 && par->r[ri].model<=mn) ret=1;
297 if(ri>0 && par->r[ri].model!=par->r[ri-1].model) {ret=2; break;}
298 }
299 return(ret);
300}
unsigned int modelNr()
Definition modell.c:162
unsigned int model
Definition tpcpar.h:48

Referenced by parIsModel(), parToIFT(), parWriteCSV(), and parWriteXML().

◆ parIsOptcrit()

char * parIsOptcrit ( PAR * par)

Check if PAR data contains optimality criterion.

See also
parIsModel, parIsWSS, studynrFromFilename
Returns
Returns pointer to optimization criterion name, or NULL if not found.
Parameters
parPointer to parameter data.

Definition at line 382 of file par.c.

385 {
386 if(par==NULL || par->h.keyNr<1) return((char*)NULL);
387 int li=iftFindKey(&par->h, "optimality_criterion", 0);
388 if(li<0) li=iftFindKey(&par->h, "optcrit", 0);
389 if(li<0) return((char*)NULL);
390 if(par->h.item[li].value==NULL || strlen(par->h.item[li].value)<1) return((char*)NULL);
391 return(par->h.item[li].value);
392}
int iftFindKey(IFT *ift, const char *key, int start_index)
Definition iftfind.c:30
char * value
Definition tpcift.h:37
IFT_ITEM * item
Definition tpcift.h:57
int keyNr
Definition tpcift.h:47

Referenced by parIsOptcrit().

◆ parIsStudyNr()

char * parIsStudyNr ( PAR * par)

Check if PAR data contains study number.

See also
parSetStudyNr, parIsModel, parIsWSS, studynrFromFilename, parEnsureNames
Returns
Returns pointer to study number, or NULL if not found.
Parameters
parPointer to parameter data.

Definition at line 400 of file par.c.

403 {
404 if(par==NULL || par->h.keyNr<1) return((char*)NULL);
405 int li=iftFindKey(&par->h, "studynr", 0);
406 if(li<0) li=iftFindKey(&par->h, "study_number", 0);
407 if(li<0) return((char*)NULL);
408 if(par->h.item[li].value==NULL || strlen(par->h.item[li].value)<1) return((char*)NULL);
409 return(par->h.item[li].value);
410}

Referenced by parIsStudyNr().

◆ parIsWSS()

int parIsWSS ( PAR * par)

Check if any of parameter sets has WSS.

See also
parIsFitNr, parIsDataNr, parCLWithPar, parSDWithPar, parIsOptcrit
Returns
Returns 1 if WSS exists, and 0 if not (or in case of an error).
Parameters
parPointer to parameter data.

Definition at line 252 of file par.c.

255 {
256 if(par==NULL || par->tacNr<1) return(0);
257 for(int ri=0; ri<par->tacNr; ri++) if(!isnan(par->r[ri].wss)) return(1);
258 return(0);
259}
double wss
Definition tpcpar.h:72

Referenced by parIsWSS(), parWriteCSV(), parWriteRES(), and parWriteXML().

◆ parnInit()

void parnInit ( PARN * parn)

Initiate the PARN struct before any use.

Author
Vesa Oikonen
See also
parInit, parrInit
Parameters
parnPointer to PARN

Definition at line 59 of file par.c.

62 {
63 if(parn==NULL) return;
64 parn->name[0]='\0';
65 parn->unit=UNIT_UNKNOWN;
66 parn->lim1=parn->lim2=parn->tol=nan("");
67 parn->sw=0;
68}
int unit
Definition tpcpar.h:86
double lim2
Definition tpcpar.h:90
char sw
Definition tpcpar.h:94
double tol
Definition tpcpar.h:92
double lim1
Definition tpcpar.h:88
@ UNIT_UNKNOWN
Unknown unit.

Referenced by parAllocate(), parAllocateMore(), and parnInit().

◆ parrAllocate()

int parrAllocate ( PARR * parr,
int parNr )

Allocate memory for PARR data. Any previous contents are deleted.

See also
parrInit, parrFree, parAllocate
Returns
Returns TPCERROR status.
Parameters
parrPointer to initiated PARR struct data; any old contents are deleted.
parNrNr of parameters to allocate.

Definition at line 150 of file par.c.

155 {
156 if(parr==NULL) return TPCERROR_FAIL;
157 /* Delete any previous contents */
158 parrFree(parr);
159 /* If no memory is requested, then just return */
160 if(parNr<1) return TPCERROR_OK;
161
162 /* Allocate memory for PARR data */
163 parr->p=malloc(parNr*sizeof(double));
164 parr->sd=malloc(parNr*sizeof(double));
165 parr->cl1=malloc(parNr*sizeof(double));
166 parr->cl2=malloc(parNr*sizeof(double));
167 if(parr->p==NULL || parr->sd==NULL || parr->cl1==NULL || parr->cl2==NULL)
169 /* Initiate values to NaNs */
170 for(int i=0; i<parNr; i++)
171 parr->p[i]=parr->sd[i]=parr->cl1[i]=parr->cl2[i]=nan("");
172
173 return TPCERROR_OK;
174}

Referenced by parAllocate(), parAllocateMore(), and parrAllocate().

◆ parrFree()

void parrFree ( PARR * parr)

Free memory allocated for PARR. All data is cleared.

Parameters
parrPointer to PARR struct

Definition at line 87 of file par.c.

90 {
91 if(parr==NULL) return;
92 free(parr->p);
93 free(parr->sd);
94 free(parr->cl1);
95 free(parr->cl2);
96 parrInit(parr);
97}

Referenced by parDeleteTAC(), parFree(), parrAllocate(), and parrFree().

◆ parrInit()

void parrInit ( PARR * parr)

Initiate the PARR struct before any use.

Author
Vesa Oikonen
See also
parInit, parnInit
Parameters
parrPointer to PARR

Definition at line 41 of file par.c.

44 {
45 if(parr==NULL) return;
46 parr->model=0;
47 parr->name[0]='\0';
48 parr->start=parr->end=nan("");
49 parr->fitNr=0;
50 parr->dataNr=0;
51 parr->p=parr->sd=parr->cl1=parr->cl2=NULL;
52 parr->wss=nan("");
53 parr->sw=0;
54}
char sw
Definition tpcpar.h:74

Referenced by parAllocate(), parAllocateMore(), parDeleteTAC(), parrFree(), and parrInit().

◆ parSDWithPar()

int parSDWithPar ( PAR * par,
int pi )

Check if specified parameter has SD in at least one of the regions.

See also
parCLWithPar, parIsWSS
Returns
Returns 1 if SD exists, and 0 if not (or in case of an error).
Parameters
parPointer to parameter data.
piIndex of parameter [0..parNr-1] to check.

Definition at line 308 of file par.c.

313 {
314 //printf("%s(%d)\n", __func__, pi); fflush(stdout);
315 if(par==NULL || par->tacNr<1 || pi<0 || pi>=par->parNr) return(0);
316 for(int i=0; i<par->tacNr; i++) if(!isnan(par->r[i].sd[pi])) return(1);
317 return(0);
318}

Referenced by parSDWithPar(), parWriteCSV(), and parWriteXML().

◆ parSetStudyNr()

int parSetStudyNr ( PAR * par,
const char * s )

Set study number in PAR data, overwriting any previous study number.

See also
parIsStudyNr, tacSetHeaderStudynr, tacGetHeaderStudynr, studynrFromFilename
Returns
enum tpcerror (TPCERROR_OK when successful).
Parameters
parPointer to parameter data.
sPointer to string containing the study number; enter NULL or "" if you only want to delete studynr in header.

Definition at line 418 of file par.c.

424 {
425 if(par==NULL) return TPCERROR_FAIL;
426
427 /* Find and delete previous studynr(s) */
428 int i=0, start=0;
429 while(1) {
430 i=iftFindKey(&par->h, "studynr", start);
431 if(i<0) i=iftFindKey(&par->h, "study_number", start);
432 if(i<0) i=iftFindKey(&par->h, "study number", start);
433 if(i<0) break;
434 iftDelete(&par->h, i); if(i>start) start=i;
435 }
436
437 /* If new studynr is empty, then just return */
438 if(s==NULL || *s=='\0') return(TPCERROR_OK);
439
440 /* Otherwise create new key and value */
441 return(iftPut(&par->h, "studynr", s, (char)1, NULL));
442}
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
Definition ift.c:63
int iftDelete(IFT *ift, int index)
Definition ift.c:206

Referenced by parSetStudyNr().