Skip to content

Commit

Permalink
Implement RV_strtok_r
Browse files Browse the repository at this point in the history
  • Loading branch information
mattjala committed May 2, 2024
1 parent 99e0d03 commit b0870f3
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 7 deletions.
5 changes: 4 additions & 1 deletion config/cmake/ConfigureChecks.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ SET (H5_DEFAULT_VOL H5VL_NATIVE)

# Find the library containing clock_gettime()
CHECK_FUNCTION_EXISTS (clock_gettime CLOCK_GETTIME_IN_LIBC)
CHECK_FUNCTION_EXISTS (gettimeofday RV_HAVE_GETTIMEOFDAY)
CHECK_FUNCTION_EXISTS(strtok_r RV_HAVE_STRTOK_R)
CHECK_FUNCTION_EXISTS(strtok_s RV_HAVE_STRTOK_s)
CHECK_LIBRARY_EXISTS (rt clock_gettime "" CLOCK_GETTIME_IN_LIBRT)
CHECK_LIBRARY_EXISTS (posix4 clock_gettime "" CLOCK_GETTIME_IN_LIBPOSIX4)
if (CLOCK_GETTIME_IN_LIBC)
Expand All @@ -41,7 +44,7 @@ elseif (CLOCK_GETTIME_IN_LIBPOSIX4)
list (APPEND LINK_LIBS posix4)
endif ()

CHECK_FUNCTION_EXISTS (gettimeofday RV_HAVE_GETTIMEOFDAY)

# -----------------------------------------------------------------------
# wrapper script variables
#
Expand Down
6 changes: 5 additions & 1 deletion config/cmake/rv_cmake_config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@
/* Define to 1 if you have the `gettimeofday' function. */
#cmakedefine RV_HAVE_GETTIMEOFDAY @RV_HAVE_GETTIMEOFDAY@

#cmakedefine RV_TEST_VAR @RV_TEST_VAR@
/* Define to 1 if you have the `strtok_r` function */
#cmakedefine RV_HAVE_STRTOK_R @RV_HAVE_STRTOK_R@

/* Define to 1 if you have the `strtok_s` function */
#cmakedefine RV_HAVE_STRTOK_S @RV_HAVE_STRTOK_S@

/* Define if Darwin or Mac OS X */
#cmakedefine RV_HAVE_DARWIN @RV_HAVE_DARWIN@
Expand Down
33 changes: 28 additions & 5 deletions src/rest_vol.c
Original file line number Diff line number Diff line change
Expand Up @@ -3458,8 +3458,9 @@ RV_parse_server_version(char *HTTP_response, const void *callback_data_in, void
herr_t ret_value = SUCCEED;
server_api_version *server_version = (server_api_version *)callback_data_out;

char *version_response = NULL;
char *version_field = NULL;
char *version_response = NULL;
char *version_field = NULL;
char *saveptr;
int numeric_version_field = 0;

#ifdef RV_CONNECTOR_DEBUG
Expand All @@ -3486,23 +3487,23 @@ RV_parse_server_version(char *HTTP_response, const void *callback_data_in, void
FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "server version was NULL");

/* Parse server version into struct */
if (NULL == (version_field = strtok(version_response, ".")))
if (NULL == (version_field = RV_strtok_r(version_response, ".", &saveptr)))
FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "server major version field was NULL");

if ((numeric_version_field = (int)strtol(version_field, NULL, 10)) < 0)
FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "invalid server major version");

server_version->major = (size_t)numeric_version_field;

if (NULL == (version_field = strtok(NULL, ".")))
if (NULL == (version_field = RV_strtok_r(NULL, ".", &saveptr)))
FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "server minor version field was NULL");

if ((numeric_version_field = (int)strtol(version_field, NULL, 10)) < 0)
FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "invalid server minor version");

server_version->minor = (size_t)numeric_version_field;

if (NULL == (version_field = strtok(NULL, ".")))
if (NULL == (version_field = RV_strtok_r(NULL, ".", &saveptr)))
FUNC_GOTO_ERROR(H5E_OBJECT, H5E_BADVALUE, FAIL, "server patch version field was NULL");

if ((numeric_version_field = (int)strtol(version_field, NULL, 10)) < 0)
Expand Down Expand Up @@ -4481,3 +4482,25 @@ RV_now_usec(void)
done:
return (ret_value);
}

/*-------------------------------------------------------------------------
* Function: RV_strtok_r
*
* Purpose: Helper function to use strtok_r or strtok_r depending on current platform
*
* Return: See strtok_r documentation
*
* Programmer: Matthew Larson
* May, 2024
*/
char *
RV_strtok_r(char *str, const char *delim, char **saveptr)
{
#ifdef RV_HAVE_STRTOK_R
return strtok_r(str, delim, saveptr);
#elif RV_HAVE_STRTOK_S
return strtok_s(str, delim, saveptr);
#else
return NULL;
#endif
}
4 changes: 4 additions & 0 deletions src/rest_vol.h
Original file line number Diff line number Diff line change
Expand Up @@ -817,9 +817,13 @@ herr_t RV_get_cmpd_subset_type(hid_t src_type_id, hid_t dst_type_id, RV_subset_t

/* Helper to get information about members in dst that are included in src compound */
herr_t RV_get_cmpd_subset_nmembers(hid_t src_type_id, hid_t dst_type_id, size_t *num_cmpd_members);

/* Return the current time as microseconds after the UNIX epoch. */
uint64_t RV_now_usec(void);

/* System-indepedent wrapper for strtok_r/strtok_s */
char *RV_strtok_r(char *str, const char *delim, char **saveptr);

#define SERVER_VERSION_MATCHES_OR_EXCEEDS(version, major_needed, minor_needed, patch_needed) \
(version.major > major_needed) || (version.major == major_needed && version.minor > minor_needed) || \
(version.major == major_needed && version.minor == minor_needed && version.patch >= patch_needed)
Expand Down

0 comments on commit b0870f3

Please sign in to comment.