64#include "EST_wave_utils.h"
65#include "esps_utils.h"
98 for (t=r; t != NULL; t=u)
118 for (i=0; i<r->count; i++)
136void add_field(
esps_hdr hdr,
const char *name,
int type,
int dimension)
139 char **names =
hdr->field_name;
141 int *
dims =
hdr->field_dimension;
144 hdr->field_name = walloc(
char *,
hdr->num_fields+1);
145 hdr->field_type = walloc(
short,
hdr->num_fields+1);
146 hdr->field_dimension = walloc(
int,
hdr->num_fields+1);
147 for (i=0; i <
hdr->num_fields; i++)
149 hdr->field_name[i] = names[i];
151 hdr->field_dimension[i] =
dims[i];
156 hdr->field_name[
hdr->num_fields] = wstrdup(name);
157 hdr->field_type[
hdr->num_fields] = type;
158 hdr->field_dimension[
hdr->num_fields] = dimension;
165void add_fea_d(
esps_hdr hdr,
const char *name,
int pos,
double d)
172 t->clength =
strlen(name);
173 t->name = wstrdup(name);
174 if (t->count < pos+1)
176 double *dval = t->
v.dval;
177 t->
v.dval = walloc(
double,pos+1);
178 for (i=0; i<t->count; i++)
179 t->
v.dval[i] = dval[i];
180 for (; i < pos+1; i++)
185 t->dtype = ESPS_DOUBLE;
194void add_fea_f(
esps_hdr hdr,
const char *name,
int pos,
float d)
201 t->clength =
strlen(name);
202 t->name = wstrdup(name);
203 if (t->count < pos+1)
205 float *fval = t->
v.fval;
206 t->
v.fval = walloc(
float,pos+1);
207 for (i=0; i<t->count; i++)
208 t->
v.fval[i] = fval[i];
209 for (; i < pos+1; i++)
214 t->dtype = ESPS_FLOAT;
223void add_fea_i(
esps_hdr hdr,
const char *name,
int pos,
int d)
230 t->clength =
strlen(name);
231 t->name = wstrdup(name);
232 if (t->count < pos+1)
234 int *ival = t->
v.ival;
235 t->
v.ival = walloc(
int,pos+1);
236 for (i=0; i<t->count; i++)
237 t->
v.ival[i] = ival[i];
238 for (; i < pos+1; i++)
252void add_fea_s(
esps_hdr hdr,
const char *name,
int pos,
short d)
259 t->clength =
strlen(name);
260 t->name = wstrdup(name);
261 if (t->count < pos+1)
263 short *sval = t->
v.sval;
264 t->
v.sval = walloc(
short,pos+1);
265 for (i=0; i<t->count; i++)
266 t->
v.sval[i] = sval[i];
267 for (; i < pos+1; i++)
268 t->
v.sval[i] = (
short)0;
272 t->dtype = ESPS_SHORT;
281void add_fea_c(
esps_hdr hdr,
const char *name,
int pos,
char d)
288 t->clength =
strlen(name);
289 t->name = wstrdup(name);
290 if (t->count < pos+1)
292 char *cval = t->
v.cval;
293 t->
v.cval = walloc(
char,pos+1);
294 for (i=0; i<t->count; i++)
295 t->
v.cval[i] = cval[i];
296 for (; i < pos+1; i++)
297 t->
v.cval[i] = (
char)0;
301 t->dtype = ESPS_CHAR;
310void add_fea_special(
esps_hdr hdr,
int type,
const char *name)
316 t->clength =
strlen(name);
317 t->name = wstrdup(name);
326int fea_value_d(
const char *name,
int pos,
esps_hdr hdr,
double *d)
331 for (t=
hdr->fea; t != NULL; t=t->next)
332 if (streq(name,t->name))
334 if (t->dtype != ESPS_DOUBLE)
336 fprintf(
stderr,
"ESPS hdr: access non-double field \"%s\" as double\n",
347int fea_value_f(
const char *name,
int pos,
esps_hdr hdr,
float *d)
352 for (t=
hdr->fea; t != NULL; t=t->next)
353 if (streq(name,t->name))
355 if (t->dtype != ESPS_FLOAT)
357 fprintf(
stderr,
"ESPS hdr: access non-float field \"%s\" as float\n",
368int fea_value_s(
const char *name,
int pos,
esps_hdr hdr,
short *d)
373 for (t=
hdr->fea; t != NULL; t=t->next)
374 if (streq(name,t->name))
376 if (t->dtype != ESPS_SHORT)
378 fprintf(
stderr,
"ESPS hdr: access non-short field \"%s\" as short\n",
389int fea_value_i(
const char *name,
int pos,
esps_hdr hdr,
int *d)
394 for (t=
hdr->fea; t != NULL; t=t->next)
395 if (streq(name,t->name))
397 if (t->dtype != ESPS_INT)
399 fprintf(
stderr,
"ESPS hdr: access non-int field \"%s\" as int\n",
410int fea_value_c(
const char *name,
int pos,
esps_hdr hdr,
char *d)
415 for (t=
hdr->fea; t != NULL; t=t->next)
416 if (streq(name,t->name))
418 if (t->dtype != ESPS_CHAR)
420 fprintf(
stderr,
"ESPS hdr: access non-char field \"%s\" as char\n",
431static int esps_alloc_fea(
esps_fea r)
438 r->
v.dval = walloc(
double,r->count);
break;
440 r->
v.fval = walloc(
float,r->count);
break;
442 r->
v.ival = walloc(
int,r->count);
break;
444 r->
v.sval = walloc(
short,r->count);
break;
446 r->
v.cval = walloc(
char,r->count);
break;
464 clength = (
strlen(t->name)+3)/4;
466 nspace = walloc(
char, clength*4);
467 memset(
nspace,0,clength*4);
471 if ((t->type == 11) ||
478 for (i=0; i<t->count; i++)
483 fwrite(&t->
v.dval[i],8,1,fd);
break;
485 fwrite(&t->
v.fval[i],4,1,fd);
break;
487 fwrite(&t->
v.ival[i],4,1,fd);
break;
489 fwrite(&t->
v.sval[i],2,1,fd);
break;
491 fwrite(&t->
v.cval[i],1,1,fd);
break;
506 for (i=0; i < r->num_fields; i++)
508 switch(r->field[i]->type)
511 fwrite(r->field[i]->
v.dval,8,r->field[i]->dimension,fd);
514 fwrite(r->field[i]->
v.fval,4,r->field[i]->dimension,fd);
517 fwrite(r->field[i]->
v.ival,4,r->field[i]->dimension,fd);
520 fwrite(r->field[i]->
v.sval,2,r->field[i]->dimension,fd);
523 fwrite(r->field[i]->
v.cval,1,r->field[i]->dimension,fd);
526 fwrite(r->field[i]->
v.sval,2,r->field[i]->dimension,fd);
548 fread(&
sdata,2,1,fd);
553 fread(&
sdata,2,1,fd);
557 else if ((r->type == 13) ||
563 fread(&
sdata,2,1,fd);
565 r->clength =
sdata * 4;
573 r->name = walloc(
char,r->clength+1);
574 fread(r->name,1,r->clength,fd);
575 r->name[r->clength] =
'\0';
576 if ((r->type == 11) ||
580 fread(&
idata,4,1,fd);
583 fread(&
sdata,2,1,fd);
586 if (esps_alloc_fea(r) == -1)
588 for (i=0; i<r->count; i++)
593 fread(&
ddata,8,1,fd);
594 if (
hdr->swapped) swapdouble(&
ddata);
598 fread(&
fdata,4,1,fd);
599 if (
hdr->swapped) swapfloat(&
fdata);
603 fread(&
idata,4,1,fd);
608 fread(&
sdata,2,1,fd);
613 fread(&cdata,1,1,fd);
614 r->
v.cval[i] = cdata;
617 fprintf(
stderr,
"ESPS read_hdr: unsupported FEA dtype %d\n",r->dtype);
632 if (fread(&size,2,1,fd) != 1)
635 return wstrdup(
"ERROR");
637 if (
hdr->swapped) size = SWAPSHORT(size);
638 name = walloc(
char,size+1);
639 if (fread(name,1,size,fd) != (
unsigned)size)
646 fseek(fd,6,SEEK_CUR);
648 fseek(fd,2,SEEK_CUR);
653 if (
hdr->swapped) size = SWAPSHORT(size);
654 fseek(fd,size,SEEK_CUR);
663 short size =
strlen(name);
670 if (
hdr->file_type == ESPS_SD)
683 h->file_type = ESPS_FEA;
687 h->field_name = NULL;
688 h->field_type = NULL;
689 h->field_dimension = NULL;
699 if (h->field_name != NULL)
701 for (i=0; i < h->num_fields; i++)
702 wfree(h->field_name[i]);
703 wfree(h->field_name);
705 delete_esps_fea(h->fea);
716 for (size=0,i=0; i <
hdr->num_fields; i++)
719 r->field[i]->type =
hdr->field_type[i];
720 r->field[i]->dimension =
hdr->field_dimension[i];
721 switch(r->field[i]->type)
724 r->field[i]->
v.dval = walloc(
double,r->field[i]->dimension);
728 r->field[i]->
v.fval = walloc(
float,r->field[i]->dimension);
732 r->field[i]->
v.ival = walloc(
int,r->field[i]->dimension);
736 r->field[i]->
v.sval = walloc(
short,r->field[i]->dimension);
740 r->field[i]->
v.cval = walloc(
char,r->field[i]->dimension);
744 r->field[i]->
v.sval = walloc(
short,r->field[i]->dimension);
752 r->num_fields =
hdr->num_fields;
762 for (i=0; i<r->num_fields; i++)
764 wfree(r->field[i]->
v.ival);
780 for (i=0; i< r->num_fields; i++)
782 switch (r->field[i]->type)
785 for(
j=0;
j < r->field[i]->dimension;
j++)
793 for(
j=0;
j < r->field[i]->dimension;
j++)
801 for(
j=0;
j < r->field[i]->dimension;
j++)
809 for(
j=0;
j < r->field[i]->dimension;
j++)
817 if (fread(r->field[i]->
v.cval,1,r->field[i]->dimension,fd) !=
818 (
unsigned)r->field[i]->dimension)
return EOF;
821 for(
j=0;
j < r->field[i]->dimension;
j++)
840double get_field_d(
esps_rec r,
int field,
int pos)
842 return r->field[field]->
v.dval[pos];
844float get_field_f(
esps_rec r,
int field,
int pos)
846 return r->field[field]->
v.fval[pos];
848int get_field_i(
esps_rec r,
int field,
int pos)
850 return r->field[field]->
v.ival[pos];
852short get_field_s(
esps_rec r,
int field,
int pos)
854 return r->field[field]->
v.sval[pos];
856char get_field_c(
esps_rec r,
int field,
int pos)
858 return r->field[field]->
v.cval[pos];
860void set_field_d(
esps_rec r,
int field,
int pos,
double d)
862 r->field[field]->
v.dval[pos] = d;
864void set_field_f(
esps_rec r,
int field,
int pos,
float d)
866 r->field[field]->
v.fval[pos] = d;
868void set_field_i(
esps_rec r,
int field,
int pos,
int d)
870 r->field[field]->
v.ival[pos] = d;
872void set_field_s(
esps_rec r,
int field,
int pos,
short d)
874 r->field[field]->
v.sval[pos] = d;
876void set_field_c(
esps_rec r,
int field,
int pos,
char d)
878 r->field[field]->
v.cval[pos] = d;
897 for (sum=i=0; i <
hdr->num_fields; i++)
898 if (
hdr->field_type[i] == type)
908 hdr->file_type = ESPS_SD;
917 hdr->file_type = ESPS_FEA;
939 else if (
preamble.check == SWAPINT(ESPS_MAGIC))
944 hdr = new_esps_hdr();
951 fhdr.num_samples = SWAPINT(
fhdr.num_samples);
952 fhdr.num_doubles = SWAPINT(
fhdr.num_doubles);
953 fhdr.num_floats = SWAPINT(
fhdr.num_floats);
954 fhdr.num_ints = SWAPINT(
fhdr.num_ints);
955 fhdr.num_shorts = SWAPINT(
fhdr.num_shorts);
956 fhdr.num_chars = SWAPINT(
fhdr.num_chars);
957 fhdr.fea_type = SWAPSHORT(
fhdr.fea_type);
958 fhdr.num_fields = SWAPSHORT(
fhdr.num_fields);
961 if (
fhdr.num_samples == 0)
964 fseek(fd,0,SEEK_END);
966 fseek(fd,pos,SEEK_SET);
969 hdr->num_records =
fhdr.num_samples;
970 hdr->num_fields =
fhdr.num_fields;
972 if (
fhdr.thirteen == 9)
974 hdr->file_type = ESPS_SD;
977 hdr->field_dimension = walloc(
int,
hdr->num_fields);
978 hdr->field_dimension[0] = 1;
979 hdr->field_type = walloc(
short,
hdr->num_fields);
980 hdr->field_type[0] = ESPS_SHORT;
981 hdr->field_name = walloc(
char *,1);
982 hdr->field_name[0] = wstrdup(
"samples");
990 else if ((
fhdr.fea_type == 8) &&
991 (
hdr->num_fields == 1) &&
993 hdr->file_type = ESPS_SD;
995 hdr->file_type = ESPS_FEA;
999 hdr->field_dimension = walloc(
int,
hdr->num_fields);
1000 for (i=0; i<
hdr->num_fields; i++)
1007 fseek(fd,
hdr->num_fields*4,SEEK_CUR);
1008 fseek(fd,
hdr->num_fields*2,SEEK_CUR);
1009 hdr->field_type = walloc(
short,
hdr->num_fields);
1010 for (i=0; i<
hdr->num_fields; i++)
1032 if ((
hdr->file_type != ESPS_SD) && (
typematch == FALSE))
1034 fprintf(
stderr,
"ESPS hdr: got lost in the header (record description)\n");
1035 delete_esps_hdr(
hdr);
1036 return misc_read_error;
1039 fseek(fd,9*2,SEEK_CUR);
1040 fseek(fd,
hdr->num_fields*2,SEEK_CUR);
1042 hdr->field_name = walloc(
char *,
hdr->num_fields);
1047 for (i=0; i <
hdr->num_fields; i++)
1049 if (
hdr->file_type == ESPS_SD)
1051 if (!streq(
hdr->field_name[0],
"samples"))
1053 fprintf(
stderr,
"ESPS hdr: guessed wrong about FEA_SD file (no 'samples' field)\n");
1054 delete_esps_hdr(
hdr);
1055 return misc_read_error;
1063 if (r == NULL)
break;
1095 if (EST_NATIVE_BO == bo_big)
1109 fhdr.magic = ESPS_MAGIC;
1115 fhdr.num_samples =
hdr->num_records;
1118 fhdr.num_doubles = esps_num_of_type(ESPS_DOUBLE,
hdr);
1119 fhdr.num_floats = esps_num_of_type(ESPS_FLOAT,
hdr);
1120 fhdr.num_ints = esps_num_of_type(ESPS_INT,
hdr);
1121 fhdr.num_shorts = esps_num_of_type(ESPS_SHORT,
hdr);
1122 fhdr.num_chars = esps_num_of_type(ESPS_CHAR,
hdr);
1125 if (
hdr->file_type == ESPS_SD)
1129 fhdr.num_fields =
hdr->num_fields;
1134 for (i=0; i <
hdr->num_fields; i++)
1139 for (i=0; i <
hdr->num_fields; i++)
1141 if (
hdr->file_type == ESPS_SD)
1145 for (i=0; i <
hdr->num_fields; i++)
1147 for (i=0; i <
hdr->num_fields; i++)
1163 for (i=0; i < 9; i++)
1165 for (i=0; i <
hdr->num_fields; i++)
1168 for (i=0; i <
hdr->num_fields; i++)
1169 esps_put_field_name(
hdr->field_name[i],fd,
hdr);
1170 if (
hdr->file_type != ESPS_SD)
1173 for (t=
hdr->fea; t != NULL; t=t->next)
1174 write_esps_fea(fd,t,
hdr);
1180 if (
fseek(fd,0,SEEK_SET) == -1)
1182 fprintf(
stderr,
"esps write header: can't fseek to start of file\n");
1183 return misc_write_error;