From 6977b5afc2f75926edf1ee54b6360883b42d5045 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Fri, 23 Feb 2001 17:23:01 -0500 Subject: [svn-r3508] Purpose: Bug Fix Description: We were trying to build the talign test program before the library was actually built. Solution: Moved talign test to the lib directory since it belongs with the library anyway. Platforms tested: Linux --- tools/Makefile.in | 12 +--- tools/lib/Makefile.in | 16 ++++- tools/lib/talign.c | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++ tools/talign.c | 175 -------------------------------------------------- 4 files changed, 193 insertions(+), 185 deletions(-) create mode 100644 tools/lib/talign.c delete mode 100644 tools/talign.c diff --git a/tools/Makefile.in b/tools/Makefile.in index 88c3362..fbbb440 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -21,7 +21,7 @@ CPPFLAGS=-I. -I$(srcdir) -I$(top_builddir)/src -I$(top_srcdir)/src \ ## Test programs and scripts. ## -TEST_PROGS=talign +TEST_PROGS= TEST_SCRIPTS= ## These are our main targets: library and tools. @@ -33,7 +33,7 @@ PROGS=$(PUB_PROGS) $(TEST_PROGS) ## Source and object files for the tests ## -TEST_SRC=talign.c +TEST_SRC= TEST_OBJ=$(TEST_SRC:.c=.lo) lib :: @@ -45,7 +45,7 @@ progs: $(LIBTOOLS) $(LIBHDF5) done check tests test _test: $(PROGS) - @@SETX@; for d in $(SUBDIRS); do \ + @@SETX@; for d in lib $(SUBDIRS); do \ (cd $$d && $(MAKE) $@) || exit 1; \ done @@ -83,9 +83,3 @@ maintainer-clean: (cd $$d && $(MAKE) $@); \ done -talign: talign.lo - @$(LT_LINK_EXE) $(CFLAGS) -o $@ talign.lo $(LIBTOOLS) $(LIBHDF5) $(LDFLAGS) $(LIBS) - -.c.lo: - @$(LT_COMPILE) $(CFLAGS) $(CPPFLAGS) -c $< - diff --git a/tools/lib/Makefile.in b/tools/lib/Makefile.in index 5e61afd..dc35ebe 100644 --- a/tools/lib/Makefile.in +++ b/tools/lib/Makefile.in @@ -18,7 +18,7 @@ CPPFLAGS=-I. -I$(srcdir) -I$(top_builddir)/src -I$(top_srcdir)/src \ ## Test programs and scripts. ## -TEST_PROGS= +TEST_PROGS=talign TEST_SCRIPTS= ## These are our main targets: library and tools. We link this library @@ -27,6 +27,9 @@ TEST_SCRIPTS= ## LT_LINK_LIB=$(LT) --mode=link $(CC) -static -rpath $(libdir) LIB=libh5tools.la +LIBHDF5=$(top_builddir)/src/libhdf5.la +PUB_PROGS= +PROGS=$(PUB_PROGS) $(TEST_PROGS) ## Source and object files for the library; do not install ## @@ -34,10 +37,21 @@ LIB_SRC=h5tools.c h5tools_str.c LIB_OBJ=$(LIB_SRC:.c=.lo) PUB_LIB= +TEST_SRC=talign.c +TEST_OBJ=$(TEST_SRC:.c=.lo) + PRIVATE_HDR=h5tools.h h5tools_str.h ## Programs have to be built before they can be tested! ## check test _test: $(PROGS) +## How to build the programs... They all depend on the hdf5 library and +## the tools library compiled in this directory. +## +$(PROGS): $(LIB) $(LIBHDF5) + +talign: talign.lo + @$(LT_LINK_EXE) $(CFLAGS) -o $@ talign.lo $(LIB) $(LIBHDF5) $(LDFLAGS) $(LIBS) + @CONCLUDE@ diff --git a/tools/lib/talign.c b/tools/lib/talign.c new file mode 100644 index 0000000..7bf0659 --- /dev/null +++ b/tools/lib/talign.c @@ -0,0 +1,175 @@ +/* + * Small program to illustrate the "misalignment" of members within a compound + * datatype, in a datatype fixed by h5dump_fixtype(). + */ +#include +#include +#include /* Required for unlink() */ + +#include "hdf5.h" + +const char *fname = "talign.h5"; +const char *setname = "align"; + +/* + * This program assumes that there is no extra space between the members 'Ok' + * and 'Not Ok', (there shouldn't be because they are of the same atomic type + * H5T_NATIVE_FLOAT, and they are placed within the compound next to one + * another per construction) + */ + +extern hid_t h5dump_fixtype(hid_t); + +int main(void) +{ + hid_t fil,spc,set; + hid_t cs6, cmp, fix; + hid_t cmp1, cmp2, cmp3; + hid_t plist; + hid_t array_dt; + + hsize_t dim[2]; + hsize_t cdim[4]; + + char string5[5]; + float fok[2] = {1234., 2341.}; + float fnok[2] = {5678., 6785.}; + float *fptr; + + char *data; + char *mname; + + int result = 0; + + printf("%-70s", "Testing alignment in compound datatypes"); + + strcpy(string5, "Hi!"); + unlink(fname); + fil = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + if (fil < 0) { + puts("*FAILED*"); + return 1; + } + + H5E_BEGIN_TRY { + H5Gunlink(fil, setname); + } H5E_END_TRY; + + cs6 = H5Tcopy(H5T_C_S1); + H5Tset_size(cs6, sizeof(string5)); + H5Tset_strpad(cs6, H5T_STR_NULLPAD); + + cmp = H5Tcreate(H5T_COMPOUND, sizeof(fok) + sizeof(string5) + sizeof(fnok)); + H5Tinsert(cmp, "Awkward length", 0, cs6); + + cdim[0] = sizeof(fok) / sizeof(float); + array_dt=H5Tarray_create(H5T_NATIVE_FLOAT,1,cdim,NULL); + H5Tinsert(cmp, "Ok", sizeof(string5), array_dt); + H5Tclose(array_dt); + + cdim[0] = sizeof(fnok) / sizeof(float); + array_dt=H5Tarray_create(H5T_NATIVE_FLOAT,1,cdim,NULL); + H5Tinsert(cmp, "Not Ok", sizeof(fok) + sizeof(string5), array_dt); + H5Tclose(array_dt); + + fix = h5dump_fixtype(cmp); + + cmp1 = H5Tcreate(H5T_COMPOUND, sizeof(fok)); + + cdim[0] = sizeof(fok) / sizeof(float); + array_dt=H5Tarray_create(H5T_NATIVE_FLOAT,1,cdim,NULL); + H5Tinsert(cmp1, "Ok", 0, array_dt); + H5Tclose(array_dt); + + cmp2 = H5Tcreate(H5T_COMPOUND, sizeof(string5)); + H5Tinsert(cmp2, "Awkward length", 0, cs6); + + cmp3 = H5Tcreate(H5T_COMPOUND, sizeof(fnok)); + + cdim[0] = sizeof(fnok) / sizeof(float); + array_dt=H5Tarray_create(H5T_NATIVE_FLOAT,1,cdim,NULL); + H5Tinsert(cmp3, "Not Ok", 0, array_dt); + H5Tclose(array_dt); + + plist = H5Pcreate(H5P_DATASET_XFER); + H5Pset_preserve(plist, 1); + + /* + * Create a small dataset, and write data into it we write each field + * in turn so that we are avoid alignment issues at this point + */ + dim[0] = 1; + spc = H5Screate_simple(1, dim, NULL); + set = H5Dcreate(fil, setname, cmp, spc, H5P_DEFAULT); + + H5Dwrite(set, cmp1, spc, H5S_ALL, plist, fok); + H5Dwrite(set, cmp2, spc, H5S_ALL, plist, string5); + H5Dwrite(set, cmp3, spc, H5S_ALL, plist, fnok); + + H5Dclose(set); + + /* Now open the set, and read it back in */ + data = malloc(H5Tget_size(fix)); + + if (!data) { + perror("malloc() failed"); + abort(); + } + + set = H5Dopen(fil, setname); + + H5Dread(set, fix, spc, H5S_ALL, H5P_DEFAULT, data); + fptr = (float *)(data + H5Tget_member_offset(fix, 1)); + + if (fok[0] != fptr[0] || fok[1] != fptr[1] + || fnok[0] != fptr[2] || fnok[1] != fptr[3]) { + result = 1; + printf("%14s (%2d) %6s = %s\n", + mname = H5Tget_member_name(fix, 0), (int)H5Tget_member_offset(fix,0), + string5, (char *)(data + H5Tget_member_offset(fix, 0))); + free(mname); + fptr = (float *)(data + H5Tget_member_offset(fix, 1)); + printf("Data comparison:\n" + "%14s (%2d) %6f = %f\n" + " %6f = %f\n", + mname = H5Tget_member_name(fix, 1), (int)H5Tget_member_offset(fix,1), + fok[0], fptr[0], + fok[1], fptr[1]); + free(mname); + fptr = (float *)(data + H5Tget_member_offset(fix, 2)); + printf("%14s (%2d) %6f = %f\n" + " %6f = %6f\n", + mname = H5Tget_member_name(fix, 2), (int)H5Tget_member_offset(fix,2), + fnok[0], fptr[0], + fnok[1], fptr[1]); + free(mname); + + fptr = (float *)(data + H5Tget_member_offset(fix, 1)); + printf("\n" + "Short circuit\n" + " %6f = %f\n" + " %6f = %f\n" + " %6f = %f\n" + " %6f = %f\n", + fok[0], fptr[0], + fok[1], fptr[1], + fnok[0], fptr[2], + fnok[1], fptr[3]); + puts("*FAILED*"); + } else { + puts(" PASSED"); + } + + free(data); + H5Sclose(spc); + H5Tclose(cmp); + H5Tclose(cmp1); + H5Tclose(cmp2); + H5Tclose(cmp3); + H5Pclose(plist); + H5Fclose(fil); + unlink(fname); + fflush(stdout); + return result; +} diff --git a/tools/talign.c b/tools/talign.c deleted file mode 100644 index 7bf0659..0000000 --- a/tools/talign.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Small program to illustrate the "misalignment" of members within a compound - * datatype, in a datatype fixed by h5dump_fixtype(). - */ -#include -#include -#include /* Required for unlink() */ - -#include "hdf5.h" - -const char *fname = "talign.h5"; -const char *setname = "align"; - -/* - * This program assumes that there is no extra space between the members 'Ok' - * and 'Not Ok', (there shouldn't be because they are of the same atomic type - * H5T_NATIVE_FLOAT, and they are placed within the compound next to one - * another per construction) - */ - -extern hid_t h5dump_fixtype(hid_t); - -int main(void) -{ - hid_t fil,spc,set; - hid_t cs6, cmp, fix; - hid_t cmp1, cmp2, cmp3; - hid_t plist; - hid_t array_dt; - - hsize_t dim[2]; - hsize_t cdim[4]; - - char string5[5]; - float fok[2] = {1234., 2341.}; - float fnok[2] = {5678., 6785.}; - float *fptr; - - char *data; - char *mname; - - int result = 0; - - printf("%-70s", "Testing alignment in compound datatypes"); - - strcpy(string5, "Hi!"); - unlink(fname); - fil = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - - if (fil < 0) { - puts("*FAILED*"); - return 1; - } - - H5E_BEGIN_TRY { - H5Gunlink(fil, setname); - } H5E_END_TRY; - - cs6 = H5Tcopy(H5T_C_S1); - H5Tset_size(cs6, sizeof(string5)); - H5Tset_strpad(cs6, H5T_STR_NULLPAD); - - cmp = H5Tcreate(H5T_COMPOUND, sizeof(fok) + sizeof(string5) + sizeof(fnok)); - H5Tinsert(cmp, "Awkward length", 0, cs6); - - cdim[0] = sizeof(fok) / sizeof(float); - array_dt=H5Tarray_create(H5T_NATIVE_FLOAT,1,cdim,NULL); - H5Tinsert(cmp, "Ok", sizeof(string5), array_dt); - H5Tclose(array_dt); - - cdim[0] = sizeof(fnok) / sizeof(float); - array_dt=H5Tarray_create(H5T_NATIVE_FLOAT,1,cdim,NULL); - H5Tinsert(cmp, "Not Ok", sizeof(fok) + sizeof(string5), array_dt); - H5Tclose(array_dt); - - fix = h5dump_fixtype(cmp); - - cmp1 = H5Tcreate(H5T_COMPOUND, sizeof(fok)); - - cdim[0] = sizeof(fok) / sizeof(float); - array_dt=H5Tarray_create(H5T_NATIVE_FLOAT,1,cdim,NULL); - H5Tinsert(cmp1, "Ok", 0, array_dt); - H5Tclose(array_dt); - - cmp2 = H5Tcreate(H5T_COMPOUND, sizeof(string5)); - H5Tinsert(cmp2, "Awkward length", 0, cs6); - - cmp3 = H5Tcreate(H5T_COMPOUND, sizeof(fnok)); - - cdim[0] = sizeof(fnok) / sizeof(float); - array_dt=H5Tarray_create(H5T_NATIVE_FLOAT,1,cdim,NULL); - H5Tinsert(cmp3, "Not Ok", 0, array_dt); - H5Tclose(array_dt); - - plist = H5Pcreate(H5P_DATASET_XFER); - H5Pset_preserve(plist, 1); - - /* - * Create a small dataset, and write data into it we write each field - * in turn so that we are avoid alignment issues at this point - */ - dim[0] = 1; - spc = H5Screate_simple(1, dim, NULL); - set = H5Dcreate(fil, setname, cmp, spc, H5P_DEFAULT); - - H5Dwrite(set, cmp1, spc, H5S_ALL, plist, fok); - H5Dwrite(set, cmp2, spc, H5S_ALL, plist, string5); - H5Dwrite(set, cmp3, spc, H5S_ALL, plist, fnok); - - H5Dclose(set); - - /* Now open the set, and read it back in */ - data = malloc(H5Tget_size(fix)); - - if (!data) { - perror("malloc() failed"); - abort(); - } - - set = H5Dopen(fil, setname); - - H5Dread(set, fix, spc, H5S_ALL, H5P_DEFAULT, data); - fptr = (float *)(data + H5Tget_member_offset(fix, 1)); - - if (fok[0] != fptr[0] || fok[1] != fptr[1] - || fnok[0] != fptr[2] || fnok[1] != fptr[3]) { - result = 1; - printf("%14s (%2d) %6s = %s\n", - mname = H5Tget_member_name(fix, 0), (int)H5Tget_member_offset(fix,0), - string5, (char *)(data + H5Tget_member_offset(fix, 0))); - free(mname); - fptr = (float *)(data + H5Tget_member_offset(fix, 1)); - printf("Data comparison:\n" - "%14s (%2d) %6f = %f\n" - " %6f = %f\n", - mname = H5Tget_member_name(fix, 1), (int)H5Tget_member_offset(fix,1), - fok[0], fptr[0], - fok[1], fptr[1]); - free(mname); - fptr = (float *)(data + H5Tget_member_offset(fix, 2)); - printf("%14s (%2d) %6f = %f\n" - " %6f = %6f\n", - mname = H5Tget_member_name(fix, 2), (int)H5Tget_member_offset(fix,2), - fnok[0], fptr[0], - fnok[1], fptr[1]); - free(mname); - - fptr = (float *)(data + H5Tget_member_offset(fix, 1)); - printf("\n" - "Short circuit\n" - " %6f = %f\n" - " %6f = %f\n" - " %6f = %f\n" - " %6f = %f\n", - fok[0], fptr[0], - fok[1], fptr[1], - fnok[0], fptr[2], - fnok[1], fptr[3]); - puts("*FAILED*"); - } else { - puts(" PASSED"); - } - - free(data); - H5Sclose(spc); - H5Tclose(cmp); - H5Tclose(cmp1); - H5Tclose(cmp2); - H5Tclose(cmp3); - H5Pclose(plist); - H5Fclose(fil); - unlink(fname); - fflush(stdout); - return result; -} -- cgit v0.12