[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