static FieldList fea_to_FieldList(struct header *hdr, struct fea_data *rec, char **field_names, int copy_sources) { struct fea_header *fea; FieldList list; int i, j; FieldSpec *field, *subfield; char *name; int spstype; long *dim; int rank; int type; char **codes; char **gnames; int gnum; struct varsize *var; int nsrc; FieldList source; char *line; long len; if (hdr == NULL) return NULL; if (hdr->common.type != FT_FEA) return NULL; fea = hdr->hd.fea; list = NULL; if (hdr->common.tag && FindStr(ESPS_TAG, field_names)) { field = NewFieldSpec(ELONG, 0); field->name = savestring(ESPS_TAG); field->occurrence = REQUIRED; if (rec != NULL) field->data = &rec->tag; AddField(&list, field); } if (debug_level) fprintf(stderr, "fea_to_FieldList: field count %d.\n", fea->field_count); for (i = 0; i < (int) fea->field_count; i++) { long size; name = fea->names[i]; if (FindStr(name, field_names)) { spstype = fea->types[i]; size = fea->sizes[i]; rank = fea->ranks[i]; dim = fea->dimens[i]; if (debug_level >= 2) fprintf(stderr, "fea_to_FieldList: field[%d]: \"%s\".\n", i, name); type = EspsTypeToElib(spstype); field = NewFieldSpec(type, rank); if (rank == 1) field->dim[0] = size; else for (j = 0; j < rank; j++) field->dim[j] = dim[j]; field->name = savestring(name); field->occurrence = REQUIRED; if (spstype == CODED) { codes = fea->enums[i]; subfield = NewFieldSpec(ECHAR, 2); subfield->name = savestring("enumStrings"); subfield->occurrence = GLOBAL; StrArrToRect(codes, &subfield->dim, &subfield->data); AddSubfield(field, subfield); } if (rec != NULL) field->data = get_fea_ptr(rec, name, hdr); AddField(&list, field); } } gnames = genhd_list(&gnum, hdr); for (i = 0; i < gnum; i++) { int size; name = gnames[i]; spstype = genhd_type(name, &size, hdr); if (debug_level >= 2) fprintf(stderr, "fea_to_FieldList: global field[%d]: \"%s\".\n", i, name); type = EspsTypeToElib(spstype); field = NewFieldSpec(type, 1); field->dim[0] = size; field->name = savestring(name); field->occurrence = GLOBAL; if (spstype == CODED) { codes = genhd_codes(name, hdr); subfield = NewFieldSpec(ECHAR, 2); subfield->name = savestring("enumStrings"); subfield->occurrence = GLOBAL; StrArrToRect(codes, &subfield->dim, &subfield->data); AddSubfield(field, subfield); } field->data = get_genhd(name, hdr); AddField(&list, field); } if (fea->fea_type != NONE) { field = AddGlobalField(&list, "FeaSubtype", 0, NULL, ESHORT, NULL); *(short *) field->data = fea->fea_type; subfield = NewFieldSpec(ECHAR, 2); subfield->name = savestring("enumStrings"); subfield->occurrence = GLOBAL; StrArrToRect(fea_file_type, &subfield->dim, &subfield->data); AddSubfield(field, subfield); } var = &hdr->variable; if (copy_sources) { nsrc = MAX(var->nnames, var->nheads); for (i = 0; i < nsrc; i++) { source = (i >= var->nheads) ? NULL : fea_to_FieldList(var->srchead[i], NULL, NULL, TRUE); name = (i >= var->nnames) ? NULL : var->source[i]; (void) AddSource(&list, i, name, source); } } if (var->comment != NULL) { line = savestring(var->comment); len = strlen(line); if (line[len-1] == '\n') line[len-1] = '\0'; (void) AddCommandLine(&list, line); } return list; }
static struct header * FieldList_to_fea(FieldList list, struct fea_data **rec, char **fnames, int copy_sources) { struct header *hdr; int i, j; FieldSpec *fld; char **codes; FieldList subfields; FieldSpec *subf; char *name; void *ptr; int spstype; long *dim; struct fea_header *fea; struct header *source; if (list == NULL) return NULL; hdr = new_header(FT_FEA); for (i = 0; (fld = list[i]) != NULL; i++) { codes = NULL; if (fld->occurrence != VIRTUAL && (subfields = fld->subfields) != NULL) { for (j = 0; (subf = subfields[j]) != NULL; j++) { if (strcmp(subf->name, "enumStrings") != 0) { if (debug_level) fprintf(stderr, "FieldList_to_fea: subfields " "not supported in ESPS FEA files.\n"); } else if (fld->type != SHORT) { if (debug_level) fprintf(stderr, "FieldList_to_fea: Non-SHORT field " "has subfield enumStrings.\n"); } else if (subf->type != CHAR) { if (debug_level) fprintf(stderr, "FieldList_to_fea: enumStrings not CHAR.\n"); } else if (subf->rank != 2) { if (debug_level) fprintf(stderr, "FieldList_to_fea: enumStrings " "not of rank 2.\n"); } else codes = StrArrayFromRect(subf->dim, subf->data); } } if (FieldIsTag(fld) && FindStr(ESPS_TAG, fnames)) hdr->common.tag = TRUE; else if (FieldIsFeaSubtype(fld)) hdr->hd.fea->fea_type = *(short *) fld->data; else { name = fld->name; switch(fld->occurrence) { case GLOBAL: { int size = (int) FieldLength(fld); ptr = fld->data; if (debug_level >= 2) fprintf(stderr, "FieldList_to_fea: " "global field[%d]: \"%s\".\n", i, name); if (fld->rank > 1) { if (debug_level) fprintf(stderr, "FieldList_to_fea: rank %d globals " "not supported in ESPS FEA files.\n", fld->rank); } if (size == 0) { if (debug_level) fprintf(stderr, "FieldList_to_fea: empty globals " "not supported in ESPS FEA files.\n"); } else if (codes != NULL) (void) add_genhd_e(name, (short *) ptr, size, codes, hdr); else switch (fld->type) { case DOUBLE: (void) add_genhd_d(name, (double *) ptr, size, hdr); break; case FLOAT: (void) add_genhd_f(name, (float *) ptr, size, hdr); break; case LONG: (void) add_genhd_l(name, (long *) ptr, size, hdr); break; case SHORT: (void) add_genhd_s(name, (short *) ptr, size, hdr); break; case SCHAR: case UCHAR: case CHAR: (void) add_genhd_c(name, (char *) ptr, size, hdr); break; default: if (debug_level) fprintf(stderr, "FieldList_to_fea: global type %d " "not supported in ESPS FEA files.\n", fld->type); } } break; case REQUIRED: { long size = FieldLength(fld); if (debug_level >= 2) fprintf(stderr, "FieldList_to_fea: " "required field[%d]: \"%s\".\n", i, name); if (FindStr(name, fnames)) { spstype = (codes != NULL) ? CODED : ElibTypeToEsps(fld->type); if (spstype != UNDEF) { dim = (long *) malloc(fld->rank * sizeof(long)); for (j = 0; j < fld->rank; j++) dim[j] = fld->dim[j]; add_fea_fld(name, size, fld->rank, dim, spstype, codes, hdr); } } } break; case OPTIONAL: if (debug_level) fprintf(stderr, "FieldList_to_fea: optional fields " "not supported in ESPS FEA files.\n"); break; case VIRTUAL: if (copy_sources) { if (strncmp(name, "source_", 7) != 0) { if (debug_level) fprintf(stderr, "Field_List_to_fea: VIRTUAL " "field other than source_<n>.\n"); } else if ((subfields = fld->subfields) != NULL || fld->type == CHAR) { size_t len; char *data; source = FieldList_to_fea(subfields, NULL, NULL, TRUE); len = FieldLength(fld); data = (char *) malloc(len + 1); strncpy(data, fld->data, len); data[len] = '\0'; add_source_file(hdr, data, source); } } break; case INCLUDED: if (debug_level) fprintf(stderr, "FieldList_to_fea: included fields " "not supported in ESPS FEA files.\n"); break; default: spsassert(0, "FieldList_to_fea: " "unrecognized occurrence code.\n"); break; } } } if (rec != NULL) { *rec = allo_fea_rec(hdr); fea = hdr->hd.fea; if (hdr->common.tag) { fld = FindField(list, ESPS_TAG); fld->data = &(*rec)->tag; } for (i = 0; i < (int) fea->field_count; i++) { name = fea->names[i]; fld = FindField(list, name); fld->data = get_fea_ptr(*rec, name, hdr); } } return hdr; }