int ReadFieldList(FieldList *list, int arch, FILE *file) { switch (arch) { case EDR1: return ReadEdrFieldList(list, file, EDR1); break; case EDR2: return ReadEdrFieldList(list, file, EDR2); break; case NATIVE: return ReadNativeFieldList(list, file); break; case ASCII: return ReadAsciiFieldList(list, file); break; default: return FALSE; break; } }
static FieldSpec * ReadNativeFieldSpec(FILE *file) { char *name; /* field name */ short type; /* data type code */ short rank; /* number of dimensions */ int i; /* loop index */ FieldSpec *field; /* field spec being read */ long num_ax_names; /* number of axis names */ /* Read name, type, rank. */ if (!ReadNativeString(&name, file)) return NULL; /* Failure getting field name. */ if (fread(&type, sizeof(short), 1, file) != 1) return NULL; /* Couldn't get type. */ if (fread(&rank, sizeof(short), 1, file) != 1) return NULL; /* Couldn't get rank. */ /* Allocate structure. */ field = NewFieldSpec(type, rank); if (field == NULL) return NULL; /* Couldn't create field spec. */ field->name = name; /* Read dimensions. */ if (rank != 0 && field->dim == NULL) return NULL; /* Inconsistent rank and dimensions. */ if (fread(field->dim, sizeof(long), rank, file) != rank) return NULL; /* Couldn't get dimensions. */ /* Read units, scale, offset, axis_names. */ if (!ReadNativeString(&field->units, file)) return NULL; if (fread(&field->scale, sizeof(double), 1, file) != 1) return NULL; /* Couldn't get scale. */ if (fread(&field->offset, sizeof(double), 1, file) != 1) return NULL; /* Couldn't get offset. */ if (fread(&num_ax_names, sizeof(long), 1, file) != 1) return NULL; /* Couldn't get number of axis names. */ if (num_ax_names > rank) return NULL; /* Bad value for num_ax_names. */ if (num_ax_names != 0) { field->axis_names = (char **) malloc(rank * sizeof(char *)); if (field->axis_names == NULL) return NULL; /* Allocation failure. */ for (i = 0; i < num_ax_names; i++) ReadNativeString(&field->axis_names[i], file); for ( ; i < rank; i++) field->axis_names[i] = NULL; } /* Read occurrence class. */ if (fread(&field->occurrence, sizeof(short), 1, file) != 1) return NULL; /* Couldn't get occurrence code. */ /* Read data if required. */ if (type != NO_TYPE && field->occurrence != REQUIRED && field->occurrence != OPTIONAL) { if (!ReadNativeData(field, file)) return NULL; /* Failure reading data. */ } /* Read subfield list. */ if (!ReadNativeFieldList(&field->subfields, file)) { FreeFieldSpec(field); return NULL; /* Failure getting subfields. */ } return field; /* Success. */ }
FieldList ReadHeader(char **version, /* version (output) */ int *arch, /* architecture (output) */ long *pre_size, /* preamble size (output) */ long *hdr_size, /* header size (output) */ long *rec_size, /* record size (output) */ FILE *file) /* input file */ { FieldList list; char *architecture; if (!ReadPreamble(version, &architecture, pre_size, hdr_size, rec_size, file)) return NULL; /* Bad preamble. */ if (strcmp(architecture, EsignalArch) == 0) /* native architecture */ { if (arch != NULL) *arch = NATIVE; if (!ReadNativeFieldList(&list, file)) return NULL; } else if (strcmp(architecture, "EDR1") == 0) { if (arch != NULL) *arch = EDR1; /* * On machines whose native architecture is EDR1, could call * ReadNativeFieldList here. */ if (!ReadEdrFieldList(&list, file, EDR1)) return NULL; } else if (strcmp(architecture, "EDR2") == 0) { if (arch != NULL) *arch = EDR2; /* * On machines whose native architecture is EDR2, could call * ReadNativeFieldList here. */ if (!ReadEdrFieldList(&list, file, EDR2)) return NULL; } else if (strcmp(architecture, "ASCII") == 0) { if (arch != NULL) *arch = ASCII; if (!ReadAsciiFieldList(&list, file)) return NULL; } else { if (arch != NULL) *arch = UNKNOWN; return NULL; /* Unsupported architecture. */ } return list; }