mirror of
https://github.com/TREX-CoE/trexio.git
synced 2024-11-03 20:54:07 +01:00
introduce max_str_len parameter
This commit is contained in:
parent
313ab12c61
commit
40e9aa9234
@ -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<dims[0]; i++){
|
||||
pch = strtok(NULL, TREXIO_DELIM);
|
||||
/* parse the string using strtok */
|
||||
for(uint64_t i=0; i<dims[0]; i++) {
|
||||
|
||||
if(i==0) {
|
||||
pch = strtok( (char*) dset, TREXIO_DELIM);
|
||||
} else {
|
||||
pch = strtok(NULL, TREXIO_DELIM);
|
||||
}
|
||||
|
||||
if (pch == NULL) {
|
||||
FREE(dset_str[0]);
|
||||
FREE(dset_str);
|
||||
return TREXIO_FAILURE;
|
||||
}
|
||||
|
||||
pch_len = strlen(pch);
|
||||
|
||||
if (pch_len > 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
|
||||
|
@ -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<rank; ++i){
|
||||
if (ddims[i] != dims[i]) {
|
||||
free(ddims);
|
||||
FREE(ddims);
|
||||
return TREXIO_INVALID_ARG_4;
|
||||
}
|
||||
}
|
||||
free(ddims);
|
||||
FREE(ddims);
|
||||
|
||||
/* High-level H5LT API. No need to deal with dataspaces and datatypes */
|
||||
status = H5LTread_dataset(f->$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<rrank; i++){
|
||||
for (int i=0; i<rrank; i++) {
|
||||
if (ddims[i] != dims[i]) {
|
||||
free(ddims);
|
||||
H5Dclose(dset_id);
|
||||
H5Sclose(dspace);
|
||||
FREE(ddims);
|
||||
return TREXIO_INVALID_ARG_4;
|
||||
}
|
||||
}
|
||||
free(ddims);
|
||||
FREE(ddims);
|
||||
|
||||
hid_t memtype = H5Tcopy (H5T_C_S1);
|
||||
status = H5Tset_size(memtype, H5T_VARIABLE);
|
||||
if (status < 0) return TREXIO_FAILURE;
|
||||
if (status < 0 || memtype <= 0) {
|
||||
H5Dclose(dset_id);
|
||||
H5Sclose(dspace);
|
||||
return TREXIO_FAILURE;
|
||||
}
|
||||
|
||||
char** rdata = CALLOC(dims[0], char*);
|
||||
if (rdata == NULL) return TREXIO_ALLOCATION_FAILED;
|
||||
if (rdata == NULL) {
|
||||
H5Dclose(dset_id);
|
||||
H5Sclose(dspace);
|
||||
H5Tclose(memtype);
|
||||
return TREXIO_ALLOCATION_FAILED;
|
||||
}
|
||||
|
||||
status = H5Dread(dset_id, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata);
|
||||
if (status < 0) return TREXIO_FAILURE;
|
||||
if (status < 0) {
|
||||
FREE(rdata);
|
||||
H5Dclose(dset_id);
|
||||
H5Sclose(dspace);
|
||||
H5Tclose(memtype);
|
||||
return TREXIO_FAILURE;
|
||||
}
|
||||
|
||||
// copy contents of temporary rdata buffer into the group_dset otherwise they are lost
|
||||
// after calling H5Treclaim or H5Dvlen_reclaim functions
|
||||
strcpy($group_dset$, "");
|
||||
for (uint64_t i=0; i<dims[0]; i++){
|
||||
|
||||
if (strlen(rdata[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);
|
||||
|
Loading…
Reference in New Issue
Block a user