mirror of
https://github.com/TREX-CoE/trexio.git
synced 2024-11-04 05:03:58 +01:00
add top-level read/write functions that accept arrays of strings directly
This commit is contained in:
parent
ae32a02652
commit
5553e9110e
@ -1520,13 +1520,15 @@ trexio_read_chunk_ao_2e_int_eri_value_64(trexio_t* const file,
|
|||||||
|
|
||||||
#+begin_src c :tangle hrw_dset_str_front.h :exports none
|
#+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_has_$group_dset$(trexio_t* const file);
|
||||||
trexio_exit_code trexio_read_$group_dset$(trexio_t* const file, char* dset, const uint32_t max_str_len);
|
trexio_exit_code trexio_read_$group_dset$_low(trexio_t* const file, char* 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);
|
trexio_exit_code trexio_write_$group_dset$_low(trexio_t* const file, const char* dset, const uint32_t max_str_len);
|
||||||
|
trexio_exit_code trexio_read_$group_dset$(trexio_t* const file, char** 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
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle read_dset_str_front.c
|
#+begin_src c :tangle read_dset_str_front.c
|
||||||
trexio_exit_code
|
trexio_exit_code
|
||||||
trexio_read_$group_dset$ (trexio_t* const file, char* dset, const uint32_t max_str_len)
|
trexio_read_$group_dset$_low (trexio_t* const file, char* dset, const uint32_t max_str_len)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
@ -1545,7 +1547,6 @@ trexio_read_$group_dset$ (trexio_t* const file, char* dset, const uint32_t max_s
|
|||||||
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
uint64_t dims[$group_dset_rank$] = {$group_dset_dim_list$};
|
||||||
|
|
||||||
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
||||||
|
|
||||||
switch (file->back_end) {
|
switch (file->back_end) {
|
||||||
|
|
||||||
case TREXIO_TEXT:
|
case TREXIO_TEXT:
|
||||||
@ -1562,12 +1563,57 @@ trexio_read_$group_dset$ (trexio_t* const file, char* dset, const uint32_t max_s
|
|||||||
,*/
|
,*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
trexio_exit_code
|
||||||
|
trexio_read_$group_dset$ (trexio_t* const file, 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;
|
||||||
|
|
||||||
|
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
||||||
|
|
||||||
|
trexio_exit_code rc;
|
||||||
|
int64_t dset_dim = 0;
|
||||||
|
|
||||||
|
/* Error handling for this call is added by the generator */
|
||||||
|
rc = trexio_read_$group_dset_dim$_64(file, &(dset_dim));
|
||||||
|
|
||||||
|
if (dset_dim == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
|
char* str_compiled = CALLOC(dset_dim*max_str_len + 1, char);
|
||||||
|
if (str_compiled == NULL) return TREXIO_ALLOCATION_FAILED;
|
||||||
|
|
||||||
|
rc = trexio_read_$group_dset$_low(file, str_compiled, max_str_len);
|
||||||
|
if (rc != TREXIO_SUCCESS) {
|
||||||
|
FREE(str_compiled);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * pch;
|
||||||
|
for (uint64_t i=0; i < dset_dim; i++) {
|
||||||
|
|
||||||
|
pch = i == 0 ? strtok(str_compiled, TREXIO_DELIM) : strtok(NULL, TREXIO_DELIM) ;
|
||||||
|
if (pch == NULL) {
|
||||||
|
FREE(str_compiled);
|
||||||
|
return TREXIO_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(dset[i], pch, max_str_len+1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
FREE(str_compiled);
|
||||||
|
return TREXIO_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
#+begin_src c :tangle write_dset_str_front.c
|
#+begin_src c :tangle write_dset_str_front.c
|
||||||
trexio_exit_code
|
trexio_exit_code
|
||||||
trexio_write_$group_dset$ (trexio_t* const file, const char* dset, const uint32_t max_str_len)
|
trexio_write_$group_dset$_low (trexio_t* const file, const char* dset, const uint32_t max_str_len)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
if (file == NULL) return TREXIO_INVALID_ARG_1;
|
||||||
@ -1641,6 +1687,42 @@ trexio_write_$group_dset$ (trexio_t* const file, const char* dset, const uint32_
|
|||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
trexio_exit_code
|
||||||
|
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;
|
||||||
|
if (trexio_has_$group_dset$(file) == TREXIO_SUCCESS) return TREXIO_DSET_ALREADY_EXISTS;
|
||||||
|
|
||||||
|
assert(file->back_end < TREXIO_INVALID_BACK_END);
|
||||||
|
|
||||||
|
trexio_exit_code rc;
|
||||||
|
int64_t dset_dim = 0;
|
||||||
|
|
||||||
|
/* Error handling for this call is added by the generator */
|
||||||
|
rc = trexio_read_$group_dset_dim$_64(file, &(dset_dim));
|
||||||
|
|
||||||
|
if (dset_dim == 0L) return TREXIO_INVALID_NUM;
|
||||||
|
|
||||||
|
char* str_compiled = CALLOC(dset_dim*max_str_len + 1, char);
|
||||||
|
if (str_compiled == NULL) return TREXIO_ALLOCATION_FAILED;
|
||||||
|
|
||||||
|
strcpy(str_compiled, "");
|
||||||
|
for (uint64_t i=0; i < dset_dim; i++) {
|
||||||
|
strcat(str_compiled, dset[i]);
|
||||||
|
strcat(str_compiled, TREXIO_DELIM);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = trexio_write_$group_dset$_low(file, str_compiled, max_str_len);
|
||||||
|
|
||||||
|
FREE(str_compiled);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@ -1679,7 +1761,7 @@ trexio_has_$group_dset$ (trexio_t* const file)
|
|||||||
|
|
||||||
#+begin_src f90 :tangle write_dset_str_front_fortran.f90
|
#+begin_src f90 :tangle write_dset_str_front_fortran.f90
|
||||||
interface
|
interface
|
||||||
integer function trexio_write_$group_dset$ (trex_file, dset, max_str_len) bind(C)
|
integer function trexio_write_$group_dset$ (trex_file, dset, max_str_len) bind(C, name="trexio_write_$group_dset$_low")
|
||||||
use, intrinsic :: iso_c_binding
|
use, intrinsic :: iso_c_binding
|
||||||
integer(8), intent(in), value :: trex_file
|
integer(8), intent(in), value :: trex_file
|
||||||
character, intent(in) :: dset(*)
|
character, intent(in) :: dset(*)
|
||||||
@ -1690,7 +1772,7 @@ end interface
|
|||||||
|
|
||||||
#+begin_src f90 :tangle read_dset_str_front_fortran.f90
|
#+begin_src f90 :tangle read_dset_str_front_fortran.f90
|
||||||
interface
|
interface
|
||||||
integer function trexio_read_$group_dset$ (trex_file, dset, max_str_len) bind(C)
|
integer function trexio_read_$group_dset$ (trex_file, dset, max_str_len) bind(C, name="trexio_read_$group_dset$_low")
|
||||||
use, intrinsic :: iso_c_binding
|
use, intrinsic :: iso_c_binding
|
||||||
integer(8), intent(in), value :: trex_file
|
integer(8), intent(in), value :: trex_file
|
||||||
character, intent(out) :: dset(*)
|
character, intent(out) :: dset(*)
|
||||||
|
35
tests/test.c
35
tests/test.c
@ -16,14 +16,14 @@ int main() {
|
|||||||
assert (rc == 0);
|
assert (rc == 0);
|
||||||
test_write("test_write.h5", TREXIO_HDF5);
|
test_write("test_write.h5", TREXIO_HDF5);
|
||||||
test_read ("test_write.h5", TREXIO_HDF5);
|
test_read ("test_write.h5", TREXIO_HDF5);
|
||||||
rc = system("rm -rf test_write.h5");
|
// rc = system("rm -rf test_write.h5");
|
||||||
assert (rc == 0);
|
assert (rc == 0);
|
||||||
|
|
||||||
rc = system("rm -rf test_write.dir");
|
rc = system("rm -rf test_write.dir");
|
||||||
assert (rc == 0);
|
assert (rc == 0);
|
||||||
test_write("test_write.dir", TREXIO_TEXT);
|
test_write("test_write.dir", TREXIO_TEXT);
|
||||||
test_read ("test_write.dir", TREXIO_TEXT);
|
test_read ("test_write.dir", TREXIO_TEXT);
|
||||||
rc = system("rm -rf test_write.dir");
|
// rc = system("rm -rf test_write.dir");
|
||||||
assert (rc == 0);
|
assert (rc == 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -69,11 +69,11 @@ int test_write(const char* file_name, const back_end_t backend) {
|
|||||||
"H" };
|
"H" };
|
||||||
|
|
||||||
//char labelxxx[] = "C C C Na C C H H H Ru H H";
|
//char labelxxx[] = "C C C Na C C H H H Ru H H";
|
||||||
char labelxxx[128] = "";
|
/*char labelxxx[128] = "";
|
||||||
for (int i=0; i<num; i++){
|
for (int i=0; i<num; i++){
|
||||||
strcat(labelxxx,label[i]);
|
strcat(labelxxx,label[i]);
|
||||||
strcat(labelxxx,TREXIO_DELIM);
|
strcat(labelxxx,TREXIO_DELIM);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
const char* sym = "B3U and some stuff";
|
const char* sym = "B3U and some stuff";
|
||||||
/*================= START OF TEST ==================*/
|
/*================= START OF TEST ==================*/
|
||||||
@ -93,7 +93,8 @@ int test_write(const char* file_name, const back_end_t backend) {
|
|||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
rc = trexio_write_nucleus_coord(file,coord);
|
rc = trexio_write_nucleus_coord(file,coord);
|
||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
rc = trexio_write_nucleus_label(file,labelxxx, 32);
|
//rc = trexio_write_nucleus_label(file,labelxxx, 32);
|
||||||
|
rc = trexio_write_nucleus_label(file, label, 32);
|
||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
rc = trexio_write_nucleus_point_group(file, sym, 32);
|
rc = trexio_write_nucleus_point_group(file, sym, 32);
|
||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
@ -180,17 +181,27 @@ int test_read(const char* file_name, const back_end_t backend) {
|
|||||||
assert( x*x < 1.e-14);
|
assert( x*x < 1.e-14);
|
||||||
|
|
||||||
// read nucleus_label
|
// read nucleus_label
|
||||||
labelxxx = (char*) malloc(num*32*sizeof(char));
|
/*labelxxx = (char*) malloc(num*32*sizeof(char));
|
||||||
rc = trexio_read_nucleus_label(file,labelxxx, 2);
|
rc = trexio_read_nucleus_label(file,labelxxx, 2);*/
|
||||||
|
label = (char**) malloc(num*sizeof(char*));
|
||||||
|
for (int i=0; i<num; i++){
|
||||||
|
label[i] = (char*) malloc(32*sizeof(char));
|
||||||
|
}
|
||||||
|
rc = trexio_read_nucleus_label(file, label, 2);
|
||||||
//printf("%s\n", trexio_string_of_error(rc));
|
//printf("%s\n", trexio_string_of_error(rc));
|
||||||
//printf("%s\n", labelxxx);
|
//printf("%s\n", labelxxx);
|
||||||
|
for (int i=0; i<num; i++){
|
||||||
|
printf("%s\n", label[i]);
|
||||||
|
}
|
||||||
assert (rc == TREXIO_SUCCESS);
|
assert (rc == TREXIO_SUCCESS);
|
||||||
|
assert( strcmp(label[0], "C") == 0 );
|
||||||
|
assert( strcmp(label[1], "Na") == 0 );
|
||||||
|
|
||||||
char * pch;
|
char * pch;
|
||||||
pch = strtok(labelxxx, TREXIO_DELIM);
|
/*pch = strtok(labelxxx, TREXIO_DELIM);
|
||||||
assert( strcmp(pch, "C") == 0 );
|
assert( strcmp(pch, "C") == 0 );
|
||||||
pch = strtok(NULL, TREXIO_DELIM);
|
pch = strtok(NULL, TREXIO_DELIM);
|
||||||
assert( strcmp(pch, "Na") == 0 );
|
assert( strcmp(pch, "Na") == 0 );*/
|
||||||
|
|
||||||
point_group = (char*) malloc(32*sizeof(char));
|
point_group = (char*) malloc(32*sizeof(char));
|
||||||
|
|
||||||
@ -206,7 +217,11 @@ int test_read(const char* file_name, const back_end_t backend) {
|
|||||||
|
|
||||||
free(point_group);
|
free(point_group);
|
||||||
|
|
||||||
free(labelxxx);
|
for (int i=0; i<num; i++){
|
||||||
|
free(label[i]);
|
||||||
|
}
|
||||||
|
free(label);
|
||||||
|
//free(labelxxx);
|
||||||
|
|
||||||
// close current session
|
// close current session
|
||||||
rc = trexio_close(file);
|
rc = trexio_close(file);
|
||||||
|
Loading…
Reference in New Issue
Block a user