summaryrefslogtreecommitdiffstats
path: root/test/dtypes.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1998-08-10 18:15:14 (GMT)
committerRobb Matzke <matzke@llnl.gov>1998-08-10 18:15:14 (GMT)
commit9754e9373b731856dbf61fdb9c99501f452ca552 (patch)
tree0bb99d2caf87b9ec8e4dfd2a52bf03b5c7d06055 /test/dtypes.c
parent1d0b2915c2d492ecf35b83ff65287d5d95bf5f7c (diff)
downloadhdf5-9754e9373b731856dbf61fdb9c99501f452ca552.zip
hdf5-9754e9373b731856dbf61fdb9c99501f452ca552.tar.gz
hdf5-9754e9373b731856dbf61fdb9c99501f452ca552.tar.bz2
[svn-r584] Changes since 19980806
---------------------- ./doc/html/Datatypes.html ./doc/html/H5.format.html ./src/H5.c ./src/H5Odtype.c ./src/H5T.c ./src/H5Tconv.c ./src/H5Tpkg.h ./src/H5Tpublic.h ./test/dtypes.c Changed the values of the H5T_str_t type in order to make a distinction between C's null terminated strings and strings which are not null terminated. The string character set and padding method are saved to the hdf5 file instead of using defaults. Added conversion function from one fixed-length string type to another. ./test/chunk.c Fixed to work with new filter API
Diffstat (limited to 'test/dtypes.c')
-rw-r--r--test/dtypes.c339
1 files changed, 339 insertions, 0 deletions
diff --git a/test/dtypes.c b/test/dtypes.c
index f06c8bb..320d440 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -681,6 +681,343 @@ test_named (void)
/*-------------------------------------------------------------------------
+ * Function: mkstr
+ *
+ * Purpose: Create a new string data type
+ *
+ * Return: Success: New type
+ *
+ * Failure: -1
+ *
+ * Programmer: Robb Matzke
+ * Monday, August 10, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+mkstr(size_t len, H5T_str_t strpad)
+{
+ hid_t t;
+
+ if ((t=H5Tcopy(H5T_C_S1))<0) return -1;
+ if (H5Tset_size(t, len)<0) return -1;
+ if (H5Tset_strpad(t, strpad)<0) return -1;
+ return t;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_conv_str_1
+ *
+ * Purpose: Test string conversions
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Robb Matzke
+ * Monday, August 10, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_conv_str_1(void)
+{
+ char *buf=NULL;
+ hid_t src_type, dst_type;
+
+ printf("%-70s", "Testing string conversions");
+ fflush(stdout);
+
+ /*
+ * Convert a null-terminated string to a shorter and longer null
+ * terminated string.
+ */
+ src_type = mkstr(10, H5T_STR_NULLTERM);
+ dst_type = mkstr(5, H5T_STR_NULLTERM);
+ buf = calloc(2, 10);
+ memcpy(buf, "abcdefghi\0abcdefghi\0", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcd\0abcd\0abcdefghi\0", 20)) {
+ puts("*FAILED*");
+ puts(" Truncated C-string test failed");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcd\0\0\0\0\0\0abcd\0\0\0\0\0\0", 20)) {
+ puts("*FAILED*");
+ puts(" Extended C-string test failed");
+ goto error;
+ }
+ free(buf);
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+
+ /*
+ * Convert a null padded string to a shorter and then longer string.
+ */
+ src_type = mkstr(10, H5T_STR_NULLPAD);
+ dst_type = mkstr(5, H5T_STR_NULLPAD);
+ buf = calloc(2, 10);
+ memcpy(buf, "abcdefghijabcdefghij", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdeabcdeabcdefghij", 20)) {
+ puts("*FAILED*");
+ puts(" Truncated C buffer test failed");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcde\0\0\0\0\0abcde\0\0\0\0\0", 20)) {
+ puts("*FAILED*");
+ puts(" Extended C buffer test failed");
+ goto error;
+ }
+ free(buf);
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+
+ /*
+ * Convert a space-padded string to a shorter and then longer string.
+ */
+ src_type = mkstr(10, H5T_STR_SPACEPAD);
+ dst_type = mkstr(5, H5T_STR_SPACEPAD);
+ buf = calloc(2, 10);
+ memcpy(buf, "abcdefghijabcdefghij", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdeabcdeabcdefghij", 20)) {
+ puts("*FAILED*");
+ puts(" Truncated Fortran-string test failed");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcde abcde ", 20)) {
+ puts("*FAILED*");
+ puts(" Extended Fortran-string test failed");
+ goto error;
+ }
+ free(buf);
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+
+ /*
+ * What happens if a null-terminated string is not null terminated? If
+ * the conversion is to an identical string then nothing happens but if
+ * the destination is a different size or type of string then the right
+ * thing should happen.
+ */
+ src_type = mkstr(10, H5T_STR_NULLTERM);
+ dst_type = mkstr(10, H5T_STR_NULLTERM);
+ buf = calloc(2, 10);
+ memcpy(buf, "abcdefghijabcdefghij", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdefghijabcdefghij", 20)) {
+ puts("*FAILED*");
+ puts(" Non-terminated string test 1");
+ goto error;
+ }
+ H5Tclose(dst_type);
+ dst_type = mkstr(5, H5T_STR_NULLTERM);
+ memcpy(buf, "abcdefghijabcdefghij", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcd\0abcd\0abcdefghij", 20)) {
+ puts("*FAILED*");
+ puts(" Non-terminated string test 2");
+ goto error;
+ }
+ memcpy(buf, "abcdeabcdexxxxxxxxxx", 20);
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcde\0\0\0\0\0abcde\0\0\0\0\0", 20)) {
+ puts("*FAILED*");
+ puts(" Non-terminated string test 2");
+ goto error;
+ }
+ free(buf);
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+
+ /*
+ * Test C string to Fortran and vice versa.
+ */
+ src_type = mkstr(10, H5T_STR_NULLTERM);
+ dst_type = mkstr(10, H5T_STR_SPACEPAD);
+ buf = calloc(2, 10);
+ memcpy(buf, "abcdefghi\0abcdefghi\0", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdefghi abcdefghi ", 20)) {
+ puts("*FAILED*");
+ puts(" C string to Fortran test 1");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdefghi\0abcdefghi\0", 20)) {
+ puts("*FAILED*");
+ puts(" Fortran to C string test 1");
+ goto error;
+ }
+ H5Tclose(dst_type);
+ dst_type = mkstr(5, H5T_STR_SPACEPAD);
+ memcpy(buf, "abcdefgh\0\0abcdefgh\0\0", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdeabcdeabcdefgh\0\0", 20)) {
+ puts("*FAILED*");
+ puts(" C string to Fortran test 2");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcde\0\0\0\0\0abcde\0\0\0\0\0", 20)) {
+ puts("*FAILED*");
+ puts(" Fortran to C string test 2");
+ goto error;
+ }
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+ src_type = mkstr(5, H5T_STR_NULLTERM);
+ dst_type = mkstr(10, H5T_STR_SPACEPAD);
+ memcpy(buf, "abcd\0abcd\0xxxxxxxxxx", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcd abcd ", 20)) {
+ puts("*FAILED*");
+ puts(" C string to Fortran test 3");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcd\0abcd\0abcd ", 20)) {
+ puts("*FAILED*");
+ puts(" Fortran to C string test 3");
+ goto error;
+ }
+ free(buf);
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+
+ /*
+ * Test C buffer to Fortran and vice versa.
+ */
+ src_type = mkstr(10, H5T_STR_NULLPAD);
+ dst_type = mkstr(10, H5T_STR_SPACEPAD);
+ buf = calloc(2, 10);
+ memcpy(buf, "abcdefghijabcdefghij", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdefghijabcdefghij", 20)) {
+ puts("*FAILED*");
+ puts(" C buffer to Fortran test 1");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdefghijabcdefghij", 20)) {
+ puts("*FAILED*");
+ puts(" Fortran to C buffer test 1");
+ goto error;
+ }
+ H5Tclose(dst_type);
+ dst_type = mkstr(5, H5T_STR_SPACEPAD);
+ memcpy(buf, "abcdefgh\0\0abcdefgh\0\0", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcdeabcdeabcdefgh\0\0", 20)) {
+ puts("*FAILED*");
+ puts(" C buffer to Fortran test 2");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcde\0\0\0\0\0abcde\0\0\0\0\0", 20)) {
+ puts("*FAILED*");
+ puts(" Fortran to C buffer test 2");
+ goto error;
+ }
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+ src_type = mkstr(5, H5T_STR_NULLPAD);
+ dst_type = mkstr(10, H5T_STR_SPACEPAD);
+ memcpy(buf, "abcd\0abcd\0xxxxxxxxxx", 20);
+ if (H5Tconvert(src_type, dst_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcd abcd ", 20)) {
+ puts("*FAILED*");
+ puts(" C buffer to Fortran test 3");
+ goto error;
+ }
+ if (H5Tconvert(dst_type, src_type, 2, buf, NULL)<0) goto error;
+ if (memcmp(buf, "abcd\0abcd\0abcd ", 20)) {
+ puts("*FAILED*");
+ puts(" Fortran to C buffer test 3");
+ goto error;
+ }
+ free(buf);
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+
+ puts(" PASSED");
+ return 0;
+
+ error:
+ return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_conv_str_2
+ *
+ * Purpose: Tests C-to-Fortran and Fortran-to-C string conversion speed.
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Robb Matzke
+ * Monday, August 10, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_conv_str_2(void)
+{
+ char *buf=NULL, s[80];
+ hid_t c_type, f_type;
+ const size_t nelmts = 200000, ntests=5;
+ size_t i, j, nchars;
+ herr_t ret_value = -1;
+
+ /*
+ * Initialize types and buffer.
+ */
+ c_type = mkstr(8, H5T_STR_NULLPAD);
+ f_type = mkstr(8, H5T_STR_SPACEPAD);
+ buf = calloc(nelmts, 8);
+ for (i=0; i<nelmts; i++) {
+ nchars = rand() % 8;
+ for (j=0; j<nchars; j++) {
+ buf[i*8+j] = 'a' + rand()%26;
+ }
+ while (j<nchars) buf[i*8+j++] = '\0';
+ }
+
+ /* Do the conversions */
+ for (i=0; i<ntests; i++) {
+ sprintf(s, "Testing random string conversion speed (test %d/%d)",
+ (int)(i+1), (int)ntests);
+ printf("%-70s", s);
+ fflush(stdout);
+
+ if (H5Tconvert(c_type, f_type, nelmts, buf, NULL)<0) goto error;
+ if (H5Tconvert(f_type, c_type, nelmts, buf, NULL)<0) goto error;
+ puts(" PASSED");
+ }
+ ret_value = 0;
+
+ error:
+ if (buf) free(buf);
+ return ret_value;
+}
+
+
+
+
+/*-------------------------------------------------------------------------
* Function: test_conv_int
*
* Purpose: Test atomic number conversions.
@@ -1310,6 +1647,8 @@ main(void)
nerrors += test_compound()<0 ? 1 : 0;
nerrors += test_transient ()<0 ? 1 : 0;
nerrors += test_named ()<0 ? 1 : 0;
+ nerrors += test_conv_str_1()<0 ? 1 : 0;
+ nerrors += test_conv_str_2()<0 ? 1 : 0;
nerrors += test_conv_int ()<0 ? 1 : 0;
/* Does floating point overflow generate a SIGFPE? */