64 #include "EST_wave_utils.h"
65 #include "esps_utils.h"
82 esps_fea new_esps_fea()
94 void delete_esps_fea(esps_fea r)
98 for (t=r; t != NULL; t=u)
109 void print_esps_fea(esps_fea r)
114 fprintf(stdout,
"type: %d\n",r->type);
115 fprintf(stdout,
"name: %s\n",r->name);
116 fprintf(stdout,
"size: %d\n",r->count);
117 fprintf(stdout,
"dtype: %d\n",r->dtype);
118 for (i=0; i<r->count; i++)
122 fprintf(stdout,
" %d: %g\n",i,r->v.dval[i]);
break;
124 fprintf(stdout,
" %d: %f\n",i,r->v.fval[i]);
break;
126 fprintf(stdout,
" %d: %d\n",i,r->v.ival[i]);
break;
128 fprintf(stdout,
" %d: %d\n",i,r->v.sval[i]);
break;
130 fprintf(stdout,
" %d: %d\n",i,r->v.cval[i]);
break;
132 fprintf(stdout,
" %d: unknown\n",i);
136 void add_field(esps_hdr hdr,
const char *name,
int type,
int dimension)
139 char **names = hdr->field_name;
140 short *types = hdr->field_type;
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];
150 hdr->field_type[i] = types[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;
165 void add_fea_d(esps_hdr hdr,
const char *name,
int pos,
double d)
168 esps_fea t = new_esps_fea();
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;
194 void add_fea_f(esps_hdr hdr,
const char *name,
int pos,
float d)
197 esps_fea t = new_esps_fea();
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;
223 void add_fea_i(esps_hdr hdr,
const char *name,
int pos,
int d)
226 esps_fea t = new_esps_fea();
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++)
252 void add_fea_s(esps_hdr hdr,
const char *name,
int pos,
short d)
255 esps_fea t = new_esps_fea();
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;
281 void add_fea_c(esps_hdr hdr,
const char *name,
int pos,
char d)
284 esps_fea t = new_esps_fea();
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;
310 void add_fea_special(esps_hdr hdr,
int type,
const char *name)
313 esps_fea t = new_esps_fea();
316 t->clength = strlen(name);
317 t->name = wstrdup(name);
326 int 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",
347 int 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",
368 int 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",
389 int 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",
410 int 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",
431 static 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;
448 fprintf(stderr,
"ESPS file: unsupported FEA dtype\n");
455 void write_esps_fea(FILE *fd, esps_fea t,esps_hdr hdr)
463 fwrite(&t->type,2,1,fd);
464 clength = (strlen(t->name)+3)/4;
465 fwrite(&clength,2,1,fd);
466 nspace = walloc(
char, clength*4);
467 memset(nspace,0,clength*4);
468 memmove(nspace,t->name,strlen(t->name));
469 fwrite(nspace,1,clength*4,fd);
471 if ((t->type == 11) ||
475 fwrite(&t->count,4,1,fd);
476 fwrite(&t->dtype,2,1,fd);
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;
493 fprintf(stderr,
"ESPS write_hdr: unsupported FEA dtype %d\n",
500 int write_esps_rec(esps_rec r, esps_hdr h, FILE *fd)
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);
530 fprintf(stderr,
"ESPS file: unsupported field type %d\n",
537 esps_fea read_esps_fea(FILE *fd, esps_hdr hdr)
540 esps_fea r = new_esps_fea();
548 fread(&sdata,2,1,fd);
549 if (hdr->swapped) sdata = SWAPSHORT(sdata);
553 fread(&sdata,2,1,fd);
554 if (hdr->swapped) sdata = SWAPSHORT(sdata);
557 else if ((r->type == 13) ||
563 fread(&sdata,2,1,fd);
564 if (hdr->swapped) sdata = SWAPSHORT(sdata);
565 r->clength = sdata * 4;
569 fprintf(stderr,
"ESPS: fea record unknown type\n");
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);
581 if (hdr->swapped) idata = SWAPINT(idata);
583 fread(&sdata,2,1,fd);
584 if (hdr->swapped) sdata = SWAPSHORT(sdata);
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);
595 r->v.dval[i] = ddata;
598 fread(&fdata,4,1,fd);
599 if (hdr->swapped) swapfloat(&fdata);
600 r->v.fval[i] = fdata;
603 fread(&idata,4,1,fd);
604 if (hdr->swapped) idata = SWAPINT(idata);
605 r->v.ival[i] = idata;
608 fread(&sdata,2,1,fd);
609 if (hdr->swapped) sdata = SWAPSHORT(sdata);
610 r->v.sval[i] = sdata;
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);
626 static char *esps_get_field_name(FILE *fd, esps_hdr hdr,
int expect_source)
632 if (fread(&size,2,1,fd) != 1)
634 fputs(
"error reading field name size\n", stderr);
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)
641 fputs(
"error reading field name\n", stderr);
642 strncpy(name,
"ERROR", size);
645 if (hdr->file_type == ESPS_SD || expect_source)
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);
660 static void esps_put_field_name(
char *name,FILE *fd, esps_hdr hdr)
663 short size = strlen(name);
667 fwrite(&shortdata,2,1,fd);
668 fwrite(&size,2,1,fd);
669 fwrite(name,1,size,fd);
670 if (hdr->file_type == ESPS_SD)
673 fwrite(&shortdata,2,1,fd);
674 fwrite(&shortdata,2,1,fd);
675 fwrite(&shortdata,2,1,fd);
680 esps_hdr new_esps_hdr(
void)
683 h->file_type = ESPS_FEA;
687 h->field_name = NULL;
688 h->field_type = NULL;
689 h->field_dimension = NULL;
694 void delete_esps_hdr(esps_hdr h)
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);
709 esps_rec new_esps_rec(esps_hdr hdr)
715 r->field = walloc(esps_field,hdr->num_fields);
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);
748 fprintf(stderr,
"ESPS file: unsupported field type %d\n",
752 r->num_fields = hdr->num_fields;
758 void delete_esps_rec(esps_rec r)
762 for (i=0; i<r->num_fields; i++)
764 wfree(r->field[i]->v.ival);
771 int read_esps_rec(esps_rec r, esps_hdr hdr, FILE *fd)
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++)
787 if (fread(&doubledata,8,1,fd) == 0)
return EOF;
788 if (hdr->swapped) swapdouble(&doubledata);
789 r->field[i]->v.dval[j] = doubledata;
793 for(j=0; j < r->field[i]->dimension; j++)
795 if (fread(&floatdata,4,1,fd) == 0)
return EOF;
796 if (hdr->swapped) swapfloat(&floatdata);
797 r->field[i]->v.fval[j] = floatdata;
801 for(j=0; j < r->field[i]->dimension; j++)
803 if (fread(&intdata,4,1,fd) == 0)
return EOF;
804 if (hdr->swapped) intdata = SWAPINT(intdata);
805 r->field[i]->v.ival[j] = intdata;
809 for(j=0; j < r->field[i]->dimension; j++)
811 if (fread(&shortdata,2,1,fd) == 0)
return EOF;
812 if (hdr->swapped) shortdata = SWAPSHORT(shortdata);
813 r->field[i]->v.sval[j] = shortdata;
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++)
823 if (fread(&shortdata,2,1,fd) == 0)
return EOF;
824 if (hdr->swapped) shortdata = SWAPSHORT(shortdata);
825 r->field[i]->v.sval[j] = shortdata;
829 fprintf(stderr,
"ESPS file: unsupported field type %d\n",
840 double get_field_d(esps_rec r,
int field,
int pos)
842 return r->field[field]->v.dval[pos];
844 float get_field_f(esps_rec r,
int field,
int pos)
846 return r->field[field]->v.fval[pos];
848 int get_field_i(esps_rec r,
int field,
int pos)
850 return r->field[field]->v.ival[pos];
852 short get_field_s(esps_rec r,
int field,
int pos)
854 return r->field[field]->v.sval[pos];
856 char get_field_c(esps_rec r,
int field,
int pos)
858 return r->field[field]->v.cval[pos];
860 void set_field_d(esps_rec r,
int field,
int pos,
double d)
862 r->field[field]->v.dval[pos] = d;
864 void set_field_f(esps_rec r,
int field,
int pos,
float d)
866 r->field[field]->v.fval[pos] = d;
868 void set_field_i(esps_rec r,
int field,
int pos,
int d)
870 r->field[field]->v.ival[pos] = d;
872 void set_field_s(esps_rec r,
int field,
int pos,
short d)
874 r->field[field]->v.sval[pos] = d;
876 void set_field_c(esps_rec r,
int field,
int pos,
char d)
878 r->field[field]->v.cval[pos] = d;
881 int esps_record_size(esps_hdr hdr)
884 esps_rec r = new_esps_rec(hdr);
891 static int esps_num_of_type(
int type,esps_hdr hdr)
897 for (sum=i=0; i < hdr->num_fields; i++)
898 if (hdr->field_type[i] == type)
904 esps_hdr make_esps_sd_hdr(
void)
907 esps_hdr hdr = new_esps_hdr();
908 hdr->file_type = ESPS_SD;
913 esps_hdr make_esps_hdr(
void)
916 esps_hdr hdr = new_esps_hdr();
917 hdr->file_type = ESPS_FEA;
922 enum EST_read_status read_esps_hdr(esps_hdr *uhdr,FILE *fd)
929 int end,pos,intdata,i;
931 double sd_sample_rate;
936 fread(&preamble,
sizeof(preamble),1,fd);
937 if (preamble.check == ESPS_MAGIC)
939 else if (preamble.check == SWAPINT(ESPS_MAGIC))
944 hdr = new_esps_hdr();
946 fread(&fhdr,
sizeof(fhdr),1,fd);
949 preamble.data_offset = SWAPINT(preamble.data_offset);
950 preamble.record_size = SWAPINT(preamble.record_size);
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);
967 fhdr.num_samples = (end - preamble.data_offset)/preamble.record_size;
969 hdr->num_records = fhdr.num_samples;
970 hdr->num_fields = fhdr.num_fields;
971 hdr->hdr_size = preamble.data_offset;
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");
983 fseek(fd,hdr->hdr_size,SEEK_SET);
985 sd_sample_rate = *((
float *)&fhdr.fil4[0]);
986 add_fea_d(hdr,
"record_freq",0,(
double)sd_sample_rate);
990 else if ((fhdr.fea_type == 8) &&
991 (hdr->num_fields == 1) &&
992 ((fhdr.num_shorts*2) == preamble.record_size))
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++)
1002 fread(&intdata,4,1,fd);
1003 if (hdr->swapped) intdata = SWAPINT(intdata);
1004 hdr->field_dimension[i] = intdata;
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++)
1012 fread(&shortdata,2,1,fd);
1013 if (hdr->swapped) shortdata = SWAPSHORT(shortdata);
1014 hdr->field_type[i] = shortdata;
1017 fread(&intdata,4,1,fd);
1018 if (hdr->swapped) intdata = SWAPINT(intdata);
1019 if (fhdr.num_doubles != intdata) typematch = FALSE;
1020 fread(&intdata,4,1,fd);
1021 if (hdr->swapped) intdata = SWAPINT(intdata);
1022 if (fhdr.num_floats != intdata) typematch = FALSE;
1023 fread(&intdata,4,1,fd);
1024 if (hdr->swapped) intdata = SWAPINT(intdata);
1025 if (fhdr.num_ints != intdata) typematch = FALSE;
1026 fread(&intdata,4,1,fd);
1027 if (hdr->swapped) intdata = SWAPINT(intdata);
1028 if (fhdr.num_shorts != intdata) typematch = FALSE;
1029 fread(&intdata,4,1,fd);
1030 if (hdr->swapped) intdata = SWAPINT(intdata);
1031 if (fhdr.num_chars != intdata) typematch = FALSE;
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);
1044 fread(&name_flag, 2, 1, fd);
1045 if (hdr->swapped) name_flag = SWAPSHORT(name_flag);
1047 for (i=0; i < hdr->num_fields; i++)
1048 hdr->field_name[i] = esps_get_field_name(fd,hdr,name_flag);
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;
1060 while (ftell(fd) < preamble.data_offset-4)
1062 esps_fea r = read_esps_fea(fd,hdr);
1063 if (r == NULL)
break;
1073 fseek(fd,hdr->hdr_size,SEEK_SET);
1080 enum EST_write_status write_esps_hdr(esps_hdr hdr,FILE *fd)
1086 time_t tx = time(0);
1091 memset(&preamble,0,
sizeof(preamble));
1092 memset(&fhdr,0,
sizeof(fhdr));
1095 if (EST_NATIVE_BO == bo_big)
1096 preamble.machine_code = 4;
1098 preamble.machine_code = 6;
1099 preamble.check_code = 3000;
1100 preamble.data_offset = 0;
1101 preamble.record_size = esps_record_size(hdr);
1102 preamble.check = ESPS_MAGIC;
1105 preamble.foreign_hd = 0;
1109 fhdr.magic = ESPS_MAGIC;
1110 strncpy(fhdr.date,ctime(&tx),26);
1111 sprintf(fhdr.version,
"1.91");
1112 sprintf(fhdr.prog,
"EDST");
1113 sprintf(fhdr.vers,
"0.1");
1114 strncpy(fhdr.progcompdate,ctime(&tx),26);
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;
1131 fwrite(&preamble,
sizeof(preamble),1,fd);
1132 fwrite(&fhdr,
sizeof(fhdr),1,fd);
1134 for (i=0; i < hdr->num_fields; i++)
1137 fwrite(&intdata,4,1,fd);
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++)
1146 fwrite(&shortdata,2,1,fd);
1147 for (i=0; i < hdr->num_fields; i++)
1149 shortdata = hdr->field_type[0];
1150 fwrite(&shortdata,2,1,fd);
1152 intdata = fhdr.num_doubles;
1153 fwrite(&intdata,4,1,fd);
1154 intdata = fhdr.num_floats;
1155 fwrite(&intdata,4,1,fd);
1156 intdata = fhdr.num_ints;
1157 fwrite(&intdata,4,1,fd);
1158 intdata = fhdr.num_shorts;
1159 fwrite(&intdata,4,1,fd);
1160 intdata = fhdr.num_chars;
1161 fwrite(&intdata,4,1,fd);
1163 for (i=0; i < 9; i++)
1164 fwrite(&shortdata,2,1,fd);
1165 for (i=0; i < hdr->num_fields; i++)
1166 fwrite(&shortdata,2,1,fd);
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)
1171 fwrite(&shortdata,2,1,fd);
1173 for (t=hdr->fea; t != NULL; t=t->next)
1174 write_esps_fea(fd,t,hdr);
1177 fwrite(&intdata,4,1,fd);
1178 preamble.data_offset = ftell(fd);
1179 fhdr.hsize = (preamble.data_offset-249)/2;
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;
1185 fwrite(&preamble,
sizeof(preamble),1,fd);
1186 fwrite(&fhdr,
sizeof(fhdr),1,fd);
1187 fseek(fd,preamble.data_offset,SEEK_SET);