static int ReadNativeArray(Array *array, FILE *file) { short type, rank; long *dim; long length; long size; void *data; if (array == NULL || file == NULL) return FALSE; /* Read type, rank. */ if (fread(&type, sizeof(short), 1, file) != 1) return FALSE; /* Couldn't get type. */ if (fread(&rank, sizeof(short), 1, file) != 1) return FALSE; /* Couldn't get rank. */ if (rank == 0) dim = NULL; else { dim = (long *) malloc(rank * sizeof(long)); if (dim == NULL) return FALSE; /* Allocation failure. */ if (fread(dim, sizeof(long), rank, file) != rank) return FALSE; /* Couldn't get dimensions. */ } length = LongProd(rank, dim); size = InternTypeSize(type); if (length == 0) data = NULL; else { data = malloc(length*size); if (data == NULL) return FALSE; /* Allocation failure. */ if (NativeRead(data, type, length, file) != length) return FALSE; } array->type = type; array->rank = rank; array->dim = dim; array->data = data; return TRUE; }
long FieldLength(FieldSpec *field) { if (field == NULL || field->rank != 0 && field->dim == NULL || field->type == NO_TYPE) { return 0; } return LongProd(field->rank, field->dim); }
static int WriteNativeArray(Array *array, FILE *file) { short type, rank; long *dim; void *data; long length; if (array == NULL || file == NULL) return FALSE; type = array->type; rank = array->rank; dim = array->dim; data = array->data; if (fwrite(&type, sizeof(short), 1, file) != 1) return FALSE; if (fwrite(&rank, sizeof(short), 1, file) != 1) return FALSE; if (rank > 0) { if (dim == NULL) return FALSE; if (fwrite(dim, sizeof(long), rank, file) != rank) return FALSE; } length = LongProd(rank, dim); if (length > 0) { if (data == NULL) return FALSE; if (NativeWrite(data, type, length, file) != length) return FALSE; } return TRUE; }