ambix_err_t ambix_matrix_fill_data_transposed(ambix_matrix_t*mtx, const float32_t*data, int byteswap) { ambix_err_t err=AMBIX_ERR_SUCCESS; ambix_matrix_t*xtm=ambix_matrix_init(mtx->cols, mtx->rows, NULL); if(!xtm) return AMBIX_ERR_UNKNOWN; if(byteswap) err=_ambix_matrix_fill_data_byteswapped(xtm, (const number32_t*)data); else err=ambix_matrix_fill_data(xtm, data); if(AMBIX_ERR_SUCCESS==err) { ambix_matrix_t*resu=ambix_matrix_transpose(mtx, xtm); if(!resu) err=AMBIX_ERR_UNKNOWN; } ambix_matrix_destroy(xtm); return err; }
ambix_matrix_t* _ambix_uuid1_to_matrix(const void*vdata, uint64_t datasize, ambix_matrix_t*orgmtx, int swap) { const char*cdata=(const char*)vdata; ambix_matrix_t*mtx=orgmtx; uint32_t rows; uint32_t cols; uint64_t size; uint32_t index; if(datasize<(sizeof(rows)+sizeof(cols))) return NULL; index = 0; memcpy(&rows, cdata+index, sizeof(uint32_t)); index += sizeof(uint32_t); memcpy(&cols, cdata+index, sizeof(uint32_t)); index += sizeof(uint32_t); if(swap) { rows=swap4(rows); cols=swap4(cols); } size=rows*cols; if(rows<1 || cols<1 || size < 1) goto cleanup; if(size*sizeof(float32_t) > datasize) { goto cleanup; } if(!mtx) { mtx=(ambix_matrix_t*)calloc(1, sizeof(ambix_matrix_t)); if(!mtx) goto cleanup; } if(!ambix_matrix_init(rows, cols, mtx)) goto cleanup; if(swap) { if(_ambix_matrix_fill_data_byteswapped(mtx, (number32_t*)(cdata+index)) != AMBIX_ERR_SUCCESS) goto cleanup; } else { if(ambix_matrix_fill_data(mtx, (float32_t*)(cdata+index)) != AMBIX_ERR_SUCCESS) goto cleanup; } return mtx; cleanup: if(mtx && mtx!=orgmtx) { ambix_matrix_deinit(mtx); free(mtx); mtx=NULL; } return NULL; }