diff options
author | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2008-11-24 21:17:07 (GMT) |
---|---|---|
committer | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2008-11-24 21:17:07 (GMT) |
commit | 4c1f5f3f154ea8bf92285e38346abe86ff2ec16d (patch) | |
tree | 68dee6d0cfeb7c3aafbfa3d16d37d25f49cb1c08 /hl/test | |
parent | e69e5ee5a0caa23c4289a38a54c36f4a6ab15396 (diff) | |
download | hdf5-4c1f5f3f154ea8bf92285e38346abe86ff2ec16d.zip hdf5-4c1f5f3f154ea8bf92285e38346abe86ff2ec16d.tar.gz hdf5-4c1f5f3f154ea8bf92285e38346abe86ff2ec16d.tar.bz2 |
[svn-r16128] revised test table
tested windows linux
Diffstat (limited to 'hl/test')
-rw-r--r-- | hl/test/test_table.c | 2962 |
1 files changed, 1486 insertions, 1476 deletions
diff --git a/hl/test/test_table.c b/hl/test/test_table.c index 1b36b15..85fc70d 100644 --- a/hl/test/test_table.c +++ b/hl/test/test_table.c @@ -60,11 +60,11 @@ */ typedef struct particle_t { - char name[16]; - long longi; - float pressure; - double temperature; - int lati; + char name[16]; + long longi; + float pressure; + double temperature; + int lati; } particle_t; /*------------------------------------------------------------------------- @@ -81,1387 +81,1470 @@ static int compare_deleted(hsize_t rrecords, hsize_t dstart, hsize_t drecords, * a subset of particle_t, with latitude and longitude fields *------------------------------------------------------------------------- */ - typedef struct position_t - { - long longi; - int lati; - } position_t; +typedef struct position_t +{ + long longi; + int lati; +} position_t; /*------------------------------------------------------------------------- * a subset of particle_t, with name and pressure fields *------------------------------------------------------------------------- */ - typedef struct namepressure_t - { - char name[16]; - float pressure; - } namepressure_t; +typedef struct namepressure_t +{ + char name[16]; + float pressure; +} namepressure_t; /*------------------------------------------------------------------------- * an extended particle, used in the insert field test *------------------------------------------------------------------------- */ - typedef struct particle2_t - { - char name[16]; - long longi; - float pressure; - double temperature; - int lati; - int new_field; - } particle2_t; +typedef struct particle2_t +{ + char name[16]; + long longi; + float pressure; + double temperature; + int lati; + int new_field; +} particle2_t; /*------------------------------------------------------------------------- * a particle with one field less, used in the delete field test *------------------------------------------------------------------------- */ - typedef struct particle3_t - { - char name[16]; - long longi; - double temperature; - int lati; - } particle3_t; - - -/*------------------------------------------------------------------------- - * the test program - *------------------------------------------------------------------------- - */ - -int test_table(hid_t fid, int write) +typedef struct particle3_t { - /* identifiers */ - hid_t fid1; - hid_t fid2; - hsize_t chunk_size=10; - int compress=0; - int *fill=NULL; - particle_t fill1[1] = { {"no data",-1, -99.0f, -99.0, -1} }; - int fill1_new[1] = { -100 }; - hsize_t position; - char tname[20]; + char name[16]; + long longi; + double temperature; + int lati; +} particle3_t; - /* indices */ - int i, j; - /* write, read, append, delete, insert some records and fields */ - hsize_t FIELDS = NFIELDS; - hsize_t RECORDS = NRECORDS; - hsize_t start; - hsize_t wstart; - hsize_t rstart; - hsize_t istart; - hsize_t dstart; - hsize_t nrecords; - hsize_t rrecords; - hsize_t wrecords; - hsize_t arecords; - hsize_t irecords; - hsize_t drecords; - hsize_t nfields; - hsize_t rfields; - hsize_t start1; /* record to start reading from 1st table */ - hsize_t start2; /* record to start writing in 2nd table */ /*------------------------------------------------------------------------- - * read, write, insert, append buffers - *------------------------------------------------------------------------- - */ - particle_t rbuf[NRECORDS+4]; - particle2_t rbuf2[NRECORDS]; - particle3_t rbuf3[NRECORDS]; - particle_t rbufc[NRECORDS*2]; - particle_t abuf[2]={{"eight",80,8.0f,80.0,80},{"nine",90,9.0f,90.0,90}}; - particle_t ibuf[2]={{"zero", 0, 0.0f, 0.0, 0},{"zero", 0, 0.0f, 0.0, 0}}; - particle_t wbufd[NRECORDS]; - particle_t wbuf[NRECORDS] = { - {"zero", 0, 0.0f, 0.0, 0,}, - {"one", 10, 1.0f, 10.0, 10}, - {"two", 20, 2.0f, 20.0, 20}, - {"three",30, 3.0f, 30.0, 30}, - {"four", 40, 4.0f, 40.0, 40}, - {"five", 50, 5.0f, 50.0, 50}, - {"six", 60, 6.0f, 60.0, 60}, - {"seven",70, 7.0f, 70.0, 70} - }; - /* buffers for the field "Pressure" and "New_field" */ - float pressure_in [NRECORDS] = { 0.0f,1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f }; - float pressure_out [NRECORDS]; - int buf_new[NRECORDS] = { 0,1,2,3,4,5,6,7 }; - /* buffers for the fields "Latitude,Longitude" */ - position_t position_out[NRECORDS_ADD]; - position_t position_in[NRECORDS_ADD] = { {0,0}, - {10,10}, - {20,20}}; - /* buffers for the fields "Name,Pressure" */ - namepressure_t namepre_out[NRECORDS]; - namepressure_t namepre_in[NRECORDS] = - { {"zero",0.0f}, - {"one", 1.0f}, - {"two", 2.0f}, - {"three", 3.0f}, - {"four", 4.0f}, - {"five", 5.0f}, - {"six", 6.0f}, - {"seven", 7.0f}, - }; - - -/*------------------------------------------------------------------------- - * initialize table parameters - * field offsets and sizes used in the fields functions - *------------------------------------------------------------------------- - */ - - size_t field_offset_pos[2]= - { - HOFFSET( position_t, longi ), - HOFFSET( position_t, lati ) - }; - size_t field_offset_namepre[2]= - { - HOFFSET( namepressure_t, name ), - HOFFSET( namepressure_t, pressure ) - }; - size_t field_sizes_pos[2]= - { - sizeof(position_in[0].longi), - sizeof(position_in[0].lati) - }; - size_t field_sizes_namepre[2]= - { - sizeof(namepre_in[0].name), - sizeof(namepre_in[0].pressure) - }; - size_t field_sizes_pre[1]= - { - sizeof(namepre_in[0].pressure) - }; - -/*------------------------------------------------------------------------- - * query table test + * function to open an HDF5 file and return its file identifier *------------------------------------------------------------------------- */ - char **names_out; - size_t sizes_out[NFIELDS]; - size_t offset_out[NFIELDS]; - size_t size_out; +static hid_t h5file_open(const char *fname, unsigned flags) +{ + + hid_t fid; /* identifier for the file */ + char *srcdir = getenv("srcdir"); /* the source directory */ + char data_file[512]=""; /* buffer to hold name of existing file */ + + /* compose the name of the file to open, using the srcdir, if appropriate */ + if (srcdir) + { + strcpy(data_file,srcdir); + strcat(data_file,"/"); + } + strcat(data_file,fname); + + /* open */ + if ((fid = H5Fopen(data_file,flags,H5P_DEFAULT))<0) + { + fprintf(stderr,"Error: Cannot open file <%s>\n",data_file ); + exit(1); + } + + return fid; +} /*------------------------------------------------------------------------- - * initialize table parameters - * field indexes (zero based) used in the fields functions - * "Name 0","Longitude 1","Pressure 2","Temperature 3","Latitude 4" + * function that compares one particle *------------------------------------------------------------------------- */ - int field_index_pre[1] = { 2 }; - int field_index_pos[2] = { 1,4 }; - int field_index_namepre[2] = { 0,2 }; - int field_index[NFIELDS] = { 0,1,2,3,4 }; +static int cmp_par(hsize_t i, hsize_t j, particle_t *rbuf, particle_t *wbuf ) +{ + if ( ( strcmp( rbuf[i].name, wbuf[j].name ) != 0 ) || + rbuf[i].lati != wbuf[j].lati || + rbuf[i].longi != wbuf[j].longi || + rbuf[i].pressure != wbuf[j].pressure || + rbuf[i].temperature != wbuf[j].temperature ) + { + fprintf(stderr,"read and write buffers have differences\n"); + fprintf(stderr,"%s %ld %f %f %d\n", + rbuf[i].name,rbuf[i].longi,rbuf[i].pressure,rbuf[i].temperature,rbuf[i].lati); + fprintf(stderr,"%s %ld %f %f %d\n", + wbuf[j].name,wbuf[j].longi,wbuf[j].pressure,wbuf[j].temperature,wbuf[j].lati); + return -1; + } + return 0; +} /*------------------------------------------------------------------------- - * initialize table parameters - * size and the offsets of struct members in memory - * define the inserted field HDF5 type and buffers - * these are used for the insert field test - *------------------------------------------------------------------------- - */ - hid_t field_type_new = H5T_NATIVE_INT; - size_t dst_size2 = sizeof( particle2_t ); - size_t dst_offset2[NFIELDS+1] = { HOFFSET( particle2_t, name ), - HOFFSET( particle2_t, longi ), - HOFFSET( particle2_t, pressure ), - HOFFSET( particle2_t, temperature ), - HOFFSET( particle2_t, lati ), - HOFFSET( particle2_t, new_field )}; - size_t dst_sizes2[NFIELDS+1] = { sizeof( rbuf2[0].name), - sizeof( rbuf2[0].longi), - sizeof( rbuf2[0].pressure), - sizeof( rbuf2[0].temperature), - sizeof( rbuf2[0].lati), - sizeof( rbuf2[0].new_field)}; -/*------------------------------------------------------------------------- - * initialize table parameters - * size and the offsets of struct members in memory - * these are used for the delete field test + * function to compare deleted records *------------------------------------------------------------------------- */ - size_t dst_size3 = sizeof( particle3_t ); - size_t dst_offset3[NFIELDS-1] = { HOFFSET( particle3_t, name ), - HOFFSET( particle3_t, longi ), - HOFFSET( particle3_t, temperature ), - HOFFSET( particle3_t, lati )}; - - size_t dst_sizes3[NFIELDS-1] = { sizeof( rbuf3[0].name), - sizeof( rbuf3[0].longi), - sizeof( rbuf3[0].temperature), - sizeof( rbuf3[0].lati)}; - +static int compare_deleted(hsize_t rrecords, hsize_t dstart, hsize_t drecords, + particle_t *rbuf, particle_t *wbuf) +{ + hsize_t i,j; + for( i=0; i<rrecords; i++) + { + if (i<dstart) + { + if (cmp_par(i,i,rbuf,wbuf)<0) + return -1; + } + else + { + j=i+drecords; + if (cmp_par(i,j,rbuf,wbuf)<0) + return -1; + } + } + return 0; +} -/*------------------------------------------------------------------------- - * initialize table parameters - * 1) size and the offsets of struct members in memory - * 2) field names - * 3) define a HDF5 type for the fields - *------------------------------------------------------------------------- - */ - size_t type_size_mem = sizeof( particle_t ); - size_t field_offset[NFIELDS]= - { - HOFFSET( particle_t, name ), - HOFFSET( particle_t, longi ), - HOFFSET( particle_t, pressure ), - HOFFSET( particle_t, temperature ), - HOFFSET( particle_t, lati ) - }; - size_t field_size[NFIELDS] = - { - sizeof( rbuf[0].name), - sizeof( rbuf[0].longi), - sizeof( rbuf[0].pressure), - sizeof( rbuf[0].temperature), - sizeof( rbuf[0].lati) - }; - const char *field_names[NFIELDS] = - { "Name","Longitude","Pressure","Temperature","Latitude" }; - hid_t field_type[NFIELDS]; - hid_t string_type = H5Tcopy( H5T_C_S1 ); - H5Tset_size( string_type, 16 ); - field_type[0] = string_type; - field_type[1] = H5T_NATIVE_LONG; - field_type[2] = H5T_NATIVE_FLOAT; - field_type[3] = H5T_NATIVE_DOUBLE; - field_type[4] = H5T_NATIVE_INT; /*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBmake_table - * H5TBread_table - * + * the test program *------------------------------------------------------------------------- */ - if (write) - { - TESTING2("making table"); - if (H5TBmake_table(TITLE,fid,"table1",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbuf)<0) +int test_table(hid_t fid, int write) +{ + hid_t fid1; + hid_t fid2; + hsize_t chunk_size=10; + int compress=0; + int *fill=NULL; + particle_t fill1[1] = { {"no data",-1, -99.0f, -99.0, -1} }; + int fill1_new[1] = { -100 }; + hsize_t position; + char tname[20]; + int i, j; + /* write, read, append, delete, insert some records and fields */ + hsize_t FIELDS = NFIELDS; + hsize_t RECORDS = NRECORDS; + hsize_t start; + hsize_t wstart; + hsize_t rstart; + hsize_t istart; + hsize_t dstart; + hsize_t nrecords; + hsize_t rrecords; + hsize_t wrecords; + hsize_t arecords; + hsize_t irecords; + hsize_t drecords; + hsize_t nfields; + hsize_t rfields; + hsize_t start1; /* record to start reading from 1st table */ + hsize_t start2; /* record to start writing in 2nd table */ + /* read, write, insert, append buffers */ + particle_t rbuf[NRECORDS+4]; + particle2_t rbuf2[NRECORDS]; + particle3_t rbuf3[NRECORDS]; + particle_t rbufc[NRECORDS*2]; + particle_t abuf[2]={{"eight",80,8.0f,80.0,80},{"nine",90,9.0f,90.0,90}}; + particle_t ibuf[2]={{"zero", 0, 0.0f, 0.0, 0},{"zero", 0, 0.0f, 0.0, 0}}; + particle_t wbufd[NRECORDS]; + particle_t wbuf[NRECORDS] = { + {"zero", 0, 0.0f, 0.0, 0,}, + {"one", 10, 1.0f, 10.0, 10}, + {"two", 20, 2.0f, 20.0, 20}, + {"three",30, 3.0f, 30.0, 30}, + {"four", 40, 4.0f, 40.0, 40}, + {"five", 50, 5.0f, 50.0, 50}, + {"six", 60, 6.0f, 60.0, 60}, + {"seven",70, 7.0f, 70.0, 70} + }; + /* buffers for the field "Pressure" and "New_field" */ + float pressure_in [NRECORDS] = { 0.0f,1.0f,2.0f,3.0f,4.0f,5.0f,6.0f,7.0f }; + float pressure_out [NRECORDS]; + int buf_new[NRECORDS] = { 0,1,2,3,4,5,6,7 }; + /* buffers for the fields "Latitude,Longitude" */ + position_t position_out[NRECORDS_ADD]; + position_t position_in[NRECORDS_ADD] = { {0,0}, + {10,10}, + {20,20}}; + /* buffers for the fields "Name,Pressure" */ + namepressure_t namepre_out[NRECORDS]; + namepressure_t namepre_in[NRECORDS] = + { {"zero",0.0f}, + {"one", 1.0f}, + {"two", 2.0f}, + {"three", 3.0f}, + {"four", 4.0f}, + {"five", 5.0f}, + {"six", 6.0f}, + {"seven", 7.0f}, + }; + + + /*------------------------------------------------------------------------- + * initialize table parameters + * field offsets and sizes used in the fields functions + *------------------------------------------------------------------------- + */ + + size_t field_offset_pos[2]= + { + HOFFSET( position_t, longi ), + HOFFSET( position_t, lati ) + }; + size_t field_offset_namepre[2]= + { + HOFFSET( namepressure_t, name ), + HOFFSET( namepressure_t, pressure ) + }; + size_t field_sizes_pos[2]= + { + sizeof(position_in[0].longi), + sizeof(position_in[0].lati) + }; + size_t field_sizes_namepre[2]= + { + sizeof(namepre_in[0].name), + sizeof(namepre_in[0].pressure) + }; + size_t field_sizes_pre[1]= + { + sizeof(namepre_in[0].pressure) + }; + + /*------------------------------------------------------------------------- + * query table test + *------------------------------------------------------------------------- + */ + char **names_out; + size_t sizes_out[NFIELDS]; + size_t offset_out[NFIELDS]; + size_t size_out; + + /*------------------------------------------------------------------------- + * initialize table parameters + * field indexes (zero based) used in the fields functions + * "Name 0","Longitude 1","Pressure 2","Temperature 3","Latitude 4" + *------------------------------------------------------------------------- + */ + int field_index_pre[1] = { 2 }; + int field_index_pos[2] = { 1,4 }; + int field_index_namepre[2] = { 0,2 }; + int field_index[NFIELDS] = { 0,1,2,3,4 }; + + /*------------------------------------------------------------------------- + * initialize table parameters + * size and the offsets of struct members in memory + * define the inserted field HDF5 type and buffers + * these are used for the insert field test + *------------------------------------------------------------------------- + */ + hid_t field_type_new = H5T_NATIVE_INT; + size_t dst_size2 = sizeof( particle2_t ); + size_t dst_offset2[NFIELDS+1] = { HOFFSET( particle2_t, name ), + HOFFSET( particle2_t, longi ), + HOFFSET( particle2_t, pressure ), + HOFFSET( particle2_t, temperature ), + HOFFSET( particle2_t, lati ), + HOFFSET( particle2_t, new_field )}; + size_t dst_sizes2[NFIELDS+1] = { sizeof( rbuf2[0].name), + sizeof( rbuf2[0].longi), + sizeof( rbuf2[0].pressure), + sizeof( rbuf2[0].temperature), + sizeof( rbuf2[0].lati), + sizeof( rbuf2[0].new_field)}; + /*------------------------------------------------------------------------- + * initialize table parameters + * size and the offsets of struct members in memory + * these are used for the delete field test + *------------------------------------------------------------------------- + */ + size_t dst_size3 = sizeof( particle3_t ); + size_t dst_offset3[NFIELDS-1] = { HOFFSET( particle3_t, name ), + HOFFSET( particle3_t, longi ), + HOFFSET( particle3_t, temperature ), + HOFFSET( particle3_t, lati )}; + + size_t dst_sizes3[NFIELDS-1] = { sizeof( rbuf3[0].name), + sizeof( rbuf3[0].longi), + sizeof( rbuf3[0].temperature), + sizeof( rbuf3[0].lati)}; + + + /*------------------------------------------------------------------------- + * initialize table parameters + * 1) size and the offsets of struct members in memory + * 2) field names + * 3) define a HDF5 type for the fields + *------------------------------------------------------------------------- + */ + + size_t type_size_mem = sizeof( particle_t ); + size_t field_offset[NFIELDS]= + { + HOFFSET( particle_t, name ), + HOFFSET( particle_t, longi ), + HOFFSET( particle_t, pressure ), + HOFFSET( particle_t, temperature ), + HOFFSET( particle_t, lati ) + }; + size_t field_size[NFIELDS] = + { + sizeof( rbuf[0].name), + sizeof( rbuf[0].longi), + sizeof( rbuf[0].pressure), + sizeof( rbuf[0].temperature), + sizeof( rbuf[0].lati) + }; + const char *field_names[NFIELDS] = + { "Name","Longitude","Pressure","Temperature","Latitude" }; + hid_t field_type[NFIELDS]; + hid_t string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_LONG; + field_type[2] = H5T_NATIVE_FLOAT; + field_type[3] = H5T_NATIVE_DOUBLE; + field_type[4] = H5T_NATIVE_INT; + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBmake_table + * H5TBread_table + * + *------------------------------------------------------------------------- + */ + if (write) + { + TESTING2("making table"); + + if (H5TBmake_table(TITLE,fid,"table1",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbuf)<0) + goto out; + PASSED(); + } + + TESTING2("reading table"); + + /*------------------------------------------------------------------------- + * read the table + *------------------------------------------------------------------------- + */ + + if (H5TBread_table(fid,"table1",type_size_mem,field_offset,field_size,rbuf)<0) + goto out; + + /* compare the extracted table with the original array */ + for( i = 0; i < NRECORDS; i++ ) + { + if (cmp_par(i,i,rbuf,wbuf)<0) + goto out; + } + + PASSED(); + + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBwrite_records + * + *------------------------------------------------------------------------- + */ + if (write) + { + TESTING2("writing records"); + + /* create an empty table */ + if (H5TBmake_table(TITLE,fid,"table2",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,0)<0) + goto out; + + /*------------------------------------------------------------------------- + * write records, start at 0, write 8 + * pos = 0 1 2 3 4 5 6 7 + * data= 0 1 2 3 4 5 6 7 + *------------------------------------------------------------------------- + */ + wstart=0; + wrecords=8; + if (H5TBwrite_records(fid,"table2",wstart,wrecords,type_size_mem,field_offset, + field_size,wbuf)<0) + goto out; + + /* read it back */ + if (H5TBread_table(fid,"table2",type_size_mem,field_offset,field_size,rbuf)<0) + goto out; + + /* compare */ + for( i = 0; i < NRECORDS; i++ ) + { + if (cmp_par(i,i,rbuf,wbuf)<0) + goto out; + } + + PASSED(); + } + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBread_records + * + *------------------------------------------------------------------------- + */ + + TESTING2("reading records"); + + /*------------------------------------------------------------------------- + * read records, start at 0, read 8 + * pos = 0 1 2 3 4 5 6 7 + * data= 0 1 2 3 4 5 6 7 + *------------------------------------------------------------------------- + */ + + /*------------------------------------------------------------------------- + * for the read test we cannot use "table2" because it has been appended + * we use the original "table1" instead + *------------------------------------------------------------------------- + */ + if(write) + strcpy(tname,"table2"); + else + strcpy(tname,"table1"); + + rstart=0; + rrecords=8; + if (H5TBread_records(fid,tname,rstart,rrecords,type_size_mem,field_offset, + field_size,rbuf)<0) + goto out; + + /* compare */ + for( i=(int)rstart; i<(int)rrecords; i++) + { + if (cmp_par(i,i,rbuf,wbuf)<0) + goto out; + } + PASSED(); + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBappend_records + * H5TBread_records + * + *------------------------------------------------------------------------- + */ + if (write) + { + TESTING2("appending records"); + + /*------------------------------------------------------------------------- + * append 2 records + * pos = 0 1 2 3 4 5 6 7 8 9 + * data= 0 1 2 3 4 5 6 7 8 9 + *------------------------------------------------------------------------- + */ + arecords=2; + if (H5TBappend_records(fid,"table2",arecords,type_size_mem,field_offset,field_size,abuf)<0) + return 1; + + if (H5TBget_table_info(fid,"table2",&rfields,&rrecords)<0) + return 1; + + rstart=0; rrecords=NRECORDS+arecords; + if (H5TBread_records(fid,"table2",rstart,rrecords,type_size_mem,field_offset, + field_size,rbuf)<0) + return 1; + + /* compare */ + wrecords=8; + for( i=(int)rstart; i<(int)wrecords; i++) + { + if (cmp_par(i,i,rbuf,wbuf)<0) + goto out; + } + for( i=(int)wrecords, j=0; i<(int)rrecords; i++,j++) + { + if (cmp_par(i,j,rbuf,abuf)<0) + goto out; + } + PASSED(); + } + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBinsert_record + * H5TBread_records + * + *------------------------------------------------------------------------- + */ + if (write) + { + TESTING2("inserting records"); + + /*------------------------------------------------------------------------- + * insert 2 records + * pos = 0 1 2 3 4 5 6 7 8 9 10 11 + * data= 0 0 0 1 2 3 4 5 6 7 8 9 + *------------------------------------------------------------------------- + */ + istart=1; irecords=2; + if (H5TBinsert_record(fid,"table2",istart,irecords,type_size_mem,field_offset,field_size,ibuf)<0) + return 1; + + if (H5TBget_table_info(fid,"table2",&rfields,&rrecords)<0) + return 1; + + if (H5TBread_records(fid,"table2",rstart,rrecords,type_size_mem,field_offset, + field_size,rbuf)<0) + return 1; + + /* compare */ + for( i=0; i<12; i++) + { + if (i<istart) + { + if (cmp_par(i,i,rbuf,wbuf)<0) goto out; - PASSED(); - } - - TESTING2("reading table"); - -/*------------------------------------------------------------------------- - * read the table - *------------------------------------------------------------------------- - */ - - if (H5TBread_table(fid,"table1",type_size_mem,field_offset,field_size,rbuf)<0) - goto out; - - /* compare the extracted table with the original array */ - for( i = 0; i < NRECORDS; i++ ) - { - if (cmp_par(i,i,rbuf,wbuf)<0) - goto out; - } - - PASSED(); - - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBwrite_records - * - *------------------------------------------------------------------------- - */ - if (write) - { - TESTING2("writing records"); - - /* create an empty table */ - if (H5TBmake_table(TITLE,fid,"table2",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,0)<0) + } + else if (i>=(int)istart && i<(int)istart+(int)irecords) + { + j=i-(int)istart; + if (cmp_par(i,j,rbuf,ibuf)<0) goto out; - -/*------------------------------------------------------------------------- - * write records, start at 0, write 8 - * pos = 0 1 2 3 4 5 6 7 - * data= 0 1 2 3 4 5 6 7 - *------------------------------------------------------------------------- - */ - wstart=0; wrecords=8; - if (H5TBwrite_records(fid,"table2",wstart,wrecords,type_size_mem,field_offset, - field_size,wbuf)<0) - goto out; - - /* read it back */ - if (H5TBread_table(fid,"table2",type_size_mem,field_offset,field_size,rbuf)<0) - goto out; - - /* compare */ - for( i = 0; i < NRECORDS; i++ ) - { - if (cmp_par(i,i,rbuf,wbuf)<0) - goto out; - } - - PASSED(); - } - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBread_records - * - *------------------------------------------------------------------------- - */ - - TESTING2("reading records"); - -/*------------------------------------------------------------------------- - * read records, start at 0, read 8 - * pos = 0 1 2 3 4 5 6 7 - * data= 0 1 2 3 4 5 6 7 - *------------------------------------------------------------------------- - */ - -/*------------------------------------------------------------------------- - * for the read test we cannot use "table2" because it has been appended - * we use the original "table1" instead - *------------------------------------------------------------------------- - */ - if(write) - strcpy(tname,"table2"); - else - strcpy(tname,"table1"); - - rstart=0; rrecords=8; - if (H5TBread_records(fid,tname,rstart,rrecords,type_size_mem,field_offset, - field_size,rbuf)<0) - goto out; - - /* compare */ - for( i=(int)rstart; i<(int)rrecords; i++) - { - if (cmp_par(i,i,rbuf,wbuf)<0) - goto out; - } - PASSED(); - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBappend_records - * H5TBread_records - * - *------------------------------------------------------------------------- - */ - if (write) - { - TESTING2("appending records"); - -/*------------------------------------------------------------------------- - * append 2 records - * pos = 0 1 2 3 4 5 6 7 8 9 - * data= 0 1 2 3 4 5 6 7 8 9 - *------------------------------------------------------------------------- - */ - arecords=2; - if (H5TBappend_records(fid,"table2",arecords,type_size_mem,field_offset,field_size,abuf)<0) - return 1; - - if (H5TBget_table_info(fid,"table2",&rfields,&rrecords)<0) - return 1; - - rstart=0; rrecords=NRECORDS+arecords; - if (H5TBread_records(fid,"table2",rstart,rrecords,type_size_mem,field_offset, - field_size,rbuf)<0) - return 1; - - /* compare */ - wrecords=8; - for( i=(int)rstart; i<(int)wrecords; i++) - { - if (cmp_par(i,i,rbuf,wbuf)<0) - goto out; - } - for( i=(int)wrecords, j=0; i<(int)rrecords; i++,j++) - { - if (cmp_par(i,j,rbuf,abuf)<0) - goto out; - } - PASSED(); - } - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBinsert_record - * H5TBread_records - * - *------------------------------------------------------------------------- - */ - if (write) - { - TESTING2("inserting records"); - -/*------------------------------------------------------------------------- - * insert 2 records - * pos = 0 1 2 3 4 5 6 7 8 9 10 11 - * data= 0 0 0 1 2 3 4 5 6 7 8 9 - *------------------------------------------------------------------------- - */ - istart=1; irecords=2; - if (H5TBinsert_record(fid,"table2",istart,irecords,type_size_mem,field_offset,field_size,ibuf)<0) - return 1; - - if (H5TBget_table_info(fid,"table2",&rfields,&rrecords)<0) - return 1; - - if (H5TBread_records(fid,"table2",rstart,rrecords,type_size_mem,field_offset, - field_size,rbuf)<0) - return 1; - - /* compare */ - for( i=0; i<12; i++) - { - if (i<istart) - { - if (cmp_par(i,i,rbuf,wbuf)<0) - goto out; - } - else if (i>=(int)istart && i<(int)istart+(int)irecords) - { - j=i-(int)istart; - if (cmp_par(i,j,rbuf,ibuf)<0) - goto out; - } - else if (i>=(int)istart+(int)irecords && i<10) - { - j=i-(int)irecords; - if (cmp_par(i,j,rbuf,wbuf)<0) - goto out; - } - else - { - j=i-10; - if (cmp_par(i,j,rbuf,abuf)<0) - goto out; - } - } - PASSED(); - } - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBdelete_record - * H5TBread_records - * - *------------------------------------------------------------------------- - */ - if (write) - { - TESTING2("deleting records"); - -/*------------------------------------------------------------------------- - * Create a table - * pos = 0 1 2 3 4 5 6 7 - * data= 0 1 2 3 4 5 6 7 - *------------------------------------------------------------------------- - */ - - for( i=0; i<NRECORDS; i++) - { - wbufd[i].lati = wbuf[i].lati; - wbufd[i].longi = wbuf[i].longi; - wbufd[i].pressure = wbuf[i].pressure; - wbufd[i].temperature = wbuf[i].temperature; - strcpy(wbufd[i].name, wbuf[i].name ); - - } - - - if (H5TBmake_table(TITLE,fid,"table3",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbufd)<0) + } + else if (i>=(int)istart+(int)irecords && i<10) + { + j=i-(int)irecords; + if (cmp_par(i,j,rbuf,wbuf)<0) goto out; - -/*------------------------------------------------------------------------- - * Delete records, start at 2, delete 3 - * pos = 0 1 2 3 4 - * data= 0 1 5 6 7 - *------------------------------------------------------------------------- - */ - dstart=2; drecords=3; - if (H5TBdelete_record(fid,"table3",dstart,drecords)<0) - goto out; - - if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0) - goto out; - - rstart=0; - if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset, - field_size,rbuf)<0) - goto out; - - /* Compare */ - nrecords=NRECORDS; - assert(rrecords == nrecords-drecords); - if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0) - goto out; - -/*------------------------------------------------------------------------- - * reset compare buffer - *------------------------------------------------------------------------- - */ - nrecords=rrecords; - for( i=0; i<nrecords; i++) - wbufd[i] = rbuf[i]; - -/*------------------------------------------------------------------------- - * Delete records, start at 0, delete 2 - * pos = 0 1 2 - * data= 5 6 7 - *------------------------------------------------------------------------- - */ - dstart=0; drecords=2; - if (H5TBdelete_record(fid,"table3",dstart,drecords)<0) - goto out; - - if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0) - goto out; - - rstart=0; - if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset, - field_size,rbuf)<0) - goto out; - - /* Compare */ - assert(rrecords == nrecords-drecords); - if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0) - goto out; - -/*------------------------------------------------------------------------- - * reset compare buffer - *------------------------------------------------------------------------- - */ - nrecords=rrecords; - for( i=0; i<nrecords; i++) - wbufd[i] = rbuf[i]; - -/*------------------------------------------------------------------------- - * Delete records, start at 1, delete 1 - * pos = 0 1 - * data= 5 7 - *------------------------------------------------------------------------- - */ - dstart=1; drecords=1; - if (H5TBdelete_record(fid,"table3",dstart,drecords)<0) - goto out; - - if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0) - goto out; - - rstart=0; - if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset, - field_size,rbuf)<0) - goto out; - - /* Compare */ - assert(rrecords == nrecords-drecords); - if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0) - goto out; - -/*------------------------------------------------------------------------- - * reset compare buffer - *------------------------------------------------------------------------- - */ - nrecords=rrecords; - for( i=0; i<nrecords; i++) - wbufd[i] = rbuf[i]; - -/*------------------------------------------------------------------------- - * Delete records, start at 0, delete 1 - * pos = 0 - * data= 7 - *------------------------------------------------------------------------- - */ - dstart=0; drecords=1; - if (H5TBdelete_record(fid,"table3",dstart,drecords)<0) - goto out; - - if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0) - goto out; - - rstart=0; - if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset, - field_size,rbuf)<0) - goto out; - - /* Compare */ - assert(rrecords == nrecords-drecords); - if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0) - goto out; - -/*------------------------------------------------------------------------- - * reset compare buffer - *------------------------------------------------------------------------- - */ - nrecords=rrecords; - for( i=0; i<nrecords; i++) - wbufd[i] = rbuf[i]; - - /* Read complete table */ - if (H5TBread_table(fid,"table3",type_size_mem,field_offset,field_size,rbuf)<0) - goto out; - - /* Compare */ - for( i=0; i<rrecords; i++) - { - if (cmp_par(i,i,rbuf,wbufd)<0) - goto out; - } - - PASSED(); - } - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBadd_records_from - * H5TBread_records - * - *------------------------------------------------------------------------- - */ - - if (write) - { - TESTING2("adding records"); - - /* create 2 tables */ - if (H5TBmake_table(TITLE,fid,"table4",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbuf)<0) + } + else + { + j=i-10; + if (cmp_par(i,j,rbuf,abuf)<0) goto out; - if (H5TBmake_table(TITLE,fid,"table5",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbuf)<0) + } + } + PASSED(); + } + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBdelete_record + * H5TBread_records + * + *------------------------------------------------------------------------- + */ + if (write) + { + TESTING2("deleting records"); + + /*------------------------------------------------------------------------- + * Create a table + * pos = 0 1 2 3 4 5 6 7 + * data= 0 1 2 3 4 5 6 7 + *------------------------------------------------------------------------- + */ + + for( i=0; i<NRECORDS; i++) + { + wbufd[i].lati = wbuf[i].lati; + wbufd[i].longi = wbuf[i].longi; + wbufd[i].pressure = wbuf[i].pressure; + wbufd[i].temperature = wbuf[i].temperature; + strcpy(wbufd[i].name, wbuf[i].name ); + + } + + + if (H5TBmake_table(TITLE,fid,"table3",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbufd)<0) + goto out; + + /*------------------------------------------------------------------------- + * Delete records, start at 2, delete 3 + * pos = 0 1 2 3 4 + * data= 0 1 5 6 7 + *------------------------------------------------------------------------- + */ + dstart=2; drecords=3; + if (H5TBdelete_record(fid,"table3",dstart,drecords)<0) + goto out; + + if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0) + goto out; + + rstart=0; + if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset, + field_size,rbuf)<0) + goto out; + + /* compare */ + nrecords=NRECORDS; + assert(rrecords == nrecords-drecords); + if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0) + goto out; + + /*------------------------------------------------------------------------- + * reset compare buffer + *------------------------------------------------------------------------- + */ + nrecords=rrecords; + for( i=0; i<nrecords; i++) + { + wbufd[i] = rbuf[i]; + } + + /*------------------------------------------------------------------------- + * Delete records, start at 0, delete 2 + * pos = 0 1 2 + * data= 5 6 7 + *------------------------------------------------------------------------- + */ + dstart=0; drecords=2; + if (H5TBdelete_record(fid,"table3",dstart,drecords)<0) + goto out; + + if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0) + goto out; + + rstart=0; + if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset, + field_size,rbuf)<0) + goto out; + + /* Compare */ + assert(rrecords == nrecords-drecords); + if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0) + goto out; + + /*------------------------------------------------------------------------- + * reset compare buffer + *------------------------------------------------------------------------- + */ + nrecords=rrecords; + for( i=0; i<nrecords; i++) + { + wbufd[i] = rbuf[i]; + } + + /*------------------------------------------------------------------------- + * Delete records, start at 1, delete 1 + * pos = 0 1 + * data= 5 7 + *------------------------------------------------------------------------- + */ + dstart=1; drecords=1; + if (H5TBdelete_record(fid,"table3",dstart,drecords)<0) + goto out; + + if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0) + goto out; + + rstart=0; + if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset, + field_size,rbuf)<0) + goto out; + + /* Compare */ + assert(rrecords == nrecords-drecords); + if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0) + goto out; + + /*------------------------------------------------------------------------- + * reset compare buffer + *------------------------------------------------------------------------- + */ + nrecords=rrecords; + for( i=0; i<nrecords; i++) + { + wbufd[i] = rbuf[i]; + } + + /*------------------------------------------------------------------------- + * Delete records, start at 0, delete 1 + * pos = 0 + * data= 7 + *------------------------------------------------------------------------- + */ + dstart=0; drecords=1; + if (H5TBdelete_record(fid,"table3",dstart,drecords)<0) + goto out; + + if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0) + goto out; + + rstart=0; + if (H5TBread_records(fid,"table3",rstart,rrecords,type_size_mem,field_offset, + field_size,rbuf)<0) + goto out; + + /* Compare */ + assert(rrecords == nrecords-drecords); + if (compare_deleted(rrecords,dstart,drecords,rbuf,wbufd)<0) + goto out; + + /*------------------------------------------------------------------------- + * reset compare buffer + *------------------------------------------------------------------------- + */ + nrecords=rrecords; + for( i=0; i<nrecords; i++) + { + wbufd[i] = rbuf[i]; + } + + /* Read complete table */ + if (H5TBread_table(fid,"table3",type_size_mem,field_offset,field_size,rbuf)<0) + goto out; + + /* Compare */ + for( i=0; i<rrecords; i++) + { + if (cmp_par(i,i,rbuf,wbufd)<0) + { + goto out; + } + } + + PASSED(); + } + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBadd_records_from + * H5TBread_records + * + *------------------------------------------------------------------------- + */ + + if (write) + { + TESTING2("adding records"); + + /* create 2 tables */ + if (H5TBmake_table(TITLE,fid,"table4",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbuf)<0) + goto out; + if (H5TBmake_table(TITLE,fid,"table5",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbuf)<0) + goto out; + + /* add the records from "table4" to "table5" */ + start1 = 3; + nrecords = 2; + start2 = 6; + if ( H5TBadd_records_from(fid,"table4",start1,nrecords,"table5",start2)<0) + goto out; + + /* read final table */ + if (H5TBread_table(fid,"table5",type_size_mem,field_offset,field_size,rbuf)<0) + goto out; + + /* compare */ + for( i = 0; i < NRECORDS+2; i++ ) + { + if ( i < start2 ) + { + if (cmp_par(i,i,rbuf,wbuf)<0) goto out; - - /* add the records from "table4" to "table5" */ - start1 = 3; - nrecords = 2; - start2 = 6; - if ( H5TBadd_records_from(fid,"table4",start1,nrecords,"table5",start2)<0) - goto out; - - /* read final table */ - if (H5TBread_table(fid,"table5",type_size_mem,field_offset,field_size,rbuf)<0) - goto out; - - /* compare */ - for( i = 0; i < NRECORDS+2; i++ ) - { - if ( i < start2 ) - { - if (cmp_par(i,i,rbuf,wbuf)<0) - goto out; - } - else if ( i < (int)start2+(int)nrecords ) - { - j = i-(int)start1; - if (cmp_par(i,j,rbuf,wbuf)<0) - goto out; - } - else - { - j = i-(int)nrecords; - if (cmp_par(i,j,rbuf,wbuf)<0) - goto out; - } - } - - PASSED(); - } - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBcombine_tables - * H5TBread_table - * - *------------------------------------------------------------------------- - */ - - if (write) - { - TESTING2("combining tables"); - - /* create 2 tables */ - if (H5TBmake_table(TITLE,fid,"table6",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbuf)<0) + } + else if ( i < (int)start2+(int)nrecords ) + { + j = i-(int)start1; + if (cmp_par(i,j,rbuf,wbuf)<0) goto out; - if (H5TBmake_table(TITLE,fid,"table7",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbuf)<0) + } + else + { + j = i-(int)nrecords; + if (cmp_par(i,j,rbuf,wbuf)<0) goto out; - - /* combine the two tables into a third */ - if ( H5TBcombine_tables(fid,"table6",fid,"table7","table8")<0) - goto out; - - /* read merged table */ - if (H5TBread_table(fid,"table8",type_size_mem,field_offset,field_size,rbufc)<0) - goto out; - - /* compare */ - for( i = 0; i < NRECORDS*2; i++ ) - { - if ( i < NRECORDS ) - { - if (cmp_par(i,i,rbufc,wbuf)<0) - goto out; - } - else - { - if (cmp_par(i,i-NRECORDS,rbufc,wbuf)<0) - goto out; - } - } - -/*------------------------------------------------------------------------- - * multi file test - *------------------------------------------------------------------------- - */ - - /* create 2 files using default properties. */ - fid1 = H5Fcreate("combine_tables1.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); - fid2 = H5Fcreate("combine_tables2.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); - - /* create 2 tables, one in each file */ - if (H5TBmake_table(TITLE,fid1,"table1",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbuf)<0) + } + } + + PASSED(); + } + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBcombine_tables + * H5TBread_table + * + *------------------------------------------------------------------------- + */ + + if (write) + { + TESTING2("combining tables"); + + /* create 2 tables */ + if (H5TBmake_table(TITLE,fid,"table6",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbuf)<0) + goto out; + if (H5TBmake_table(TITLE,fid,"table7",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbuf)<0) + goto out; + + /* combine the two tables into a third */ + if ( H5TBcombine_tables(fid,"table6",fid,"table7","table8")<0) + goto out; + + /* read merged table */ + if (H5TBread_table(fid,"table8",type_size_mem,field_offset,field_size,rbufc)<0) + goto out; + + /* compare */ + for( i = 0; i < NRECORDS*2; i++ ) + { + if ( i < NRECORDS ) + { + if (cmp_par(i,i,rbufc,wbuf)<0) goto out; - if (H5TBmake_table(TITLE,fid2,"table2",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbuf)<0) + } + else + { + if (cmp_par(i,i-NRECORDS,rbufc,wbuf)<0) goto out; - - /* combine the two tables into a third */ - if ( H5TBcombine_tables(fid1,"table1",fid2,"table2","table3")<0) - goto out; - - /* read merged table */ - if (H5TBread_table(fid1,"table3",type_size_mem,field_offset,field_size,rbufc)<0) - goto out; - - /* compare */ - for( i = 0; i < NRECORDS*2; i++ ) - { - if ( i < NRECORDS ) - { - if (cmp_par(i,i,rbufc,wbuf)<0) - goto out; - } - else - { - if (cmp_par(i,i-NRECORDS,rbufc,wbuf)<0) - goto out; - } - } - - /* close files */ - H5Fclose(fid1); - H5Fclose(fid2); - - PASSED(); - } - - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBwrite_fields_name - * - *------------------------------------------------------------------------- - */ - if (write) - { - TESTING2("writing fields by name"); - - /* make an empty table with fill values */ - if (H5TBmake_table(TITLE,fid,"table9",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill1,compress,0)<0) + } + } + + /*------------------------------------------------------------------------- + * multi file test + *------------------------------------------------------------------------- + */ + + /* create 2 files using default properties. */ + fid1 = H5Fcreate("combine_tables1.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); + fid2 = H5Fcreate("combine_tables2.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); + + /* create 2 tables, one in each file */ + if (H5TBmake_table(TITLE,fid1,"table1",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbuf)<0) + goto out; + if (H5TBmake_table(TITLE,fid2,"table2",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbuf)<0) + goto out; + + /* combine the two tables into a third */ + if ( H5TBcombine_tables(fid1,"table1",fid2,"table2","table3")<0) + goto out; + + /* read merged table */ + if (H5TBread_table(fid1,"table3",type_size_mem,field_offset,field_size,rbufc)<0) + goto out; + + /* compare */ + for( i = 0; i < NRECORDS*2; i++ ) + { + if ( i < NRECORDS ) + { + if (cmp_par(i,i,rbufc,wbuf)<0) goto out; - - /* write the pressure field starting at record 2 */ - start = 2; - nrecords = NRECORDS_ADD; - if (H5TBwrite_fields_name(fid,"table9","Pressure",start,nrecords,sizeof(float), - 0,field_sizes_pre,pressure_in)<0) - goto out; - - /* write the new longitude and latitude information starting at record 2 */ - start = 2; - nrecords = 3; - if (H5TBwrite_fields_name(fid,"table9","Latitude,Longitude",start,nrecords,sizeof(position_t), - field_offset_pos,field_sizes_pos,position_in)<0) - goto out; - - /* read back the all table */ - start = 0; - nrecords = NRECORDS; - if (H5TBread_table(fid,"table9",type_size_mem,field_offset,field_size,rbuf)<0) - goto out; - - { - - - /* compare the read values with the initial values */ - for( i = 0; i < NRECORDS; i++ ) - { - if ( i >= 2 && i <= 4 ) + } + else + { + if (cmp_par(i,i-NRECORDS,rbufc,wbuf)<0) + goto out; + } + } + + /* close files */ + H5Fclose(fid1); + H5Fclose(fid2); + + PASSED(); + } + + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBwrite_fields_name + * + *------------------------------------------------------------------------- + */ + if (write) + { + TESTING2("writing fields by name"); + + /* make an empty table with fill values */ + if (H5TBmake_table(TITLE,fid,"table9",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill1,compress,0)<0) + goto out; + + /* write the pressure field starting at record 2 */ + start = 2; + nrecords = NRECORDS_ADD; + if (H5TBwrite_fields_name(fid,"table9","Pressure",start,nrecords,sizeof(float), + 0,field_sizes_pre,pressure_in)<0) + goto out; + + /* write the new longitude and latitude information starting at record 2 */ + start = 2; + nrecords = 3; + if (H5TBwrite_fields_name(fid,"table9","Latitude,Longitude",start,nrecords,sizeof(position_t), + field_offset_pos,field_sizes_pos,position_in)<0) + goto out; + + /* read back the all table */ + start = 0; + nrecords = NRECORDS; + if (H5TBread_table(fid,"table9",type_size_mem,field_offset,field_size,rbuf)<0) + goto out; + + { + + + /* compare the read values with the initial values */ + for( i = 0; i < NRECORDS; i++ ) + { + if ( i >= 2 && i <= 4 ) + { + if ( rbuf[i].lati != position_in[i-NRECORDS_ADD+1].lati || + rbuf[i].longi != position_in[i-NRECORDS_ADD+1].longi || + rbuf[i].pressure != pressure_in[i-NRECORDS_ADD+1] ) + { + fprintf(stderr,"%ld %f %d\n", + rbuf[i].longi,rbuf[i].pressure,rbuf[i].lati); + fprintf(stderr,"%ld %f %d\n", + position_in[i].longi,pressure_in[i],position_in[i].lati); + goto out; + } + } + } + } + + + + PASSED(); + } /*write*/ + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBread_fields_name + * + *------------------------------------------------------------------------- + */ + TESTING2("reading fields by name"); + + /*------------------------------------------------------------------------- + * write and read the "Pressure" field + *------------------------------------------------------------------------- + */ + if (write) { - if ( rbuf[i].lati != position_in[i-NRECORDS_ADD+1].lati || - rbuf[i].longi != position_in[i-NRECORDS_ADD+1].longi || - rbuf[i].pressure != pressure_in[i-NRECORDS_ADD+1] ) - { - fprintf(stderr,"%ld %f %d\n", - rbuf[i].longi,rbuf[i].pressure,rbuf[i].lati); - fprintf(stderr,"%ld %f %d\n", - position_in[i].longi,pressure_in[i],position_in[i].lati); - goto out; - } + if (H5TBmake_table(TITLE,fid,"table10",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill1,compress,0)<0) + goto out; + + /* write the pressure field to all the records */ + start = 0; + nrecords = NRECORDS; + if ( H5TBwrite_fields_name(fid,"table10","Pressure",start,nrecords, + sizeof( float ),0,field_sizes_pre,pressure_in)<0) + goto out; } - } - } - - - - PASSED(); - } /*write*/ - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBread_fields_name - * - *------------------------------------------------------------------------- - */ - TESTING2("reading fields by name"); - -/*------------------------------------------------------------------------- - * write and read the "Pressure" field - *------------------------------------------------------------------------- - */ - if (write) - { - if (H5TBmake_table(TITLE,fid,"table10",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill1,compress,0)<0) - goto out; - - /* write the pressure field to all the records */ - start = 0; - nrecords = NRECORDS; - if ( H5TBwrite_fields_name(fid,"table10","Pressure",start,nrecords, - sizeof( float ),0,field_sizes_pre,pressure_in)<0) - goto out; - } - - /* read the "Pressure" field */ - start = 0; - nrecords = NRECORDS; - if ( H5TBread_fields_name(fid,"table10","Pressure",start,nrecords, - sizeof(float),0,field_sizes_pre,pressure_out)<0) - goto out; - - - /* Compare the extracted table with the initial values */ - for( i = 0; i < NRECORDS; i++ ) - { - if ( pressure_out[i] != pressure_in[i] ) { - goto out; - } - } - -/*------------------------------------------------------------------------- - * Write and read the "Latitude,Longitude" fields - *------------------------------------------------------------------------- - */ - if (write) - { - /* Write the new longitude and latitude information to all the records */ - start = 0; - nrecords = NRECORDS_ADD; - if ( H5TBwrite_fields_name(fid,"table10", "Latitude,Longitude", start, nrecords, - sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 ) - goto out; - }/*write*/ - - /* Read the "Latitude,Longitude" fields */ - start = 0; - nrecords = NRECORDS_ADD; - if ( H5TBread_fields_name( fid, "table10", "Latitude,Longitude", - start, nrecords, sizeof(position_t), field_offset_pos, field_sizes_pos, position_out ) < 0 ) - goto out; - - - /* Compare the extracted table with the initial values */ - for( i = 0; i < NRECORDS_ADD; i++ ) - { - if ( position_out[i].lati != position_in[i].lati || - position_out[i].longi != position_in[i].longi ) - goto out; - } - - -/*------------------------------------------------------------------------- - * Write and read the "Name,Pressure" fields - *------------------------------------------------------------------------- - */ - if (write) - { - /* Write the new name and pressure information to all the records */ - start = 0; - nrecords = NRECORDS; - if ( H5TBwrite_fields_name( fid, "table10", "Name,Pressure", start, nrecords, - sizeof( namepressure_t ), field_offset_namepre, field_sizes_namepre, namepre_in ) < 0 ) - goto out; - }/*write*/ - - /* Read the "Name,Pressure" fields */ - start = 0; - nrecords = NRECORDS; - if ( H5TBread_fields_name( fid, "table10", "Name,Pressure", - start, nrecords, sizeof(namepressure_t), field_offset_namepre, field_sizes_namepre, - namepre_out ) < 0 ) - goto out; - - - /* Compare the extracted table with the initial values */ - for( i = 0; i < NRECORDS; i++ ) - { - if ( ( strcmp( namepre_out[i].name, namepre_in[i].name ) != 0 ) || - namepre_out[i].pressure != namepre_in[i].pressure ) { - goto out; - } - } - - /* reset buffer */ - for( i = 0; i < NRECORDS; i++ ) - { - strcpy( namepre_out[i].name, "\0" ); - namepre_out[i].pressure = -1; - } - -/*------------------------------------------------------------------------- - * read only 3 records of the "Name,Pressure" fields, starting at record 2 - *------------------------------------------------------------------------- - */ - start = 2; - nrecords = 3; - if ( H5TBread_fields_name( fid, "table10", "Name,Pressure", - start, nrecords, sizeof(namepressure_t), field_offset_namepre, - field_sizes_namepre, namepre_out ) < 0 ) - goto out; - - - /* Compare the extracted table with the initial values */ - for( i = 0; i < 3; i++ ) - { - int iistart = (int) start; - if ( ( strcmp( namepre_out[i].name, namepre_in[iistart+i].name ) != 0 ) || - namepre_out[i].pressure != namepre_in[iistart+i].pressure ) { - goto out; - } - } - - - - PASSED(); - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBwrite_fields_index - * - *------------------------------------------------------------------------- - */ - if (write) - { - TESTING2("writing fields by index"); - - /* make an empty table */ - if (H5TBmake_table(TITLE,fid,"table11",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,NULL)<0) - goto out; - - /* write the pressure field starting at record 2 */ - nfields = 1; - start = 2; - nrecords = NRECORDS_ADD; - if ( H5TBwrite_fields_index(fid, "table11", nfields, field_index_pre, start, nrecords, - sizeof( float ), 0, field_sizes_pre, pressure_in ) < 0 ) - goto out; - - - /* write the new longitude and latitude information starting at record 2 */ - nfields = 2; - start = 2; - nrecords = NRECORDS_ADD; - if ( H5TBwrite_fields_index(fid, "table11", nfields, field_index_pos, start, nrecords, - sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 ) - goto out; - - /* read back the all table */ - nfields = 5; - start = 0; - nrecords = NRECORDS; - if ( H5TBread_fields_index(fid, "table11", nfields, field_index, - start, nrecords, type_size_mem, field_offset, field_size, rbuf ) < 0 ) - goto out; - - /* Compare the extracted table with the initial values */ - for( i = 0; i < NRECORDS; i++ ) - { - if ( i >= 2 && i <= 4 ) - { - if ( rbuf[i].lati != position_in[i-NRECORDS_ADD+1].lati || - rbuf[i].longi != position_in[i-NRECORDS_ADD+1].longi || - rbuf[i].pressure != pressure_in[i-NRECORDS_ADD+1] ) - goto out; - } - } - - PASSED(); - } - - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBread_fields_index - * - *------------------------------------------------------------------------- - */ - - TESTING2("reading fields by index"); - - if (write) - { - /* make an empty table */ - if (H5TBmake_table(TITLE,fid,"table12",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,NULL)<0) - goto out; - -/*------------------------------------------------------------------------- - * write and read the "Pressure" field - *------------------------------------------------------------------------- - */ - - /* write the pressure field to all the records */ - nfields = 1; - start = 0; - nrecords = NRECORDS; - if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_pre, start, nrecords, - sizeof( float ), 0, field_sizes_pre, pressure_in ) < 0 ) - goto out; - } - - /* read the "Pressure" field */ - nfields = 1; - start = 0; - nrecords = NRECORDS; - if ( H5TBread_fields_index(fid, "table12", nfields, field_index_pre, - start, nrecords, sizeof(float), 0, field_sizes_pre, pressure_out ) < 0 ) - goto out; - - /* compare the extracted table with the initial values */ - for( i = 0; i < NRECORDS; i++ ) - { - if ( pressure_out[i] != pressure_in[i] ) { - goto out; - } - } - -/*------------------------------------------------------------------------- - * write and read the "Latitude,Longitude" fields - *------------------------------------------------------------------------- - */ - if (write) - { - /* write the new longitude and latitude information to all the records */ - nfields = 2; - start = 0; - nrecords = NRECORDS; - if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_pos, start, nrecords, - sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 ) - goto out; - } /*write*/ - - /* read the "Latitude,Longitude" fields */ - nfields = 2; - start = 0; - nrecords = NRECORDS_ADD; - if ( H5TBread_fields_index(fid, "table12", nfields, field_index_pos, - start, nrecords, sizeof(position_t), field_offset_pos, field_sizes_pos, position_out ) < 0 ) - goto out; - - /* compare the extracted table with the initial values */ - for( i = 0; i < NRECORDS_ADD; i++ ) - { - if ( position_out[i].lati != position_in[i].lati || - position_out[i].longi != position_in[i].longi ) { - goto out; - } - } - -/*------------------------------------------------------------------------- - * write and read the "Name,Pressure" fields - *------------------------------------------------------------------------- - */ - - if (write) - { - /* write the new name and pressure information to all the records */ - nfields = 2; - start = 0; - nrecords = NRECORDS; - if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_namepre, start, nrecords, - sizeof( namepressure_t ), field_offset_namepre, field_sizes_namepre, namepre_in ) < 0 ) - goto out; - } - - /* read the "Name,Pressure" fields */ - nfields = 2; - start = 0; - nrecords = NRECORDS; - if ( H5TBread_fields_index(fid, "table12", nfields, field_index_namepre, - start, nrecords, sizeof(namepressure_t), field_offset_namepre, - field_sizes_namepre, namepre_out ) < 0 ) - goto out; - - /* compare the extracted table with the initial values */ - for( i = 0; i < NRECORDS; i++ ) - { - if ( ( strcmp( namepre_out[i].name, namepre_in[i].name ) != 0 ) || - namepre_out[i].pressure != namepre_in[i].pressure ) { - goto out; - } - } - - /* reset buffer */ - for( i = 0; i < NRECORDS; i++ ) - { - strcpy( namepre_out[i].name, "\0" ); - namepre_out[i].pressure = -1; - } - -/*------------------------------------------------------------------------- - * read only 3 records of the "Name,Pressure" fields, starting at record 2 - *------------------------------------------------------------------------- - */ - - /* write the new name and pressure information to all the records */ - nfields = 2; - start = 2; - nrecords = 3; - if ( H5TBread_fields_index(fid, "table12", nfields, field_index_namepre, - start, nrecords, sizeof(namepressure_t), field_offset_namepre, - field_sizes_namepre, namepre_out ) < 0 ) - goto out; - - /* compare the extracted table with the initial values */ - for( i = 0; i < 3; i++ ) - { - int iistart = (int) start; - if ( ( strcmp( namepre_out[i].name, wbuf[iistart+i].name ) != 0 ) || - namepre_out[i].pressure != wbuf[iistart+i].pressure ) { - goto out; - } - } - - PASSED(); - - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBinsert_field - * - *------------------------------------------------------------------------- - */ - - if (write) - { - TESTING2("inserting fields"); - - /* make a table */ - if (H5TBmake_table(TITLE,fid,"table13",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill1,compress,wbuf)<0) - goto out; - - /* insert the new field at the end of the field list */ - position = NFIELDS; - if ( H5TBinsert_field( fid, "table13", "New Field", field_type_new, position, - fill1_new, buf_new ) < 0 ) - goto out; - - /* read the table */ - if ( H5TBread_table( fid, "table13", dst_size2, dst_offset2, dst_sizes2, rbuf2 ) < 0 ) - goto out; - - /* compare the extracted table with the original array */ - for( i = 0; i < NRECORDS; i++ ) - { - if ( ( strcmp( rbuf2[i].name, wbuf[i].name ) != 0 ) || - rbuf2[i].lati != wbuf[i].lati || - rbuf2[i].longi != wbuf[i].longi || - rbuf2[i].pressure != wbuf[i].pressure || - rbuf2[i].temperature != wbuf[i].temperature || - rbuf2[i].new_field != buf_new[i] ) { - goto out; - } - } - PASSED(); - } - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBdelete_field - * - *------------------------------------------------------------------------- - */ - if (write) - { - TESTING2("deleting fields"); - - /* make a table */ - if (H5TBmake_table(TITLE,fid,"table14",FIELDS,RECORDS,type_size_mem, - field_names,field_offset,field_type, - chunk_size,fill,compress,wbuf)<0) + + /* read the "Pressure" field */ + start = 0; + nrecords = NRECORDS; + if ( H5TBread_fields_name(fid,"table10","Pressure",start,nrecords, + sizeof(float),0,field_sizes_pre,pressure_out)<0) + goto out; + + + /* Compare the extracted table with the initial values */ + for( i = 0; i < NRECORDS; i++ ) + { + if ( pressure_out[i] != pressure_in[i] ) { + goto out; + } + } + + /*------------------------------------------------------------------------- + * Write and read the "Latitude,Longitude" fields + *------------------------------------------------------------------------- + */ + if (write) + { + /* Write the new longitude and latitude information to all the records */ + start = 0; + nrecords = NRECORDS_ADD; + if ( H5TBwrite_fields_name(fid,"table10", "Latitude,Longitude", start, nrecords, + sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 ) + goto out; + }/*write*/ + + /* Read the "Latitude,Longitude" fields */ + start = 0; + nrecords = NRECORDS_ADD; + if ( H5TBread_fields_name( fid, "table10", "Latitude,Longitude", + start, nrecords, sizeof(position_t), field_offset_pos, field_sizes_pos, position_out ) < 0 ) + goto out; + + + /* Compare the extracted table with the initial values */ + for( i = 0; i < NRECORDS_ADD; i++ ) + { + if ( position_out[i].lati != position_in[i].lati || + position_out[i].longi != position_in[i].longi ) + goto out; + } + + + /*------------------------------------------------------------------------- + * Write and read the "Name,Pressure" fields + *------------------------------------------------------------------------- + */ + if (write) + { + /* Write the new name and pressure information to all the records */ + start = 0; + nrecords = NRECORDS; + if ( H5TBwrite_fields_name( fid, "table10", "Name,Pressure", start, nrecords, + sizeof( namepressure_t ), field_offset_namepre, field_sizes_namepre, namepre_in ) < 0 ) + goto out; + }/*write*/ + + /* Read the "Name,Pressure" fields */ + start = 0; + nrecords = NRECORDS; + if ( H5TBread_fields_name( fid, "table10", "Name,Pressure", + start, nrecords, sizeof(namepressure_t), field_offset_namepre, field_sizes_namepre, + namepre_out ) < 0 ) + goto out; + + + /* Compare the extracted table with the initial values */ + for( i = 0; i < NRECORDS; i++ ) + { + if ( ( strcmp( namepre_out[i].name, namepre_in[i].name ) != 0 ) || + namepre_out[i].pressure != namepre_in[i].pressure ) { + goto out; + } + } + + /* reset buffer */ + for( i = 0; i < NRECORDS; i++ ) + { + strcpy( namepre_out[i].name, "\0" ); + namepre_out[i].pressure = -1; + } + + /*------------------------------------------------------------------------- + * read only 3 records of the "Name,Pressure" fields, starting at record 2 + *------------------------------------------------------------------------- + */ + start = 2; + nrecords = 3; + if ( H5TBread_fields_name( fid, "table10", "Name,Pressure", + start, nrecords, sizeof(namepressure_t), field_offset_namepre, + field_sizes_namepre, namepre_out ) < 0 ) + goto out; + + + /* Compare the extracted table with the initial values */ + for( i = 0; i < 3; i++ ) + { + int iistart = (int) start; + if ( ( strcmp( namepre_out[i].name, namepre_in[iistart+i].name ) != 0 ) || + namepre_out[i].pressure != namepre_in[iistart+i].pressure ) { + goto out; + } + } + + + + PASSED(); + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBwrite_fields_index + * + *------------------------------------------------------------------------- + */ + if (write) + { + TESTING2("writing fields by index"); + + /* make an empty table */ + if (H5TBmake_table(TITLE,fid,"table11",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,NULL)<0) + goto out; + + /* write the pressure field starting at record 2 */ + nfields = 1; + start = 2; + nrecords = NRECORDS_ADD; + if ( H5TBwrite_fields_index(fid, "table11", nfields, field_index_pre, start, nrecords, + sizeof( float ), 0, field_sizes_pre, pressure_in ) < 0 ) + goto out; + + + /* write the new longitude and latitude information starting at record 2 */ + nfields = 2; + start = 2; + nrecords = NRECORDS_ADD; + if ( H5TBwrite_fields_index(fid, "table11", nfields, field_index_pos, start, nrecords, + sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 ) + goto out; + + /* read back the all table */ + nfields = 5; + start = 0; + nrecords = NRECORDS; + if ( H5TBread_fields_index(fid, "table11", nfields, field_index, + start, nrecords, type_size_mem, field_offset, field_size, rbuf ) < 0 ) + goto out; + + /* Compare the extracted table with the initial values */ + for( i = 0; i < NRECORDS; i++ ) + { + if ( i >= 2 && i <= 4 ) + { + if ( rbuf[i].lati != position_in[i-NRECORDS_ADD+1].lati || + rbuf[i].longi != position_in[i-NRECORDS_ADD+1].longi || + rbuf[i].pressure != pressure_in[i-NRECORDS_ADD+1] ) goto out; - - /* delete the field */ - if ( H5TBdelete_field(fid, "table14", "Pressure" ) < 0 ) - goto out; - - /* read the table */ - if ( H5TBread_table(fid, "table14", dst_size3, dst_offset3, dst_sizes3, rbuf3 ) < 0 ) - goto out; - - /* compare the extracted table with the original array */ - for( i = 0; i < NRECORDS; i++ ) - { - if ( ( strcmp( rbuf3[i].name, wbuf[i].name ) != 0 ) || - rbuf3[i].lati != wbuf[i].lati || - rbuf3[i].longi != wbuf[i].longi || - rbuf3[i].temperature != wbuf[i].temperature ) { - goto out; - } - } - - PASSED(); - } - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBget_table_info - * H5TBget_field_info - * - *------------------------------------------------------------------------- - */ - - TESTING2("getting table info"); - - /* get table info */ - if ( H5TBget_table_info (fid, "table1", &rfields, &rrecords ) < 0 ) - goto out; - - if ( NFIELDS != rfields || rrecords != NRECORDS ) { - goto out; - } - - PASSED(); - -/*------------------------------------------------------------------------- - * - * Functions tested: - * - * H5TBget_field_info - * - *------------------------------------------------------------------------- - */ - - TESTING2("getting field info"); - - /* alocate */ - names_out = malloc( sizeof(char*) * (size_t)NFIELDS ); - for ( i = 0; i < NFIELDS; i++) - { - names_out[i] = malloc( sizeof(char) * 255 ); - } - - /* Get field info */ - if ( H5TBget_field_info(fid, "table1", names_out, sizes_out, offset_out, &size_out ) < 0 ) - goto out; - - for ( i = 0; i < NFIELDS; i++) - { - if ( (strcmp( field_names[i], names_out[i] ) != 0)) { - goto out; - } - } - - /* release */ - for ( i = 0; i < NFIELDS; i++) - { - free ( names_out[i] ); - } - free ( names_out ); - - PASSED(); - -/*------------------------------------------------------------------------- - * end - *------------------------------------------------------------------------- - */ - return 0; + } + } + + PASSED(); + } + + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBread_fields_index + * + *------------------------------------------------------------------------- + */ + + TESTING2("reading fields by index"); + + if (write) + { + /* make an empty table */ + if (H5TBmake_table(TITLE,fid,"table12",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,NULL)<0) + goto out; + + /*------------------------------------------------------------------------- + * write and read the "Pressure" field + *------------------------------------------------------------------------- + */ + + /* write the pressure field to all the records */ + nfields = 1; + start = 0; + nrecords = NRECORDS; + if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_pre, start, nrecords, + sizeof( float ), 0, field_sizes_pre, pressure_in ) < 0 ) + goto out; + } + + /* read the "Pressure" field */ + nfields = 1; + start = 0; + nrecords = NRECORDS; + if ( H5TBread_fields_index(fid, "table12", nfields, field_index_pre, + start, nrecords, sizeof(float), 0, field_sizes_pre, pressure_out ) < 0 ) + goto out; + + /* compare the extracted table with the initial values */ + for( i = 0; i < NRECORDS; i++ ) + { + if ( pressure_out[i] != pressure_in[i] ) { + goto out; + } + } + + /*------------------------------------------------------------------------- + * write and read the "Latitude,Longitude" fields + *------------------------------------------------------------------------- + */ + if (write) + { + /* write the new longitude and latitude information to all the records */ + nfields = 2; + start = 0; + nrecords = NRECORDS; + if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_pos, start, nrecords, + sizeof( position_t ), field_offset_pos, field_sizes_pos, position_in ) < 0 ) + goto out; + } /*write*/ + + /* read the "Latitude,Longitude" fields */ + nfields = 2; + start = 0; + nrecords = NRECORDS_ADD; + if ( H5TBread_fields_index(fid, "table12", nfields, field_index_pos, + start, nrecords, sizeof(position_t), field_offset_pos, field_sizes_pos, position_out ) < 0 ) + goto out; + + /* compare the extracted table with the initial values */ + for( i = 0; i < NRECORDS_ADD; i++ ) + { + if ( position_out[i].lati != position_in[i].lati || + position_out[i].longi != position_in[i].longi ) { + goto out; + } + } + + /*------------------------------------------------------------------------- + * write and read the "Name,Pressure" fields + *------------------------------------------------------------------------- + */ + + if (write) + { + /* write the new name and pressure information to all the records */ + nfields = 2; + start = 0; + nrecords = NRECORDS; + if ( H5TBwrite_fields_index(fid, "table12", nfields, field_index_namepre, start, nrecords, + sizeof( namepressure_t ), field_offset_namepre, field_sizes_namepre, namepre_in ) < 0 ) + goto out; + } + + /* read the "Name,Pressure" fields */ + nfields = 2; + start = 0; + nrecords = NRECORDS; + if ( H5TBread_fields_index(fid, "table12", nfields, field_index_namepre, + start, nrecords, sizeof(namepressure_t), field_offset_namepre, + field_sizes_namepre, namepre_out ) < 0 ) + goto out; + + /* compare the extracted table with the initial values */ + for( i = 0; i < NRECORDS; i++ ) + { + if ( ( strcmp( namepre_out[i].name, namepre_in[i].name ) != 0 ) || + namepre_out[i].pressure != namepre_in[i].pressure ) { + goto out; + } + } + + /* reset buffer */ + for( i = 0; i < NRECORDS; i++ ) + { + strcpy( namepre_out[i].name, "\0" ); + namepre_out[i].pressure = -1; + } + + /*------------------------------------------------------------------------- + * read only 3 records of the "Name,Pressure" fields, starting at record 2 + *------------------------------------------------------------------------- + */ + + /* write the new name and pressure information to all the records */ + nfields = 2; + start = 2; + nrecords = 3; + if ( H5TBread_fields_index(fid, "table12", nfields, field_index_namepre, + start, nrecords, sizeof(namepressure_t), field_offset_namepre, + field_sizes_namepre, namepre_out ) < 0 ) + goto out; + + /* compare the extracted table with the initial values */ + for( i = 0; i < 3; i++ ) + { + int iistart = (int) start; + if ( ( strcmp( namepre_out[i].name, wbuf[iistart+i].name ) != 0 ) || + namepre_out[i].pressure != wbuf[iistart+i].pressure ) { + goto out; + } + } + + PASSED(); + + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBinsert_field + * + *------------------------------------------------------------------------- + */ + + if (write) + { + TESTING2("inserting fields"); + + /* make a table */ + if (H5TBmake_table(TITLE,fid,"table13",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill1,compress,wbuf)<0) + goto out; + + /* insert the new field at the end of the field list */ + position = NFIELDS; + if ( H5TBinsert_field( fid, "table13", "New Field", field_type_new, position, + fill1_new, buf_new ) < 0 ) + goto out; + + /* read the table */ + if ( H5TBread_table( fid, "table13", dst_size2, dst_offset2, dst_sizes2, rbuf2 ) < 0 ) + goto out; + + /* compare the extracted table with the original array */ + for( i = 0; i < NRECORDS; i++ ) + { + if ( ( strcmp( rbuf2[i].name, wbuf[i].name ) != 0 ) || + rbuf2[i].lati != wbuf[i].lati || + rbuf2[i].longi != wbuf[i].longi || + rbuf2[i].pressure != wbuf[i].pressure || + rbuf2[i].temperature != wbuf[i].temperature || + rbuf2[i].new_field != buf_new[i] ) { + goto out; + } + } + PASSED(); + } + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBdelete_field + * + *------------------------------------------------------------------------- + */ + if (write) + { + TESTING2("deleting fields"); + + /* make a table */ + if (H5TBmake_table(TITLE,fid,"table14",FIELDS,RECORDS,type_size_mem, + field_names,field_offset,field_type, + chunk_size,fill,compress,wbuf)<0) + goto out; + + /* delete the field */ + if ( H5TBdelete_field(fid, "table14", "Pressure" ) < 0 ) + goto out; + + /* read the table */ + if ( H5TBread_table(fid, "table14", dst_size3, dst_offset3, dst_sizes3, rbuf3 ) < 0 ) + goto out; + + /* compare the extracted table with the original array */ + for( i = 0; i < NRECORDS; i++ ) + { + if ( ( strcmp( rbuf3[i].name, wbuf[i].name ) != 0 ) || + rbuf3[i].lati != wbuf[i].lati || + rbuf3[i].longi != wbuf[i].longi || + rbuf3[i].temperature != wbuf[i].temperature ) { + goto out; + } + } + + PASSED(); + } + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBget_table_info + * H5TBget_field_info + * + *------------------------------------------------------------------------- + */ + + TESTING2("getting table info"); + + /* get table info */ + if ( H5TBget_table_info (fid, "table1", &rfields, &rrecords ) < 0 ) + goto out; + + if ( NFIELDS != rfields || rrecords != NRECORDS ) { + goto out; + } + + PASSED(); + + /*------------------------------------------------------------------------- + * + * Functions tested: + * + * H5TBget_field_info + * + *------------------------------------------------------------------------- + */ + + TESTING2("getting field info"); + + /* alocate */ + names_out = malloc( sizeof(char*) * (size_t)NFIELDS ); + for ( i = 0; i < NFIELDS; i++) + { + names_out[i] = malloc( sizeof(char) * 255 ); + } + + /* Get field info */ + if ( H5TBget_field_info(fid, "table1", names_out, sizes_out, offset_out, &size_out ) < 0 ) + goto out; + + for ( i = 0; i < NFIELDS; i++) + { + if ( (strcmp( field_names[i], names_out[i] ) != 0)) { + goto out; + } + } + + /* release */ + for ( i = 0; i < NFIELDS; i++) + { + free ( names_out[i] ); + } + free ( names_out ); + + PASSED(); + + /*------------------------------------------------------------------------- + * end + *------------------------------------------------------------------------- + */ + return 0; out: - H5_FAILED(); - return -1; + H5_FAILED(); + return -1; } @@ -1472,148 +1555,75 @@ out: int main(void) { - hid_t fid; /* identifier for the file */ - unsigned flags=H5F_ACC_RDONLY; - -/*------------------------------------------------------------------------- - * test1: create a file for the write/read test - *------------------------------------------------------------------------- - */ - - /* create a file using default properties */ - fid=H5Fcreate("test_table.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); - - puts("Testing table with file creation mode (read/write in native architecture):"); - - /* test, do write */ - if (test_table(fid,1)<0) - goto out; - - /* close */ - H5Fclose(fid); - -/*------------------------------------------------------------------------- - * test2: open a file written in test1 on a big-endian machine - *------------------------------------------------------------------------- - */ - puts("Testing table with file open mode (read big-endian data):"); - - fid=h5file_open(TEST_FILE_BE,flags); - - /* test, do not write */ - if (test_table(fid,0)<0) - goto out; - - /* close */ - H5Fclose(fid); - -/*------------------------------------------------------------------------- - * test3: open a file written in test1 on a little-endian machine - *------------------------------------------------------------------------- - */ - puts("Testing table with file open mode (read little-endian data):"); - - fid=h5file_open(TEST_FILE_LE,flags); - - /* test, do not write */ - if (test_table(fid,0)<0) - goto out; - - /* close */ - H5Fclose(fid); - -/*------------------------------------------------------------------------- - * test4: open a file written in test1 on the Cray T3 machine - *------------------------------------------------------------------------- - */ - puts("Testing table with file open mode (read Cray data):"); - - fid=h5file_open(TEST_FILE_CRAY,flags); - - /* test, do not write */ - if (test_table(fid,0)<0) - goto out; - - /* close */ - H5Fclose(fid); - - return 0; + hid_t fid; /* identifier for the file */ + unsigned flags=H5F_ACC_RDONLY; + + /*------------------------------------------------------------------------- + * test1: create a file for the write/read test + *------------------------------------------------------------------------- + */ + + /* create a file using default properties */ + fid=H5Fcreate("test_table.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); + + puts("Testing table with file creation mode (read/write in native architecture):"); + + /* test, do write */ + if (test_table(fid,1)<0) + goto out; + + /* close */ + H5Fclose(fid); + + /*------------------------------------------------------------------------- + * test2: open a file written in test1 on a big-endian machine + *------------------------------------------------------------------------- + */ + puts("Testing table with file open mode (read big-endian data):"); + + fid=h5file_open(TEST_FILE_BE,flags); + + /* test, do not write */ + if (test_table(fid,0)<0) + goto out; + + /* close */ + H5Fclose(fid); + + /*------------------------------------------------------------------------- + * test3: open a file written in test1 on a little-endian machine + *------------------------------------------------------------------------- + */ + puts("Testing table with file open mode (read little-endian data):"); + + fid=h5file_open(TEST_FILE_LE,flags); + + /* test, do not write */ + if (test_table(fid,0)<0) + goto out; + + /* close */ + H5Fclose(fid); + + /*------------------------------------------------------------------------- + * test4: open a file written in test1 on the Cray T3 machine + *------------------------------------------------------------------------- + */ + puts("Testing table with file open mode (read Cray data):"); + + fid=h5file_open(TEST_FILE_CRAY,flags); + + /* test, do not write */ + if (test_table(fid,0)<0) + goto out; + + /* close */ + H5Fclose(fid); + + return 0; out: - H5Fclose(fid); - return 1; -} - - -/*------------------------------------------------------------------------- - * function to open an HDF5 file and return its file identifier - *------------------------------------------------------------------------- - */ -static hid_t h5file_open(const char *fname, unsigned flags) -{ - - hid_t fid; /* identifier for the file */ - char *srcdir = getenv("srcdir"); /* the source directory */ - char data_file[512]=""; /* buffer to hold name of existing file */ - - /* compose the name of the file to open, using the srcdir, if appropriate */ - if (srcdir){ - strcpy(data_file,srcdir); - strcat(data_file,"/"); - } - strcat(data_file,fname); - - /* open */ - if((fid=H5Fopen(data_file,flags,H5P_DEFAULT))<0) { - fprintf(stderr,"Error: Cannot open file <%s>\n",data_file ); - exit(1); - } - - return fid; -} - -/*------------------------------------------------------------------------- - * function that compares one particle - *------------------------------------------------------------------------- - */ -static int cmp_par(hsize_t i, hsize_t j, particle_t *rbuf, particle_t *wbuf ) -{ - if ( ( strcmp( rbuf[i].name, wbuf[j].name ) != 0 ) || - rbuf[i].lati != wbuf[j].lati || - rbuf[i].longi != wbuf[j].longi || - rbuf[i].pressure != wbuf[j].pressure || - rbuf[i].temperature != wbuf[j].temperature ) { - fprintf(stderr,"read and write buffers have differences\n"); - fprintf(stderr,"%s %ld %f %f %d\n", - rbuf[i].name,rbuf[i].longi,rbuf[i].pressure,rbuf[i].temperature,rbuf[i].lati); - fprintf(stderr,"%s %ld %f %f %d\n", - wbuf[j].name,wbuf[j].longi,wbuf[j].pressure,wbuf[j].temperature,wbuf[j].lati); - return -1; - } - return 0; + H5Fclose(fid); + return 1; } -/*------------------------------------------------------------------------- - * function to compare deleted records - *------------------------------------------------------------------------- - */ -static int compare_deleted(hsize_t rrecords, hsize_t dstart, hsize_t drecords, - particle_t *rbuf, particle_t *wbuf) -{ - hsize_t i,j; - for( i=0; i<rrecords; i++) - { - if (i<dstart) - { - if (cmp_par(i,i,rbuf,wbuf)<0) - return -1; - } - else - { - j=i+drecords; - if (cmp_par(i,j,rbuf,wbuf)<0) - return -1; - } - } - return 0; -} |