SDIFresult SDIF_ReadMatrixData(void *putItHere, FILE *f, const SDIF_MatrixHeader *head) { size_t datumSize = (size_t) SDIF_GetMatrixDataTypeSize(head->matrixDataType); size_t numItems = (size_t) (head->rowCount * head->columnCount); #ifdef LITTLE_ENDIAN switch (datumSize) { case 1: return SDIF_Read1(putItHere, numItems, f); case 2: return SDIF_Read2(putItHere, numItems, f); case 4: return SDIF_Read4(putItHere, numItems, f); case 8: return SDIF_Read8(putItHere, numItems, f); default: return ESDIF_BAD_MATRIX_DATA_TYPE; } /* This is never reached */ return ESDIF_SUCCESS; #else if (fread(putItHere, datumSize, numItems, f) == numItems) { return ESDIF_SUCCESS; } else { return ESDIF_READ_FAILED; } #endif }
int32_t SDIF_GetMatrixDataSize(const SDIF_MatrixHeader *m) { int32_t size; size = SDIF_GetMatrixDataTypeSize(m->matrixDataType) * m->rowCount * m->columnCount; if ((size % 8) != 0) { size += (8 - (size % 8)); } return size; }
int32_t SDIF_PaddingRequired(const SDIF_MatrixHeader *m) { int32_t size; size = SDIF_GetMatrixDataTypeSize(m->matrixDataType) * m->rowCount * m->columnCount; if ((size % 8) != 0) { return (8 - (size % 8)); } else { return 0; } }
SDIFresult SDIFmem_WriteMatrix(FILE *sdif_handle, SDIFmem_Matrix m) { SDIFresult r; sdif_int32 sz, numElements; int paddingNeeded; if ((r = SDIF_WriteMatrixHeader(&(m->header), sdif_handle))!=ESDIF_SUCCESS) { return r; } sz = SDIF_GetMatrixDataTypeSize(m->header.matrixDataType); numElements = (m->header.rowCount * m->header.columnCount); switch (sz) { case 1: r = SDIF_Write1(m->data, numElements, sdif_handle); break; case 2: r = SDIF_Write2(m->data, numElements, sdif_handle); break; case 4: r = SDIF_Write4(m->data, numElements, sdif_handle); break; case 8: r = SDIF_Write8(m->data, numElements, sdif_handle); break; default: return ESDIF_BAD_MATRIX_DATA_TYPE; } if (r !=ESDIF_SUCCESS) return r; paddingNeeded = SDIF_PaddingRequired(&(m->header)); if (paddingNeeded) { char pad[8] = "\0\0\0\0\0\0\0\0"; if ((r = SDIF_Write1(pad, paddingNeeded, sdif_handle))!=ESDIF_SUCCESS) return r; } return ESDIF_SUCCESS; }