33 {
34 int i, n, ne=0, ret;
35 char keyname[256];
36 float f;
37
38
39 if(verbose>0) printf("%s(dsr, ift)\n", __func__);
40 if(dsr==NULL || ift==NULL) return STATUS_FAULT;
41 if(ift->
keyNr<1)
return STATUS_INVALIDHEADER;
42 if(verbose>5)
iftWrite(ift,
"stdout", 0);
43
44 strcpy(keyname, "byte_order");
45 if((i=
iftGet(ift, keyname, 0))>=0) {
46 if(strcasecmp(ift->
item[i].
value,
"big")==0) {
48 }
else if(strcasecmp(ift->
item[i].
value,
"little")==0) {
50 }
51 }
52
53 strcpy(keyname, "sizeof_hdr");
54 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
56
57 strcpy(keyname, "data_type");
58 if((i=
iftGet(ift, keyname, 0))>=0) {
60
61 strcpy(keyname, "db_name");
62 if((i=
iftGet(ift, keyname, 0))>=0) {
64
65 strcpy(keyname, "extents");
66 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
67 if(ret>=0 && i>=0) {dsr->
h.
extents=i; ne++;}
68
69 strcpy(keyname, "session_error");
70 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
72
73 strcpy(keyname, "regular");
74 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
75 if(ret>=0 && i>=0) {dsr->
h.
regular=i; ne++;}
76
77 strcpy(keyname, "dim_info");
78 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
79 if(ret>=0 && i>=0) {dsr->
h.
dim_info=i; ne++;}
80
81
82 strcpy(keyname, "dim");
83 if((i=
iftGet(ift, keyname, 0))>=0) {
84 n=sscanf(ift->
item[i].
value,
"%hd %hd %hd %hd %hd %hd %hd %hd",
87 if(n!=8) return STATUS_UNSUPPORTED;
88 ne++;
89 }
90
91
92 strcpy(keyname, "intent_p1");
93 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
94 if(ret>=0 && !isnan(f)) {dsr->
h.
intent_p1=f; ne++;}
95 strcpy(keyname, "intent_p2");
96 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
97 if(ret>=0 && !isnan(f)) {dsr->
h.
intent_p2=f; ne++;}
98 strcpy(keyname, "intent_p3");
99 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
100 if(ret>=0 && !isnan(f)) {dsr->
h.
intent_p3=f; ne++;}
101 strcpy(keyname, "intent_code");
102 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
104
105 strcpy(keyname, "datatype");
106 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
107 if(ret>=0 && i>=0) {dsr->
h.
datatype=i; ne++;}
108
109 strcpy(keyname, "bitpix");
110 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
111 if(ret>=0 && i>=0) {dsr->
h.
bitpix=i; ne++;}
112
113 strcpy(keyname, "slice_start");
114 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
116
117 strcpy(keyname, "pixdim");
118 if((i=
iftGet(ift, keyname, 0))>=0) {
119 n=sscanf(ift->
item[i].
value,
"%f %f %f %f %f %f %f %f",
123 if(n!=8) return STATUS_UNSUPPORTED;
124 ne++;
125 }
126
127 strcpy(keyname, "vox_offset");
128 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
129 if(ret>=0 && !isnan(f)) {dsr->
h.
vox_offset=f; ne++;}
130
131 strcpy(keyname, "scl_slope");
132 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
133 if(ret>=0 && !isnan(f)) {dsr->
h.
scl_slope=f; ne++;}
134
135 strcpy(keyname, "scl_inter");
136 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
137 if(ret>=0 && !isnan(f)) {dsr->
h.
scl_inter=f; ne++;}
138
139 strcpy(keyname, "slice_end");
140 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
141 if(ret>=0 && i>=0) {dsr->
h.
slice_end=i; ne++;}
142
143 strcpy(keyname, "slice_code");
144 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
146
147 strcpy(keyname, "zyzt_units");
148 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
150
151 strcpy(keyname, "cal_max");
152 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
153 if(ret>=0 && !isnan(f)) {dsr->
h.
cal_max=f; ne++;}
154
155 strcpy(keyname, "cal_min");
156 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
157 if(ret>=0 && !isnan(f)) {dsr->
h.
cal_min=f; ne++;}
158
159 strcpy(keyname, "slice_duration");
160 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
162
163 strcpy(keyname, "toffset");
164 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
165 if(ret>=0 && !isnan(f)) {dsr->
h.
toffset=f; ne++;}
166
167 strcpy(keyname, "glmax");
168 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
169 if(ret>=0 && i>=0) {dsr->
h.
glmax=i; ne++;}
170
171 strcpy(keyname, "glmin");
172 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
173 if(ret>=0 && i>=0) {dsr->
h.
glmin=i; ne++;}
174
175 strcpy(keyname, "descrip");
176 if((i=
iftGet(ift, keyname, 0))>=0) {
178
179 strcpy(keyname, "aux_file");
180 if((i=
iftGet(ift, keyname, 0))>=0) {
182
183
184 strcpy(keyname, "qform_code");
185 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
187 strcpy(keyname, "sform_code");
188 ret=
iftGetIntValue(ift, 0, keyname, &i, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
190 strcpy(keyname, "quatern_b");
191 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
192 if(ret>=0 && !isnan(f)) {dsr->
h.
quatern_b=f; ne++;}
193 strcpy(keyname, "quatern_c");
194 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
195 if(ret>=0 && !isnan(f)) {dsr->
h.
quatern_c=f; ne++;}
196 strcpy(keyname, "quatern_d");
197 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
198 if(ret>=0 && !isnan(f)) {dsr->
h.
quatern_d=f; ne++;}
199 strcpy(keyname, "qoffset_x");
200 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
201 if(ret>=0 && !isnan(f)) {dsr->
h.
qoffset_x=f; ne++;}
202 strcpy(keyname, "qoffset_y");
203 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
204 if(ret>=0 && !isnan(f)) {dsr->
h.
qoffset_y=f; ne++;}
205 strcpy(keyname, "qoffset_z");
206 ret=
iftGetFloatValue(ift, 0, keyname, &f, 0);
if(ret<-1)
return STATUS_UNSUPPORTED;
207 if(ret>=0 && !isnan(f)) {dsr->
h.
qoffset_z=f; ne++;}
208
209 strcpy(keyname, "srow_x");
210 if((i=
iftGet(ift, keyname, 0))>=0) {
211 n=sscanf(ift->
item[i].
value,
"%f %f %f %f",
214 if(n!=4) return STATUS_UNSUPPORTED;
215 ne++;
216 }
217 strcpy(keyname, "srow_y");
218 if((i=
iftGet(ift, keyname, 0))>=0) {
219 n=sscanf(ift->
item[i].
value,
"%f %f %f %f",
222 if(n!=4) return STATUS_UNSUPPORTED;
223 ne++;
224 }
225 strcpy(keyname, "srow_z");
226 if((i=
iftGet(ift, keyname, 0))>=0) {
227 n=sscanf(ift->
item[i].
value,
"%f %f %f %f",
230 if(n!=4) return STATUS_UNSUPPORTED;
231 ne++;
232 }
233
234 strcpy(keyname, "intent_name");
235 if((i=
iftGet(ift, keyname, 0))>=0) {
237
238 strcpy(keyname, "magic");
239 if((i=
iftGet(ift, keyname, 0))>=0) {
241
242 strcpy(keyname, "extension");
243 if((i=
iftGet(ift, keyname, 0))>=0) {
245
246 if(verbose>1) printf("%d field(s) edited.\n", ne);
247 if(ne>0) return STATUS_OK;
248 return STATUS_INVALIDHEADER;
249}
int iftWrite(IFT *ift, char *filename, int verbose)
int iftGetFloatValue(IFT *ift, int si, const char *key, float *value, int verbose)
int iftGet(IFT *ift, char *key, int verbose)
int iftGetIntValue(IFT *ift, int si, const char *key, int *value, int verbose)