From 6e0f6e4ebc5aefc9ccce51a1bf2de37d1ab98dc0 Mon Sep 17 00:00:00 2001 From: Raymond Lu Date: Thu, 10 Nov 2011 15:08:39 -0500 Subject: [svn-r21736] Issue 7582 - The library allowed the conversion of strings between ASCII and UTF8. I added more test cases to the previous commit. Now it has conversion from UTF8 to ASCII, ASCII to UTF8, VL and fixed length, and H5Tconvert. Tested on jam, koala, linew. --- test/dtypes.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 107 insertions(+), 22 deletions(-) diff --git a/test/dtypes.c b/test/dtypes.c index 648650f..23a7bac 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -113,6 +113,8 @@ typedef enum dtype_t { /* Constant for testing conversion of UTF-8 characters */ #define UTF8_DATASET "utf8" #define UTF8_DATASET2 "2nd_utf8" +#define ASCII_DATASET "ascii" +#define ASCII_DATASET2 "2nd_ascii" /* Count opaque conversions */ static int num_opaque_conversions_g = 0; @@ -7026,23 +7028,40 @@ error: } /* end test_deprec() */ #endif /* H5_NO_DEPRECATED_SYMBOLS */ -int test_utf_conv() + +/*------------------------------------------------------------------------- + * Function: test_utf_ascii_conv + * + * Purpose: Make sure the library doesn't conversion strings between + * ASCII and UTF8. + * + * Return: Success: 0 + * Failure: number of errors + * + * Programmer: Raymond Lu + * 10 November 2011 + *------------------------------------------------------------------------- + */ +int test_utf_ascii_conv(void) { hid_t fid; hid_t did; hid_t utf8_vtid, ascii_vtid; hid_t utf8_tid, ascii_tid; hid_t sid; - const char *utf8 = "foo!"; - char *ascii = NULL; - char ascii2[4]; + const char *utf8_w = "foo!"; + char *ascii_r = NULL; + const char *ascii_w = "bar!"; + char *utf8_r = NULL; + + char ascii2[4], utf8_2[4]; herr_t status; TESTING("string conversion between ASCII and UTF"); - /*********************************** - * Test VL string conversion - ***********************************/ + /************************************************ + * Test VL string conversion from UTF8 to ASCII + ************************************************/ /* Create a variable-length string */ if((utf8_vtid = H5Tcopy(H5T_C_S1)) < 0) FAIL_STACK_ERROR @@ -7059,37 +7078,70 @@ int test_utf_conv() /* Set the character set for the string to ASCII (should already be so) */ if((status = H5Tset_cset(ascii_vtid, H5T_CSET_ASCII) < 0)) FAIL_STACK_ERROR + /* Test conversion in memory */ + H5E_BEGIN_TRY { + status = H5Tconvert(utf8_vtid, ascii_vtid, 1, (void *)utf8_w, NULL, H5P_DEFAULT); + } H5E_END_TRY + if(status >= 0) + FAIL_STACK_ERROR + /* Create a file */ if((fid = H5Fcreate(FILENAME[10], H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR /* Create a scalar dataspace for the dataset */ if((sid = H5Screate(H5S_SCALAR)) < 0) FAIL_STACK_ERROR - /* Create a dataset */ + /* Create a dataset of UTF8 string type */ if((did = H5Dcreate2(fid, UTF8_DATASET, utf8_vtid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR /* Write the UTF8 string, as UTF8 */ - if((status = H5Dwrite(did, utf8_vtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &utf8)) < 0) FAIL_STACK_ERROR + if((status = H5Dwrite(did, utf8_vtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &utf8_w)) < 0) FAIL_STACK_ERROR /* Read the UTF8 string, as ASCII, supposed to fail */ H5E_BEGIN_TRY { - status = H5Dread(did, ascii_vtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &ascii); + status = H5Dread(did, ascii_vtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &ascii_r); } H5E_END_TRY if(status >= 0) FAIL_STACK_ERROR + /* Close the dataset */ + if((status = H5Dclose(did)) < 0) FAIL_STACK_ERROR + + /************************************************ + * Test VL string conversion from ASCII to UTF8 + ************************************************/ + /* Test conversion in memory */ + H5E_BEGIN_TRY { + status = H5Tconvert(ascii_vtid, utf8_vtid, 1, (void *)ascii_w, NULL, H5P_DEFAULT); + } H5E_END_TRY + if(status >= 0) + FAIL_STACK_ERROR + + /* Create a dataset of ASCII string type */ + if((did = H5Dcreate2(fid, ASCII_DATASET, ascii_vtid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR + + /* Write the ASCII string, as ASCII */ + if((status = H5Dwrite(did, ascii_vtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &ascii_w)) < 0) FAIL_STACK_ERROR + + /* Read the ASCII string, as UTF8, supposed to fail */ + H5E_BEGIN_TRY { + status = H5Dread(did, utf8_vtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &utf8_r); + } H5E_END_TRY + if(status >= 0) + FAIL_STACK_ERROR + + /* Close the dataset */ + if((status = H5Dclose(did)) < 0) FAIL_STACK_ERROR + /* Close the UTF8 VL-string datatype */ if((status = H5Tclose(utf8_vtid)) < 0) FAIL_STACK_ERROR /* Close the ASCII VL-string datatype */ if((status = H5Tclose(ascii_vtid)) < 0) FAIL_STACK_ERROR - /* Close the dataset */ - if((status = H5Dclose(did)) < 0) FAIL_STACK_ERROR - - /*************************************** - * Test fixed-length string conversion - ***************************************/ + /********************************************************** + * Test fixed-length string conversion from UTF8 to ASCII + **********************************************************/ /* Create a fixed-length UTF8 string */ if((utf8_tid = H5Tcopy(H5T_C_S1)) < 0) FAIL_STACK_ERROR @@ -7106,28 +7158,61 @@ int test_utf_conv() /* Set the character set for the string to ASCII (should already be so) */ if((status = H5Tset_cset(ascii_tid, H5T_CSET_ASCII) < 0)) FAIL_STACK_ERROR + /* Test conversion in memory */ + H5E_BEGIN_TRY { + status = H5Tconvert(utf8_tid, ascii_tid, 1, utf8_2, NULL, H5P_DEFAULT); + } H5E_END_TRY + if(status >= 0) + FAIL_STACK_ERROR + /* Create a dataset */ if((did = H5Dcreate2(fid, UTF8_DATASET2, utf8_tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR /* Write the UTF8 string, as UTF8 */ - if((status = H5Dwrite(did, utf8_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &utf8)) < 0) FAIL_STACK_ERROR + if((status = H5Dwrite(did, utf8_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &utf8_w)) < 0) FAIL_STACK_ERROR /* Read the UTF8 string as ASCII, supposed to fail */ H5E_BEGIN_TRY { - status = H5Dread(did, ascii_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, ascii2); + status = H5Dread(did, ascii_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &ascii2); } H5E_END_TRY if(status >= 0) FAIL_STACK_ERROR + /* Close the dataset */ + if((status = H5Dclose(did)) < 0) FAIL_STACK_ERROR + + /********************************************************** + * Test fixed-length string conversion from ASCII to UTF8 + **********************************************************/ + /* Test conversion in memory */ + H5E_BEGIN_TRY { + status = H5Tconvert(ascii_tid, utf8_tid, 1, ascii2, NULL, H5P_DEFAULT); + } H5E_END_TRY + if(status >= 0) + FAIL_STACK_ERROR + + /* Create a dataset */ + if((did = H5Dcreate2(fid, ASCII_DATASET2, ascii_tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR + + /* Write the ASCII string, as ASCII */ + if((status = H5Dwrite(did, ascii_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &ascii_w)) < 0) FAIL_STACK_ERROR + + /* Read the UTF8 string as ASCII, supposed to fail */ + H5E_BEGIN_TRY { + status = H5Dread(did, utf8_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &utf8_2); + } H5E_END_TRY + if(status >= 0) + FAIL_STACK_ERROR + + /* Close the dataset */ + if((status = H5Dclose(did)) < 0) FAIL_STACK_ERROR + /* Close the UTF8 string datatype */ if((status = H5Tclose(utf8_tid)) < 0) FAIL_STACK_ERROR /* Close the ASCII string datatype */ if((status = H5Tclose(ascii_tid)) < 0) FAIL_STACK_ERROR - /* Close the dataset */ - if((status = H5Dclose(did)) < 0) FAIL_STACK_ERROR - /* Close the dataspace */ if((status = H5Sclose(sid)) < 0) FAIL_STACK_ERROR @@ -7233,7 +7318,7 @@ main(void) nerrors += test_bitfield_funcs(); nerrors += test_opaque(); nerrors += test_set_order(); - nerrors += test_utf_conv(); + nerrors += test_utf_ascii_conv(); if(nerrors) { printf("***** %lu FAILURE%s! *****\n", -- cgit v0.12