From 40e9aa9234fd6e2637257d91a55dd21a409b42f8 Mon Sep 17 00:00:00 2001 From: q-posev Date: Thu, 3 Jun 2021 16:13:11 +0200 Subject: [PATCH] introduce max_str_len parameter --- src/templates_front/templator_front.org | 66 +++++++++++++------- src/templates_hdf5/templator_hdf5.org | 82 +++++++++++++++++++------ 2 files changed, 107 insertions(+), 41 deletions(-) diff --git a/src/templates_front/templator_front.org b/src/templates_front/templator_front.org index f8d8067..fb7d7f1 100644 --- a/src/templates_front/templator_front.org +++ b/src/templates_front/templator_front.org @@ -142,6 +142,7 @@ typedef int32_t trexio_exit_code; | ~TREXIO_GROUP_WRITE_ERROR~ | 19 | 'Error writing group' | | ~TREXIO_ELEM_READ_ERROR~ | 20 | 'Error reading element' | | ~TREXIO_ELEM_WRITE_ERROR~ | 21 | 'Error writing element' | + | ~TREXIO_INVALID_STR_LEN~ | 30 | 'Invalid max_str_len' | # We need to force Emacs not to indent the Python code: # -*- org-src-preserve-indentation: t @@ -172,7 +173,7 @@ return '\n'.join(result) #+RESULTS: :results: - #+begin_src c :tangle prefix_front.h :exports none + #+begin_src c :tangle prefix_front.h #define TREXIO_FAILURE ((trexio_exit_code) -1) #define TREXIO_SUCCESS ((trexio_exit_code) 0) #define TREXIO_INVALID_ARG_1 ((trexio_exit_code) 1) @@ -196,9 +197,10 @@ return '\n'.join(result) #define TREXIO_GROUP_WRITE_ERROR ((trexio_exit_code) 19) #define TREXIO_ELEM_READ_ERROR ((trexio_exit_code) 20) #define TREXIO_ELEM_WRITE_ERROR ((trexio_exit_code) 21) + #define TREXIO_INVALID_STR_LEN ((trexio_exit_code) 30) #+end_src - #+begin_src f90 :tangle prefix_fortran.f90 :exports none + #+begin_src f90 :tangle prefix_fortran.f90 integer(trexio_exit_code), parameter :: TREXIO_FAILURE = -1 integer(trexio_exit_code), parameter :: TREXIO_SUCCESS = 0 integer(trexio_exit_code), parameter :: TREXIO_INVALID_ARG_1 = 1 @@ -222,6 +224,7 @@ return '\n'.join(result) integer(trexio_exit_code), parameter :: TREXIO_GROUP_WRITE_ERROR = 19 integer(trexio_exit_code), parameter :: TREXIO_ELEM_READ_ERROR = 20 integer(trexio_exit_code), parameter :: TREXIO_ELEM_WRITE_ERROR = 21 + integer(trexio_exit_code), parameter :: TREXIO_INVALID_STR_LEN = 30 #+end_src :end: @@ -1425,17 +1428,18 @@ end interface #+begin_src c :tangle hrw_dset_str_front.h :exports none trexio_exit_code trexio_has_$group_dset$(trexio_t* const file); -trexio_exit_code trexio_read_$group_dset$(trexio_t* const file, char* const dset); -trexio_exit_code trexio_write_$group_dset$(trexio_t* const file, const char* dset); +trexio_exit_code trexio_read_$group_dset$(trexio_t* const file, char* const dset, const uint32_t max_str_len); +trexio_exit_code trexio_write_$group_dset$(trexio_t* const file, const char* dset, const uint32_t max_str_len); #+end_src #+begin_src c :tangle read_dset_str_front.c trexio_exit_code -trexio_read_$group_dset$ (trexio_t* const file, char* const dset) +trexio_read_$group_dset$ (trexio_t* const file, char* const dset, const uint32_t max_str_len) { if (file == NULL) return TREXIO_INVALID_ARG_1; if (dset == NULL) return TREXIO_INVALID_ARG_2; + if (max_str_len <= 0) return TREXIO_INVALID_ARG_3; trexio_exit_code rc; int64_t $group_dset_dim$ = 0; @@ -1457,7 +1461,7 @@ trexio_read_$group_dset$ (trexio_t* const file, char* const dset) break; case TREXIO_HDF5: - rc = trexio_hdf5_read_$group_dset$(file, dset, rank, dims); + rc = trexio_hdf5_read_$group_dset$(file, dset, rank, dims, max_str_len); break; /* case TREXIO_JSON: @@ -1473,11 +1477,12 @@ trexio_read_$group_dset$ (trexio_t* const file, char* const dset) #+begin_src c :tangle write_dset_str_front.c trexio_exit_code -trexio_write_$group_dset$ (trexio_t* const file, const char* dset) +trexio_write_$group_dset$ (trexio_t* const file, const char* dset, const uint32_t max_str_len) { if (file == NULL) return TREXIO_INVALID_ARG_1; if (dset == NULL) return TREXIO_INVALID_ARG_2; + if (max_str_len <= 0) return TREXIO_INVALID_ARG_3; trexio_exit_code rc; int64_t $group_dset_dim$ = 0; @@ -1492,30 +1497,45 @@ trexio_write_$group_dset$ (trexio_t* const file, const char* dset) assert(file->back_end < TREXIO_INVALID_BACK_END); + char* tmp_str = CALLOC(dims[0]*(max_str_len+1), char); + if (tmp_str == NULL) return TREXIO_ALLOCATION_FAILED; char** dset_str = CALLOC(dims[0], char*); - char* tmp_str = CALLOC(dims[0]*32, char); + if (dset_str == NULL) return TREXIO_ALLOCATION_FAILED; char* pch; - pch = strtok( (char*) dset, TREXIO_DELIM); - size_t pch_len; - pch_len = strlen(pch); - dset_str[0]=tmp_str; - strncpy(tmp_str, pch, pch_len); - tmp_str += pch_len + 1; - for(size_t i=1; i max_str_len) { + FREE(dset_str[0]); + FREE(dset_str); + return TREXIO_INVALID_STR_LEN; + } + dset_str[i]=tmp_str; - strncpy(tmp_str, pch, pch_len); - tmp_str += pch_len + 1; + strncpy(tmp_str, pch, max_str_len); + tmp_str += max_str_len + 1; } switch (file->back_end) { case TREXIO_TEXT: - //return trexio_text_write_$group_dset$(file, dset, rank, dims); + //rc = trexio_text_write_$group_dset$(file, dset, rank, dims); break; case TREXIO_HDF5: @@ -1523,7 +1543,7 @@ trexio_write_$group_dset$ (trexio_t* const file, const char* dset) break; /* case TREXIO_JSON: - return trexio_json_write_$group_dset$(file, dset, rank, dims); + rc = trexio_json_write_$group_dset$(file, dset, rank, dims); break; ,*/ } @@ -1571,20 +1591,22 @@ trexio_has_$group_dset$ (trexio_t* const file) #+begin_src f90 :tangle write_dset_str_front_fortran.f90 interface - integer function trexio_write_$group_dset$ (trex_file, dset) bind(C) + integer function trexio_write_$group_dset$ (trex_file, dset, max_str_len) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file character, intent(in) :: dset(*) + integer(4), intent(in) :: max_str_len end function trexio_write_$group_dset$ end interface #+end_src #+begin_src f90 :tangle read_dset_str_front_fortran.f90 interface - integer function trexio_read_$group_dset$ (trex_file, dset) bind(C) + integer function trexio_read_$group_dset$ (trex_file, dset, max_str_len) bind(C) use, intrinsic :: iso_c_binding integer(8), intent(in), value :: trex_file character, intent(out) :: dset(*) + integer(4), intent(in) :: max_str_len end function trexio_read_$group_dset$ end interface #+end_src diff --git a/src/templates_hdf5/templator_hdf5.org b/src/templates_hdf5/templator_hdf5.org index 2b10b5e..542067a 100644 --- a/src/templates_hdf5/templator_hdf5.org +++ b/src/templates_hdf5/templator_hdf5.org @@ -319,17 +319,17 @@ trexio_hdf5_read_$group_dset$ (trexio_t* const file, $group_dset_dtype$* const $ H5Dclose(dset_id); if (status < 0) { - free(ddims); + FREE(ddims); return TREXIO_FAILURE; } for (uint32_t i=0; i$group$_group, @@ -413,13 +413,13 @@ trexio_hdf5_has_$group_dset$ (trexio_t* const file) #+begin_src c :tangle hrw_dset_str_hdf5.h :exports none trexio_exit_code trexio_hdf5_has_$group_dset$(trexio_t* const file); -trexio_exit_code trexio_hdf5_read_$group_dset$(trexio_t* const file, char* const $group_dset$, const uint32_t rank, const uint64_t* dims); +trexio_exit_code trexio_hdf5_read_$group_dset$(trexio_t* const file, char* const $group_dset$, const uint32_t rank, const uint64_t* dims, const uint32_t max_str_len); trexio_exit_code trexio_hdf5_write_$group_dset$(trexio_t* const file, const char** $group_dset$, const uint32_t rank, const uint64_t* dims); #+end_src #+begin_src c :tangle read_dset_str_hdf5.c trexio_exit_code -trexio_hdf5_read_$group_dset$ (trexio_t* const file, char* const $group_dset$, const uint32_t rank, const uint64_t* dims) +trexio_hdf5_read_$group_dset$ (trexio_t* const file, char* const $group_dset$, const uint32_t rank, const uint64_t* dims, const uint32_t max_str_len) { if (file == NULL) return TREXIO_INVALID_ARG_1; @@ -433,40 +433,78 @@ trexio_hdf5_read_$group_dset$ (trexio_t* const file, char* const $group_dset$, c hid_t dset_id = H5Dopen(f->$group$_group, $GROUP_DSET$_NAME, H5P_DEFAULT); if (dset_id <= 0) return TREXIO_INVALID_ID; - hid_t dspace = H5Dget_space(dset_id); - - int rrank; // allocate space for the dimensions to be read hsize_t* ddims = CALLOC( (int) rank, hsize_t); - if (ddims == NULL) return TREXIO_FAILURE; + if (ddims == NULL) { + H5Dclose(dset_id); + return TREXIO_ALLOCATION_FAILED; + } + + hid_t dspace = H5Dget_space(dset_id); + if (dset_id <= 0) { + FREE(ddims); + H5Dclose(dset_id); + return TREXIO_INVALID_ID; + } // get the rank of the dataset in a file - rrank = H5Sget_simple_extent_dims(dspace, ddims, NULL); + int rrank = H5Sget_simple_extent_dims(dspace, ddims, NULL); - if (rrank != (int) rank) return TREXIO_INVALID_ARG_3; + if (rrank != (int) rank) { + FREE(ddims); + H5Dclose(dset_id); + H5Sclose(dspace); + return TREXIO_INVALID_ARG_3; + } - for (int i=0; i max_str_len) { + FREE(rdata); + H5Dclose(dset_id); + H5Sclose(dspace); + H5Tclose(memtype); + return TREXIO_INVALID_STR_LEN; + } + strcat($group_dset$, rdata[i]); strcat($group_dset$, TREXIO_DELIM); } @@ -475,9 +513,15 @@ trexio_hdf5_read_$group_dset$ (trexio_t* const file, char* const $group_dset$, c //status = H5Treclaim (memtype, dspace, H5P_DEFAULT, rdata); // this function is deprecated but used in v.<1.12.0 status = H5Dvlen_reclaim (memtype, dspace, H5P_DEFAULT, rdata); - if (status < 0) return TREXIO_FAILURE; + if (status < 0) { + FREE(rdata); + H5Dclose(dset_id); + H5Sclose(dspace); + H5Tclose(memtype); + return TREXIO_FAILURE; + } - if (rdata != NULL) FREE(rdata); + FREE(rdata); H5Dclose(dset_id); H5Sclose(dspace); H5Tclose(memtype);