Skip to content

Commit

Permalink
(fix) H5Z_xform_create function and scientific notation (#144)
Browse files Browse the repository at this point in the history
* (fix) H5Z_xform_create function and scientific notation

Implemented a more sophisticated check to support scientific notation
in the expression of the H5Zset_data_transform function.

* (fix) H5Z_xform_create and scientific notation: Added test.

Added a test to demonstrate that the parsing of expression
which includes scientific notation works correctly. Improved
inline comment.

Co-authored-by: Jan-Willem Blokland <[email protected]>
  • Loading branch information
jwsblokland and Jan-Willem Blokland authored Dec 2, 2020
1 parent 7950dca commit 82c0cb1
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 16 deletions.
42 changes: 26 additions & 16 deletions src/H5Ztrans.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@

#include "H5Zmodule.h" /* This source code file is part of the H5Z module */

#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
#include "H5VMprivate.h" /* H5VM_array_fill */
#include "H5Zpkg.h" /* Data filters */
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
#include "H5VMprivate.h" /* H5VM_array_fill */
#include "H5Zpkg.h" /* Data filters */

/* Token types */
typedef enum {
Expand Down Expand Up @@ -994,12 +994,12 @@ H5Z__new_node(H5Z_token_type type)

/*-------------------------------------------------------------------------
* Function: H5Z_xform_eval
* Purpose: If the transform is trivial, this function applies it.
* Otherwise, it calls H5Z__xform_eval_full to do the full
* transform.
* Purpose: If the transform is trivial, this function applies it.
* Otherwise, it calls H5Z__xform_eval_full to do the full
* transform.
* Return: SUCCEED if transform applied successfully, FAIL otherwise
* Programmer: Leon Arber
* 5/1/04
* 5/1/04
*
*-------------------------------------------------------------------------
*/
Expand Down Expand Up @@ -1110,8 +1110,8 @@ H5Z_xform_eval(H5Z_data_xform_t *data_xform_prop, void *array, size_t array_size
/*-------------------------------------------------------------------------
* Function: H5Z__xform_eval_full
*
* Purpose: Does a full evaluation of the parse tree contained in tree
* and applies this transform to array.
* Purpose: Does a full evaluation of the parse tree contained in tree
* and applies this transform to array.
*
* Notes: In the case of a polynomial data transform (ie, the left and right
* subtree are both of type H5Z_XFORM_SYMBOL), the convention is
Expand All @@ -1121,7 +1121,7 @@ H5Z_xform_eval(H5Z_data_xform_t *data_xform_prop, void *array, size_t array_size
* Return: Nothing
*
* Programmer: Leon Arber
* 5/1/04
* 5/1/04
*
*-------------------------------------------------------------------------
*/
Expand Down Expand Up @@ -1539,10 +1539,20 @@ H5Z_xform_create(const char *expr)
"unable to allocate memory for data transform expression")

/* Find the number of times "x" is used in this equation, and allocate room for storing that many points
* A more sophisticated check is needed to support scientific notation.
*/
for (i = 0; i < HDstrlen(expr); i++)
if (HDisalpha(expr[i]))
for (i = 0; i < HDstrlen(expr); i++) {
if (HDisalpha(expr[i])) {
if ((i > 0) && (i < (HDstrlen(expr) - 1))) {
if (((expr[i] == 'E') || (expr[i] == 'e')) &&
(HDisdigit(expr[i - 1]) || (expr[i - 1] == '.')) &&
(HDisdigit(expr[i + 1]) || (expr[i + 1] == '-') || (expr[i + 1] == '+')))
continue;
}

count++;
}
}

/* When there are no "x"'s in the equation (ie, simple transform case),
* we don't need to allocate any space since no array will have to be
Expand Down Expand Up @@ -1753,7 +1763,7 @@ H5Z_xform_noop(const H5Z_data_xform_t *data_xform_prop)
* Function: H5Z_xform_extract_xform_str
*
* Purpose: Extracts the pointer to the data transform strings from the
* data transform property.`
* data transform property.`
* Return:
* Pointer to a copy of the string in the data_xform property.
*
Expand Down
24 changes: 24 additions & 0 deletions test/dtransform.c
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,7 @@ test_specials(hid_t file)
const char *special3 = "1000/x";
const char *special4 = "-x";
const char *special5 = "+x";
const char *special6 = "2e+1*x";

TESTING("data transform of some special cases")

Expand Down Expand Up @@ -702,6 +703,29 @@ test_specials(hid_t file)

COMPARE_INT(read_buf, data_res)

if (H5Dclose(dset_id) < 0)
TEST_ERROR

/*-----------------------------
* Operation 6: 2e+1*x
*----------------------------*/
if (H5Pset_data_transform(dxpl_id, special6) < 0)
TEST_ERROR;

for (row = 0; row < ROWS; row++)
for (col = 0; col < COLS; col++)
data_res[row][col] = transformData[row][col] * 20;

if ((dset_id = H5Dcreate2(file, "/special6", H5T_NATIVE_INT, dataspace, H5P_DEFAULT, H5P_DEFAULT,
H5P_DEFAULT)) < 0)
TEST_ERROR
if (H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl_id, transformData) < 0)
TEST_ERROR
if (H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, read_buf) < 0)
TEST_ERROR

COMPARE_INT(read_buf, data_res)

if (H5Dclose(dset_id) < 0)
TEST_ERROR

Expand Down

0 comments on commit 82c0cb1

Please sign in to comment.