8#include "tpcclibConfig.h"
23static char *info[] = {
24 "Edit the information in the main header of an ECAT 6.3 file.",
26 "Usage: @P [Options] ecatfile fieldname := fieldvalue ",
27 " or: @P [Options] ecatfile headerfile",
32 "Header file can contain one or more mainheader field names and values",
33 "in interfile-like format, for example:",
34 " patient_name := Einstein Albert",
35 " radiopharmaceutical := O-15 WATER",
36 " study_description := brain scan",
37 " facility_name := Turku PET Centre",
40 " @P s2345dy1.img patient_name := \"Albert Einstein\"",
41 " @P s2345dy1.img s2345dy1.header",
43 "See also: lmhdr, lshdr, e7emhdr, lmlist, esetstrt, imgunit, imgdecay",
45 "Keywords: ECAT, image, header, tool",
64int main(
int argc,
char **argv)
66 int ai, help=0, version=0, verbose=1;
67 int li, ret, change_nr=0;
68 char *cptr, petfile[FILENAME_MAX], iftfile[FILENAME_MAX];
69 char keyname[FILENAME_MAX], eqsign[FILENAME_MAX],
70 keyvalue[FILENAME_MAX];
79 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
80 petfile[0]=iftfile[0]=(char)0;
81 keyname[0]=eqsign[0]=keyvalue[0]=(char)0;
84 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
85 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
87 fprintf(stderr,
"Error: invalid option %s\n", argv[ai]);
92 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
99 strlcpy(petfile, argv[ai], FILENAME_MAX); ai++;
101 if(access(petfile, 0) == -1) {
102 fprintf(stderr,
"Error: file '%s' does not exist.\n", petfile);
108 strlcpy(iftfile, argv[ai], FILENAME_MAX); ai++;
110 if(access(iftfile, 0) == -1) {
111 fprintf(stderr,
"Error: file '%s' does not exist.\n", iftfile);
116 if(ai<argc) {strcpy(keyname, argv[ai]); ai++;}
118 strlcpy(eqsign, argv[ai], FILENAME_MAX); ai++;
119 if(strcmp(eqsign,
":=")!=0) {
120 fprintf(stderr,
"Error: use ' := ' to separate field name and value.\n");
124 if(ai<argc) {strcpy(keyvalue, argv[ai]); ai++;}
126 for(; ai<argc; ai++) {strcat(keyvalue,
" "); strcat(keyvalue, argv[ai]);}
131 if((!keyname[0] && !iftfile[0]) || (keyname[0] && !keyvalue[0])) {
132 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
136 if(keyname[0])
iftPut(&ift, keyname, keyvalue, NULL, 0);
141 printf(
"petfile := %s\n", petfile);
142 if(iftfile[0]) printf(
"iftfile := %s\n", iftfile);
143 if(keyname[0]) printf(
"%s := %s\n", keyname, keyvalue);
151 if(verbose>1) printf(
"reading %s\n", iftfile);
152 ret=
iftRead(&ift, iftfile, 1, 0);
154 fprintf(stderr,
"Error: %s\n", ift.
status);
158 if(verbose>2)
iftWrite(&ift,
"stdout", 0);
165 if(verbose>1) printf(
"reading %s\n", petfile);
166 if((fp=fopen(petfile,
"rb")) == NULL) {
167 fprintf(stderr,
"Error: cannot open file %s\n", petfile);
172 fprintf(stderr,
"Error (%d): cannot read main header.\n", ret);
173 iftEmpty(&ift); fclose(fp);
return(3);
183 for(li=0, change_nr=0; li<ift.
keyNr; li++) {
188 fprintf(stderr,
" warning: invalid field name: %s\n", ift.
item[li].
key);
190 fprintf(stderr,
" warning: invalid field value: %s\n", ift.
item[li].
value);
196 fprintf(stderr,
"Error: no fields were changed.\n");
204 if(verbose>1) printf(
"writing edited %s\n", petfile);
206 if((fp=fopen(petfile,
"r+b")) == NULL) {
207 fprintf(stderr,
"Error: cannot open %s for write.\n", petfile);
212 fprintf(stderr,
"Error (%d): cannot write main header.\n", ret);
213 fclose(fp);
return(12);
218 if(verbose>0) {printf(
"%s edited.\n", petfile); fflush(stdout);}
int ecat63EditMHeader(ECAT63_mainheader *h, char *field, char *value, int verbose)
void ecat63PrintMainheader(ECAT63_mainheader *h, FILE *fp)
int ecat63ReadMainheader(FILE *fp, ECAT63_mainheader *h)
int ecat63WriteMainheader(FILE *fp, ECAT63_mainheader *h)
int iftPut(IFT *ift, char *key, char *value, char *cmt_type, int verbose)
int iftWriteItem(IFT *ift, int item, FILE *fp, int verbose)
int iftRead(IFT *ift, char *filename, int is_key_required, int verbose)
int iftWrite(IFT *ift, char *filename, int verbose)
Header file for libtpcimgio.
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
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)