[ismrmrd] 17/177: fixing CMakeLists for ISMRMRD 1.0 C-API.
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:01:57 UTC 2015
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to annotated tag v1.1.0.beta.1
in repository ismrmrd.
commit b3d00c7f6ce874798262a8a66471105f24004809
Author: Joseph Naegele <joseph.naegele at gmail.com>
Date: Wed Aug 6 10:58:53 2014 -0400
fixing CMakeLists for ISMRMRD 1.0 C-API.
also checking results of all *alloc calls.
---
CMakeLists.txt | 48 ++++-----
examples/c/CMakeLists.txt | 21 ++++
examples/c/main.c | 75 ++++++++++++++
ismrmrd.c | 234 ++++++++++++++++++++++++--------------------
ismrmrd.h | 15 ++-
ismrmrd_dataset.c | 50 +++++++---
ismrmrd_dataset.h | 2 +-
tests/c/basic_test.c | 81 ---------------
utilities/ismrmrd_phantom.h | 1 +
9 files changed, 288 insertions(+), 239 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f9b3826..bf33417 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,38 +41,29 @@ if (WIN32)
endif (WIN32)
# required packages for main library
-find_package(Boost COMPONENTS thread system REQUIRED)
-find_package(HDF5 1.8 COMPONENTS C CXX HL REQUIRED)
+find_package(HDF5 1.8 COMPONENTS C HL REQUIRED)
-# necessary for Windows and RHEL <=6 systems
-set(Boost_NO_BOOST_CMAKE ON)
+include_directories(${HDF5_C_INCLUDE_DIR})
-if(WIN32)
- add_definitions( -DBOOST_ALL_NO_LIB )
- add_definitions( -DBOOST_ALL_DYN_LINK )
-endif(WIN32)
-
-add_library(ismrmrd SHARED ismrmrd_hdf5.cpp)
-include_directories(${HDF5_C_INCLUDE_DIR} ${HDF5_CXX_INCLUDE_DIR}
- ${Boost_INCLUDE_DIR})
+add_library(ismrmrd SHARED ismrmrd.c ismrmrd_dataset.c)
+add_library(ismrmrd++ SHARED ismrmrd.c ismrmrd.cpp ismrmrd_dataset.c)
#The findHDF5.cmake does not work very well on Windows, let's help it out
if(WIN32)
- target_link_libraries(ismrmrd optimized ${HDF5_hdf5_LIBRARY_RELEASE}
- optimized ${HDF5_hdf5_cpp_LIBRARY_RELEASE})
- target_link_libraries(ismrmrd debug ${HDF5_hdf5_LIBRARY_DEBUG}
- debug ${HDF5_hdf5_cpp_LIBRARY_DEBUG})
- target_link_libraries(ismrmrd ${Boost_LIBRARIES})
+ target_link_libraries(ismrmrd optimized ${HDF5_hdf5_LIBRARY_RELEASE})
+ target_link_libraries(ismrmrd debug ${HDF5_hdf5_LIBRARY_DEBUG})
+ target_link_libraries(ismrmrd++ optimized ${HDF5_hdf5_LIBRARY_RELEASE})
+ target_link_libraries(ismrmrd++ debug ${HDF5_hdf5_LIBRARY_DEBUG})
else(WIN32)
- target_link_libraries(ismrmrd ${HDF5_LIBRARIES} ${Boost_THREAD_LIBRARY}
- ${Boost_SYSTEM_LIBRARY})
+ target_link_libraries(ismrmrd ${HDF5_LIBRARIES})
+ target_link_libraries(ismrmrd++ ${HDF5_LIBRARIES})
endif(WIN32)
-install(TARGETS ismrmrd
- DESTINATION ${ISMRMRD_INSTALL_LIB_DIR})
+install(TARGETS ismrmrd ismrmrd++ DESTINATION ${ISMRMRD_INSTALL_LIB_DIR})
install(FILES ${ISMRMRD_SOURCE_DIR}/ismrmrd.h
- ${ISMRMRD_SOURCE_DIR}/ismrmrd_hdf5.h
+ ${ISMRMRD_SOURCE_DIR}/ismrmrd.hpp
+ ${ISMRMRD_SOURCE_DIR}/ismrmrd_dataset.h
${ISMRMRD_SOURCE_DIR}/ismrmrd_hdf5_datatypes.h
${ISMRMRD_SOURCE_DIR}/ismrmrd_export.h
DESTINATION ${ISMRMRD_INSTALL_INCLUDE_DIR})
@@ -92,9 +83,7 @@ wrap_xsd(XSDS_SOURCES XSD_INCLUDES ${CMAKE_CURRENT_BINARY_DIR}/schema ${XSDS} OP
if ( WIN32 )
include_directories(${ISMRMRD_SCHEMA_SOURCE_DIR} ${XSD_INCLUDE_DIR}
- ${XERCESC_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${HDF5_CXX_INCLUDE_DIR}
- ${HDF5_C_INCLUDE_DIR})
- link_directories(${Boost_LIBRARY_DIRS})
+ ${XERCESC_INCLUDE_DIR} ${HDF5_CXX_INCLUDE_DIR} ${HDF5_C_INCLUDE_DIR})
endif ( WIN32 )
if ( NOT WIN32 )
@@ -117,9 +106,10 @@ install(FILES ${ISMRMRD_MODULE_DIR}/FindIsmrmrd.cmake
${ISMRMRD_MODULE_DIR}/FindNumPy.cmake
DESTINATION ${ISMRMRD_INSTALL_MODULE_DIR})
-add_subdirectory(examples/c++)
-add_subdirectory(utilities)
-add_subdirectory(tests)
add_subdirectory(doc)
+add_subdirectory(examples/c)
+#add_subdirectory(examples/c++)
+#add_subdirectory(utilities)
+#add_subdirectory(tests)
add_subdirectory(matlab)
-add_subdirectory(bindings)
+#add_subdirectory(bindings)
diff --git a/examples/c/CMakeLists.txt b/examples/c/CMakeLists.txt
new file mode 100644
index 0000000..b391157
--- /dev/null
+++ b/examples/c/CMakeLists.txt
@@ -0,0 +1,21 @@
+find_package(FFTW3 COMPONENTS single)
+
+if(NOT FFTW3_FOUND)
+ message("FFTW3 NOT Found, cannot build examples")
+ return()
+endif(NOT FFTW3_FOUND)
+
+message("FFTW3 Found, building C examples")
+include_directories(${ISMRMRD_SOURCE_DIR} ${ISMRMRD_SCHEMA_SOURCE_DIR} ${FFTW3_INCLUDE_DIR})
+if(WIN32)
+ # building with xsd sources on Windows
+ set_source_files_properties(${XSDS_SOURCES} PROPERTIES GENERATED TRUE)
+ add_executable(ismrmrd_c_demo main.c ${XSDS_SOURCES})
+ target_link_libraries(ismrmrd_c_demo ${XERCESC_LIBRARIES} ismrmrd ${FFTW3_LIBRARIES})
+else(WIN32)
+ # linking with ismrmrd_xsd on Linux / OSX
+ add_executable(ismrmrd_c_demo main.c)
+ target_link_libraries(ismrmrd_c_demo ismrmrd ismrmrd_xsd ${FFTW3_LIBRARIES})
+endif(WIN32)
+
+install(TARGETS ismrmrd_c_demo DESTINATION ${ISMRMRD_INSTALL_BIN_DIR})
diff --git a/examples/c/main.c b/examples/c/main.c
new file mode 100644
index 0000000..abe66f8
--- /dev/null
+++ b/examples/c/main.c
@@ -0,0 +1,75 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ismrmrd.h"
+#include "ismrmrd_dataset.h"
+
+void myerror(const char *file, int line, const char *func, int err, char *msg) {
+ char *msgtype = ismrmrd_strerror(err);
+ fprintf(stderr, "Whoa! ERROR: %s in %s, line %d: %s\n", msgtype, file, line, msg);
+ exit(-1);
+}
+
+int main(void)
+{
+ int status;
+ ISMRMRD_Dataset dataset, dataset2;
+ const char *filename = "myfile.h5";
+ const char *groupname = "/dataset";
+ const char *xmlhdr = "This is some text for the header.";
+
+ /* Set the error handler */
+ ismrmrd_set_error_handler(myerror);
+
+ /* Create a data set */
+ ismrmrd_init_dataset(&dataset, filename, groupname);
+ status = ismrmrd_open_dataset(&dataset, true);
+
+ status = ismrmrd_write_header(&dataset, xmlhdr);
+
+ /* Close the dataset */
+ status = ismrmrd_close_dataset(&dataset);
+
+ /* Reopen the file as a different dataset */
+ ismrmrd_init_dataset(&dataset2, filename, groupname);
+ status = ismrmrd_open_dataset(&dataset2, false);
+
+ /* Read the header */
+ char *xmlstring = ismrmrd_read_header(&dataset2);
+ printf("Header: %s\n", xmlstring);
+
+ /* Get the number of acquisitions */
+ printf("Number of Acquisitions: %lu\n", ismrmrd_get_number_of_acquisitions(&dataset2));
+
+ /* Clean up */
+ free(xmlstring);
+
+ /* Close the dataset */
+ status = ismrmrd_close_dataset(&dataset2);
+
+ ISMRMRD_Acquisition acq;
+ ismrmrd_init_acquisition(&acq);
+ acq.head.number_of_samples = 128;
+ acq.head.active_channels = 4;
+ ismrmrd_make_consistent_acquisition(&acq);
+ printf("Acq Version: %d\n", acq.head.version);
+
+ ismrmrd_set_flag(&(acq.head.flags), ISMRMRD_ACQ_FIRST_IN_SLICE);
+ printf("Flags: %llu\n", acq.head.flags);
+ printf("ACQ_FIRST_IN_SLICE: %d\n", ismrmrd_is_flag_set(acq.head.flags, ISMRMRD_ACQ_FIRST_IN_SLICE));
+ ismrmrd_clear_flag(&(acq.head.flags), ISMRMRD_ACQ_FIRST_IN_SLICE);
+ printf("Flags: %llu\n", acq.head.flags);
+ printf("ACQ_FIRST_IN_SLICE: %d\n", ismrmrd_is_flag_set(acq.head.flags, ISMRMRD_ACQ_FIRST_IN_SLICE));
+
+ // Image im;
+ //initImage(&im);
+ //printf("Image Version: %d\n", im.head.version);
+
+ //NDArray arr;
+ //initNDArray(&arr);
+ //printf("Array ndim: %d\n", arr.ndim);
+ //printf("Array dim[0]: %d\n", arr.dims[0]);
+
+ return 0;
+}
diff --git a/ismrmrd.c b/ismrmrd.c
index 38e3558..8124128 100644
--- a/ismrmrd.c
+++ b/ismrmrd.c
@@ -1,19 +1,27 @@
/* Language and Cross platform section for defining types */
#ifdef __cplusplus
+
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cassert>
-/* TODO this should be wrapped in ifdef DEBUG */
+
+#ifdef DEBUG
#include <cstdio>
+#endif /* DEBUG */
+
#else
+
/* C99 compiler */
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
-/* TODO this should be wrapped in ifdef DEBUG */
+
+#ifdef DEBUG
#include <stdio.h>
+#endif /* DEBUG */
+
#endif /* __cplusplus */
#include "ismrmrd.h"
@@ -32,7 +40,7 @@ void ismrmrd_init_acquisition_header(ISMRMRD_AcquisitionHeader *hdr) {
}
void ismrmrd_init_acquisition(ISMRMRD_Acquisition *acq) {
- ismrmrd_init_acquisition_header(&(acq->head));
+ ismrmrd_init_acquisition_header(&acq->head);
acq->traj = NULL;
acq->data = NULL;
}
@@ -44,13 +52,13 @@ void ismrmrd_free_acquisition(ISMRMRD_Acquisition *acq) {
}
void ismrmrd_copy_acquisition(ISMRMRD_Acquisition *acqdest, const ISMRMRD_Acquisition *acqsource) {
- memcpy(&(acqdest->head), &(acqsource->head), sizeof(ISMRMRD_AcquisitionHeader));
+ memcpy(&acqdest->head, &acqsource->head, sizeof(ISMRMRD_AcquisitionHeader));
ismrmrd_make_consistent_acquisition(acqdest);
- memcpy(&(acqdest->traj), &(acqsource->traj), ismrmrd_size_of_acquisition_traj(acqdest));
- memcpy(&(acqdest->data), &(acqsource->data), ismrmrd_size_of_acquisition_data(acqdest));
+ memcpy(&acqdest->traj, &acqsource->traj, ismrmrd_size_of_acquisition_traj(acqdest));
+ memcpy(&acqdest->data, &acqsource->data, ismrmrd_size_of_acquisition_data(acqdest));
}
-void ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq) {
+int ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq) {
if (acq->head.available_channels < acq->head.active_channels) {
acq->head.available_channels = acq->head.active_channels;
}
@@ -58,30 +66,34 @@ void ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq) {
size_t traj_size = ismrmrd_size_of_acquisition_traj(acq);
if (traj_size > 0) {
acq->traj = (float *)realloc(acq->traj, traj_size);
+ if (acq->traj == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR,
+ "Failed to realloc acquisition trajectory array");
+ return ISMRMRD_MEMORYERROR;
+ }
}
size_t data_size = ismrmrd_size_of_acquisition_data(acq);
if (data_size > 0) {
acq->data = (complex_float_t *)realloc(acq->data, data_size);
+ if (acq->data == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR,
+ "Failed to realloc acquisition data array");
+ return ISMRMRD_MEMORYERROR;
+ }
}
+
+ return ISMRMRD_NOERROR;
}
size_t ismrmrd_size_of_acquisition_traj(const ISMRMRD_Acquisition *acq) {
- size_t traj_size = 0;
int num_traj = acq->head.number_of_samples * acq->head.trajectory_dimensions;
- if (num_traj > 0) {
- traj_size = num_traj * sizeof(acq->traj);
- }
- return traj_size;
+ return num_traj * sizeof(*acq->traj);
}
size_t ismrmrd_size_of_acquisition_data(const ISMRMRD_Acquisition *acq) {
- size_t data_size = 0;
int num_data = acq->head.number_of_samples * acq->head.active_channels;
- if (num_data > 0) {
- data_size = num_data * sizeof(acq->data);
- }
- return data_size;
+ return num_data * sizeof(*acq->data);
}
/* ImageHeader functions */
@@ -96,7 +108,7 @@ void ismrmrd_init_image_header(ISMRMRD_ImageHeader *hdr) {
/* Image functions */
void ismrmrd_init_image(ISMRMRD_Image *im) {
- ismrmrd_init_image_header(&(im->head));
+ ismrmrd_init_image_header(&im->head);
im->attribute_string = NULL;
im->data = NULL;
}
@@ -108,69 +120,76 @@ void ismrmrd_free_image(ISMRMRD_Image *im) {
}
void ismrmrd_copy_image(ISMRMRD_Image *imdest, const ISMRMRD_Image *imsource) {
- memcpy(&(imdest->head), &(imsource->head), sizeof(ISMRMRD_ImageHeader));
+ memcpy(&imdest->head, &imsource->head, sizeof(ISMRMRD_ImageHeader));
ismrmrd_make_consistent_image(imdest);
- size_t attr_size = ismrmrd_size_of_image_attribute_string(imdest);
- if (attr_size > 0) {
- memcpy(&(imdest->attribute_string), &(imsource->attribute_string), attr_size);
- }
- size_t data_size = ismrmrd_size_of_image_data(imdest);
- if (data_size > 0) {
- memcpy(&(imdest->data), &(imsource->data), data_size);
- }
+ memcpy(&imdest->attribute_string, &imsource->attribute_string,
+ ismrmrd_size_of_image_attribute_string(imdest));
+ memcpy(&imdest->data, &imsource->data, ismrmrd_size_of_image_data(imdest));
}
-void ismrmrd_make_consistent_image(ISMRMRD_Image *im) {
+int ismrmrd_make_consistent_image(ISMRMRD_Image *im) {
size_t attr_size = ismrmrd_size_of_image_attribute_string(im);
if (attr_size > 0) {
im->attribute_string = (char *)realloc(im->attribute_string, attr_size);
+ if (im->attribute_string == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR,
+ "Failed to realloc image attribute string");
+ return ISMRMRD_MEMORYERROR;
+ }
}
+
size_t data_size = ismrmrd_size_of_image_data(im);
if (data_size > 0) {
im->data = realloc(im->data, data_size);
+ if (im->data == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR,
+ "Failed to realloc image data array");
+ return ISMRMRD_MEMORYERROR;
+ }
}
+
+ return ISMRMRD_NOERROR;
}
size_t ismrmrd_size_of_image_data(const ISMRMRD_Image *im) {
size_t data_size = 0;
- int num_data = im->head.matrix_size[0] * im->head.matrix_size[1] * im->head.matrix_size[2] * im->head.channels;
- if (num_data > 0) {
- switch (im->head.data_type) {
- case ISMRMRD_USHORT:
- data_size = num_data * sizeof(uint16_t);
- break;
- case ISMRMRD_SHORT:
- data_size = num_data * sizeof(int16_t);
- break;
- case ISMRMRD_UINT:
- data_size = num_data * sizeof(uint32_t);
- break;
- case ISMRMRD_INT:
- data_size = num_data * sizeof(int32_t);
- break;
- case ISMRMRD_FLOAT:
- data_size = num_data * sizeof(float);
- break;
- case ISMRMRD_DOUBLE:
- data_size = num_data * sizeof(double);
- break;
- case ISMRMRD_CXFLOAT:
- data_size = num_data * sizeof(complex_float_t);
- break;
- case ISMRMRD_CXDOUBLE:
- data_size = num_data * sizeof(complex_double_t);
- break;
- }
+ int num_data = im->head.matrix_size[0] * im->head.matrix_size[1] *
+ im->head.matrix_size[2] * im->head.channels;
+
+ switch (im->head.data_type) {
+ case ISMRMRD_USHORT:
+ data_size = num_data * sizeof(uint16_t);
+ break;
+ case ISMRMRD_SHORT:
+ data_size = num_data * sizeof(int16_t);
+ break;
+ case ISMRMRD_UINT:
+ data_size = num_data * sizeof(uint32_t);
+ break;
+ case ISMRMRD_INT:
+ data_size = num_data * sizeof(int32_t);
+ break;
+ case ISMRMRD_FLOAT:
+ data_size = num_data * sizeof(float);
+ break;
+ case ISMRMRD_DOUBLE:
+ data_size = num_data * sizeof(double);
+ break;
+ case ISMRMRD_CXFLOAT:
+ data_size = num_data * sizeof(complex_float_t);
+ break;
+ case ISMRMRD_CXDOUBLE:
+ data_size = num_data * sizeof(complex_double_t);
+ break;
+ default:
+ ISMRMRD_THROW(ISMRMRD_TYPEERROR, "Invalid image data type");
+ data_size = 0;
}
return data_size;
}
size_t ismrmrd_size_of_image_attribute_string(const ISMRMRD_Image *im) {
- size_t attribute_string_size = 0;
- if (im->head.attribute_string_len > 0) {
- attribute_string_size = im->head.attribute_string_len * sizeof(im->attribute_string);
- }
- return attribute_string_size;
+ return im->head.attribute_string_len * sizeof(*im->attribute_string);
}
/* NDArray functions */
@@ -197,85 +216,89 @@ void ismrmrd_copy_ndarray(ISMRMRD_NDArray *arrdest, const ISMRMRD_NDArray *arrso
arrdest->dims[n] = arrsource->dims[n];
}
ismrmrd_make_consistent_ndarray(arrdest);
- size_t data_size = ismrmrd_size_of_ndarray_data(arrdest);
- if (data_size > 0) {
- memcpy(&(arrdest->data), &(arrsource->data), ismrmrd_size_of_ndarray_data(arrdest));
- }
+ memcpy(&arrdest->data, &arrsource->data, ismrmrd_size_of_ndarray_data(arrdest));
}
-void ismrmrd_make_consistent_ndarray(ISMRMRD_NDArray *arr) {
+int ismrmrd_make_consistent_ndarray(ISMRMRD_NDArray *arr) {
size_t data_size = ismrmrd_size_of_ndarray_data(arr);
if (data_size > 0) {
arr->data = realloc(arr->data, data_size);
+ if (arr->data == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR,
+ "Failed to realloc NDArray data array");
+ return ISMRMRD_MEMORYERROR;
+ }
}
+
+ return ISMRMRD_NOERROR;
}
size_t ismrmrd_size_of_ndarray_data(const ISMRMRD_NDArray *arr) {
size_t data_size = 0;
int num_data = 1;
+ int n = 0;
for (int n = 0; n < ISMRMRD_NDARRAY_MAXDIM; n++) {
num_data *= arr->dims[n];
}
- if (num_data > 0) {
- switch (arr->data_type) {
- case ISMRMRD_USHORT:
- data_size = num_data * sizeof(uint16_t);
- break;
- case ISMRMRD_SHORT:
- data_size = num_data * sizeof(int16_t);
- break;
- case ISMRMRD_UINT:
- data_size = num_data * sizeof(uint32_t);
- break;
- case ISMRMRD_INT:
- data_size = num_data * sizeof(int32_t);
- break;
- case ISMRMRD_FLOAT:
- data_size = num_data * sizeof(float);
- break;
- case ISMRMRD_DOUBLE:
- data_size = num_data * sizeof(double);
- break;
- case ISMRMRD_CXFLOAT:
- data_size = num_data * sizeof(complex_float_t);
- break;
- case ISMRMRD_CXDOUBLE:
- data_size = num_data * sizeof(complex_double_t);
- break;
- }
+
+ switch (arr->data_type) {
+ case ISMRMRD_USHORT:
+ data_size = num_data * sizeof(uint16_t);
+ break;
+ case ISMRMRD_SHORT:
+ data_size = num_data * sizeof(int16_t);
+ break;
+ case ISMRMRD_UINT:
+ data_size = num_data * sizeof(uint32_t);
+ break;
+ case ISMRMRD_INT:
+ data_size = num_data * sizeof(int32_t);
+ break;
+ case ISMRMRD_FLOAT:
+ data_size = num_data * sizeof(float);
+ break;
+ case ISMRMRD_DOUBLE:
+ data_size = num_data * sizeof(double);
+ break;
+ case ISMRMRD_CXFLOAT:
+ data_size = num_data * sizeof(complex_float_t);
+ break;
+ case ISMRMRD_CXDOUBLE:
+ data_size = num_data * sizeof(complex_double_t);
+ break;
+ default:
+ ISMRMRD_THROW(ISMRMRD_TYPEERROR, "Invalid NDArray data type");
+ data_size = 0;
}
+
return data_size;
}
bool ismrmrd_is_flag_set(const uint64_t flags, const uint64_t val) {
- uint64_t bitmask = 1;
- bitmask = (bitmask << (val - 1));
- return ((flags & bitmask) > 0);
+ uint64_t bitmask = 1 << (val - 1);
+ return (flags & bitmask) > 0;
}
void ismrmrd_set_flag(uint64_t *flags, const uint64_t val) {
- uint64_t bitmask = 1;
- bitmask = (bitmask << (val - 1));
+ uint64_t bitmask = 1 << (val - 1);
*flags |= bitmask;
}
void ismrmrd_clear_flag(uint64_t *flags, const uint64_t val) {
- uint64_t bitmask = 1;
- bitmask = (bitmask << (val - 1));
- if (ismrmrd_is_flag_set(*flags, val)) {
- *flags &= ~bitmask;
- };
+ uint64_t bitmask = 1 << (val - 1);
+ *flags &= ~bitmask;
}
void ismrmrd_clear_all_flags(uint64_t *flags) {
*flags = 0;
}
- static void ismrmrd_error_default(const char *file, int line, const char *func, int err, char *msg)
+static void ismrmrd_error_default(const char *file, int line, const char *func, int err, char *msg)
{
- /* TODO this should be a no op or wrapped in a #ifdef DEBUG */
+#ifdef DEBUG
char *msgtype = ismrmrd_strerror(err);
fprintf(stderr, "ERROR: %s in %s, line %d: %s\n", msgtype, file, line, msg);
+#endif
}
ismrmrd_error_handler_t ismrmrd_error_handler = ismrmrd_error_default;
@@ -387,6 +410,7 @@ void ismrmrd_directions_to_quaternion(float read_dir[3], float phase_dir[3],
quat[3] = (float)d;
}
+/* http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q54 */
void ismrmrd_quaternion_to_directions(float quat[4], float read_dir[3],
float phase_dir[3], float slice_dir[3]) {
float a = quat[0], b = quat[1], c = quat[2], d = quat[3];
diff --git a/ismrmrd.h b/ismrmrd.h
index a6ca04b..9cf558d 100644
--- a/ismrmrd.h
+++ b/ismrmrd.h
@@ -7,7 +7,7 @@
/* Kaveh Vahedipour (k.vahedipour at fz-juelich.de) */
/* Hui Xue (hui.xue at nih.gov) */
/* Souheil Inati (souheil.inati at nih.gov) */
-/* Joeseph Naegele (joseph.naegele at gmail.com) */
+/* Joseph Naegele (joseph.naegele at nih.gov) */
#pragma once
#ifndef ISMRMRD_H
@@ -65,6 +65,7 @@ enum ISMRMRD_ErrorCodes {
ISMRMRD_NOERROR,
ISMRMRD_MEMORYERROR,
ISMRMRD_FILEERROR,
+ ISMRMRD_TYPEERROR,
ISMRMRD_ENDERROR
};
@@ -212,7 +213,7 @@ typedef struct ISMRMRD_Acquisition {
void ismrmrd_init_acquisition(ISMRMRD_Acquisition *acq);
void ismrmrd_free_acquisition(ISMRMRD_Acquisition *acq);
void ismrmrd_copy_acquisition(ISMRMRD_Acquisition *acqdest, const ISMRMRD_Acquisition *acqsource);
-void ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq);
+int ismrmrd_make_consistent_acquisition(ISMRMRD_Acquisition *acq);
size_t ismrmrd_size_of_acquisition_traj(const ISMRMRD_Acquisition *acq);
size_t ismrmrd_size_of_acquisition_data(const ISMRMRD_Acquisition *acq);
@@ -266,7 +267,7 @@ typedef struct ISMRMRD_Image {
void ismrmrd_init_image(ISMRMRD_Image *im);
void ismrmrd_free_image(ISMRMRD_Image *im);
void ismrmrd_copy_image(ISMRMRD_Image *imdest, const ISMRMRD_Image *imsource);
-void ismrmrd_make_consistent_image(ISMRMRD_Image *im);
+int ismrmrd_make_consistent_image(ISMRMRD_Image *im);
size_t ismrmrd_size_of_image_attribute_string(const ISMRMRD_Image *im);
size_t ismrmrd_size_of_image_data(const ISMRMRD_Image *im);
@@ -288,7 +289,7 @@ typedef struct ISMRMRD_NDArray {
void ismrmrd_init_ndarray(ISMRMRD_NDArray *arr);
void ismrmrd_free_ndarray(ISMRMRD_NDArray *arr);
void ismrmrd_copy_ndarray(ISMRMRD_NDArray *arrdest, const ISMRMRD_NDArray *arrsource);
-void ismrmrd_make_consistent_ndarray(ISMRMRD_NDArray *arr);
+int ismrmrd_make_consistent_ndarray(ISMRMRD_NDArray *arr);
size_t ismrmrd_size_of_ndarray_data(const ISMRMRD_NDArray *arr);
/*********/
@@ -319,11 +320,7 @@ int ismrmrd_sign_of_directions(float read_dir[3], float phase_dir[3], float slic
/* Creates a normalized quaternion from a 3x3 rotation matrix */
void ismrmrd_directions_to_quaternion(float read_dir[3], float phase_dir[3], float slice_dir[3], float quat[4]);
-/**
- * Converts a quaternion of the form | a b c d | to a 3x3 rotation matrix
- *
- * http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q54
- */
+/* Converts a quaternion of the form | a b c d | to a 3x3 rotation matrix */
void ismrmrd_quaternion_to_directions(float quat[4], float read_dir[3], float phase_dir[3], float slice_dir[3]);
#pragma pack(pop) // Restore old alignment
diff --git a/ismrmrd_dataset.c b/ismrmrd_dataset.c
index 7b3fa19..9051faa 100644
--- a/ismrmrd_dataset.c
+++ b/ismrmrd_dataset.c
@@ -53,14 +53,20 @@ static int create_link(const ISMRMRD_Dataset *dset, const char *link_path) {
}
static char * make_path(const ISMRMRD_Dataset *dset, const char * var) {
- char *path = (char *) malloc(strlen(dset->groupname)+strlen(var)+2);
- memset(path, '\0', strlen(dset->groupname)+strlen(var)+2);
+ size_t len = strlen(dset->groupname) + strlen(var) + 2;
+
+ char *path = (char *) malloc(len);
+ if (path == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR, "Failed to malloc path");
+ return NULL;
+ }
+
+ memset(path, 0, len);
strcat(path, dset->groupname);
strcat(path, "/");
strcat(path, var);
return path;
}
-
static int delete_var(const ISMRMRD_Dataset *dset, const char *var) {
herr_t status;
@@ -76,15 +82,25 @@ static int delete_var(const ISMRMRD_Dataset *dset, const char *var) {
/********************/
/* Public functions */
/********************/
-void ismrmrd_init_dataset(ISMRMRD_Dataset *dset, const char *filename, const char *groupname) {
+int ismrmrd_init_dataset(ISMRMRD_Dataset *dset, const char *filename, const char *groupname) {
- dset->filename = (char *) realloc(dset->filename, (strlen(filename)+1)*sizeof(char));
+ dset->filename = (char *) malloc(strlen(filename) + 1);
+ if (dset->filename == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR, "Failed to malloc dataset groupname");
+ return ISMRMRD_MEMORYERROR;
+ }
strcpy(dset->filename, filename);
- dset->groupname = (char *) realloc(dset->groupname, (strlen(groupname)+1)*sizeof(char));
+ dset->groupname = (char *) malloc(strlen(groupname) + 1);
+ if (dset->groupname == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR, "Failed to malloc dataset groupname");
+ return ISMRMRD_MEMORYERROR;
+ }
strcpy(dset->groupname, groupname);
dset->fileid = 0;
+
+ return ISMRMRD_NOERROR;
}
int ismrmrd_open_dataset(ISMRMRD_Dataset *dset, const bool create_if_needed) {
@@ -209,20 +225,23 @@ char * ismrmrd_read_header(const ISMRMRD_Dataset *dset) {
dataset = H5Dopen(dset->fileid, path, H5P_DEFAULT);
/* Get the datatype */
datatype = H5Dget_type(dataset);
- printf("datatype: %d\n.", datatype);
/* Read it into a 1D buffer*/
void *buff[1];
status = H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, buff);
/* Unpack */
xmlstring = (char *) malloc(strlen(buff[0])+1);
- memcpy(xmlstring, buff[0], strlen(buff[0])+1);
-
- /* Clean up */
- status = H5Pclose(props);
- status = H5Tclose(datatype);
- status = H5Sclose(dataspace);
- status = H5Dclose(dataset);
+ if (xmlstring == NULL) {
+ ISMRMRD_THROW(ISMRMRD_MEMORYERROR, "Failed to malloc xmlstring");
+ } else {
+ memcpy(xmlstring, buff[0], strlen(buff[0])+1);
+
+ /* Clean up */
+ status = H5Pclose(props);
+ status = H5Tclose(datatype);
+ status = H5Sclose(dataspace);
+ status = H5Dclose(dataset);
+ }
free(path);
return xmlstring;
@@ -259,6 +278,8 @@ unsigned long ismrmrd_get_number_of_acquisitions(const ISMRMRD_Dataset *dset) {
numacq = 0;
}
+ free(path);
+
return numacq;
};
@@ -281,6 +302,7 @@ int ismrmrd_append_acquisition(const ISMRMRD_Dataset *dset, const ISMRMRD_Acquis
/* create */
}
+ free(path);
return ISMRMRD_NOERROR;
};
diff --git a/ismrmrd_dataset.h b/ismrmrd_dataset.h
index ed810a7..2c56416 100644
--- a/ismrmrd_dataset.h
+++ b/ismrmrd_dataset.h
@@ -38,7 +38,7 @@ typedef struct ISMRMRD_Dataset {
* Initializes an ISMRMRD dataset structure
*
*/
-void ismrmrd_init_dataset(ISMRMRD_Dataset *dset, const char *filename, const char *groupname);
+int ismrmrd_init_dataset(ISMRMRD_Dataset *dset, const char *filename, const char *groupname);
/**
* Opens an ISMRMRD dataset.
diff --git a/tests/c/basic_test.c b/tests/c/basic_test.c
deleted file mode 100644
index f88739d..0000000
--- a/tests/c/basic_test.c
+++ /dev/null
@@ -1,81 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "ismrmrd.h"
-#include "ismrmrd_dataset.h"
-
-void myerror(const char *file, int line, const char *func, int err, char *msg) {
- char *msgtype = ismrmrd_strerror(err);
- fprintf(stderr, "Whoa! ERROR: %s in %s, line %d: %s\n", msgtype, file, line, msg);
- exit(-1);
-}
-
-int main(void)
-{
-
- int status;
- ISMRMRD_Dataset dataset, dataset2;
- const char *filename = "myfile.h5";
- const char *groupname = "/dataset";
- const char *xmlhdr = "This is some text for the header.";
-
- /* Set the error handler */
- ismrmrd_set_error_handler(myerror);
-
- if (0) {
- /* Create a data set */
- ismrmrd_init_dataset(&dataset, filename, groupname);
- status = ismrmrd_open_dataset(&dataset, true);
-
- //status = ismrmrd_write_header(&dataset, xmlhdr);
-
- /* Close the dataset */
- status = ismrmrd_close_dataset(&dataset);
- }
-
- /* Reopen the file as a different dataset */
- ismrmrd_init_dataset(&dataset2, filename, groupname);
- status = ismrmrd_open_dataset(&dataset2, false);
-
- /* Read the header */
- char *xmlstring = ismrmrd_read_header(&dataset2);
- printf("Header: %s\n", xmlstring);
-
- /* Get the number of acquisitions */
- printf("Number of Acquisitions: %lu\n", ismrmrd_get_number_of_acquisitions(&dataset2));
-
- /* Clean up */
- free(xmlstring);
-
- /* Close the dataset */
- status = ismrmrd_close_dataset(&dataset2);
-
- /* TODO */
- if (0) {
- ISMRMRD_Acquisition acq;
- ismrmrd_init_acquisition(&acq);
- acq.head.number_of_samples = 128;
- acq.head.active_channels = 4;
- ismrmrd_make_consistent_acquisition(&acq);
- printf("Acq Version: %d\n", acq.head.version);
-
- ismrmrd_set_flag(&(acq.head.flags), ISMRMRD_ACQ_FIRST_IN_SLICE);
- printf("Flags: %llu\n", acq.head.flags);
- printf("ACQ_FIRST_IN_SLICE: %d\n", ismrmrd_is_flag_set(acq.head.flags, ISMRMRD_ACQ_FIRST_IN_SLICE));
- ismrmrd_clear_flag(&(acq.head.flags), ISMRMRD_ACQ_FIRST_IN_SLICE);
- printf("Flags: %llu\n", acq.head.flags);
- printf("ACQ_FIRST_IN_SLICE: %d\n", ismrmrd_is_flag_set(acq.head.flags, ISMRMRD_ACQ_FIRST_IN_SLICE));
-
- // Image im;
- //initImage(&im);
- //printf("Image Version: %d\n", im.head.version);
-
- //NDArray arr;
- //initNDArray(&arr);
- //printf("Array ndim: %d\n", arr.ndim);
- //printf("Array dim[0]: %d\n", arr.dims[0]);
- }
-
- return 0;
-}
diff --git a/utilities/ismrmrd_phantom.h b/utilities/ismrmrd_phantom.h
index fc0b65b..72362aa 100644
--- a/utilities/ismrmrd_phantom.h
+++ b/utilities/ismrmrd_phantom.h
@@ -6,6 +6,7 @@
*/
#include <boost/shared_ptr.hpp>
+#include <vector>
#include <complex>
#include "ismrmrd.h"
#include "ismrmrd_utilities_export.h"
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git
More information about the debian-science-commits
mailing list