From 0d9b59dda14eeb8797ad4d7df3c79a710eeb05e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Tue, 28 Oct 2025 19:45:51 +0300 Subject: [PATCH] mdbx: add `osal_strcasecmp()` and `osal_strncasecmp()`. --- src/osal.c | 15 ++++++++------- src/osal.h | 4 ++++ test/config.c++ | 26 ++++++++++++-------------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/osal.c b/src/osal.c index 5ff1deec..aa2b3b74 100644 --- a/src/osal.c +++ b/src/osal.c @@ -1777,8 +1777,8 @@ int osal_check_fs_incore(mdbx_filehandle_t handle) { const size_t name_len = 0; #endif if (name_len) { - if (strncasecmp("tmpfs", name, 6) == 0 || strncasecmp("mfs", name, 4) == 0 || strncasecmp("ramfs", name, 6) == 0 || - strncasecmp("romfs", name, 6) == 0) + if (osal_strncasecmp("tmpfs", name, 6) == 0 || osal_strncasecmp("mfs", name, 4) == 0 || + osal_strncasecmp("ramfs", name, 6) == 0 || osal_strncasecmp("romfs", name, 6) == 0) return MDBX_RESULT_TRUE; } #endif /* !Windows */ @@ -1990,13 +1990,14 @@ int osal_check_fs_local(mdbx_filehandle_t handle, int flags) { #endif if (name_len) { - if (((name_len > 2 && strncasecmp("nfs", name, 3) == 0) || strncasecmp("cifs", name, name_len) == 0 || - strncasecmp("ncpfs", name, name_len) == 0 || strncasecmp("smbfs", name, name_len) == 0 || - strcasecmp("9P" /* WSL2 */, name) == 0 || - ((name_len > 3 && strncasecmp("fuse", name, 4) == 0) && strncasecmp("fuseblk", name, name_len) != 0)) && + if (((name_len > 2 && osal_strncasecmp("nfs", name, 3) == 0) || osal_strncasecmp("cifs", name, name_len) == 0 || + osal_strncasecmp("ncpfs", name, name_len) == 0 || osal_strncasecmp("smbfs", name, name_len) == 0 || + osal_strcasecmp("9P" /* WSL2 */, name) == 0 || + ((name_len > 3 && osal_strncasecmp("fuse", name, 4) == 0) && + osal_strncasecmp("fuseblk", name, name_len) != 0)) && !(flags & MDBX_EXCLUSIVE)) return MDBX_EREMOTE; - if (strcasecmp("ftp", name) == 0 || strcasecmp("http", name) == 0 || strcasecmp("sshfs", name) == 0) + if (osal_strcasecmp("ftp", name) == 0 || osal_strcasecmp("http", name) == 0 || osal_strcasecmp("sshfs", name) == 0) return MDBX_EREMOTE; } diff --git a/src/osal.h b/src/osal.h index 3cfab476..d199a739 100644 --- a/src/osal.h +++ b/src/osal.h @@ -122,6 +122,8 @@ static inline void osal_free(void *ptr) { HeapFree(GetProcessHeap(), 0, ptr); } #define osal_realloc realloc #define osal_free free #define osal_strdup _strdup +#define osal_strcasecmp _stricmp +#define osal_strncasecmp _strnicmp #endif /* MDBX_WITHOUT_MSVC_CRT */ @@ -150,6 +152,8 @@ typedef pthread_mutex_t osal_fastmutex_t; #define osal_realloc realloc #define osal_free free #define osal_strdup strdup +#define osal_strcasecmp strcasecmp +#define osal_strncasecmp strncasecmp #endif /* Platform */ #if __GLIBC_PREREQ(2, 12) || defined(__FreeBSD__) || defined(malloc_usable_size) diff --git a/test/config.c++ b/test/config.c++ index 4bc20b32..257d01c1 100644 --- a/test/config.c++ +++ b/test/config.c++ @@ -3,10 +3,6 @@ #include "test.h++" -#if defined(_MSC_VER) && !defined(strcasecmp) -#define strcasecmp(str, len) _stricmp(str, len) -#endif /* _MSC_VER && strcasecmp() */ - namespace config { bool parse_option(int argc, char *const argv[], int &narg, const char *option, const char **value, @@ -156,21 +152,21 @@ bool parse_option(int argc, char *const argv[], int &narg, const char *option, u if (suffix && *suffix) { if (scale == no_scale || scale == intkey) failure("Option '--%s' doesn't accepts suffixes, so '%s' is unexpected\n", option, suffix); - if (strcmp(suffix, "K") == 0 || strcasecmp(suffix, "Kilo") == 0) + if (strcmp(suffix, "K") == 0 || osal_strcasecmp(suffix, "Kilo") == 0) multiplier = (scale == decimal) ? UINT64_C(1000) : UINT64_C(1024); - else if (strcmp(suffix, "M") == 0 || strcasecmp(suffix, "Mega") == 0) + else if (strcmp(suffix, "M") == 0 || osal_strcasecmp(suffix, "Mega") == 0) multiplier = (scale == decimal) ? UINT64_C(1000) * 1000 : UINT64_C(1024) * 1024; - else if (strcmp(suffix, "G") == 0 || strcasecmp(suffix, "Giga") == 0) + else if (strcmp(suffix, "G") == 0 || osal_strcasecmp(suffix, "Giga") == 0) multiplier = (scale == decimal) ? UINT64_C(1000) * 1000 * 1000 : UINT64_C(1024) * 1024 * 1024; - else if (strcmp(suffix, "T") == 0 || strcasecmp(suffix, "Tera") == 0) + else if (strcmp(suffix, "T") == 0 || osal_strcasecmp(suffix, "Tera") == 0) multiplier = (scale == decimal) ? UINT64_C(1000) * 1000 * 1000 * 1000 : UINT64_C(1024) * 1024 * 1024 * 1024; - else if (scale == duration && (strcmp(suffix, "s") == 0 || strcasecmp(suffix, "Seconds") == 0)) + else if (scale == duration && (strcmp(suffix, "s") == 0 || osal_strcasecmp(suffix, "Seconds") == 0)) multiplier = 1; - else if (scale == duration && (strcmp(suffix, "m") == 0 || strcasecmp(suffix, "Minutes") == 0)) + else if (scale == duration && (strcmp(suffix, "m") == 0 || osal_strcasecmp(suffix, "Minutes") == 0)) multiplier = 60; - else if (scale == duration && (strcmp(suffix, "h") == 0 || strcasecmp(suffix, "Hours") == 0)) + else if (scale == duration && (strcmp(suffix, "h") == 0 || osal_strcasecmp(suffix, "Hours") == 0)) multiplier = 3600; - else if (scale == duration && (strcmp(suffix, "d") == 0 || strcasecmp(suffix, "Days") == 0)) + else if (scale == duration && (strcmp(suffix, "d") == 0 || osal_strcasecmp(suffix, "Days") == 0)) multiplier = 3600 * 24; else failure("Option '--%s' expects a numeric value with Kilo/Mega/Giga/Tera %s" @@ -313,12 +309,14 @@ bool parse_option(int argc, char *const argv[], int &narg, const char *option, b return true; } - if (strcasecmp(value_cstr, "yes") == 0 || strcasecmp(value_cstr, "1") == 0 || strcasecmp(value_cstr, "on") == 0) { + if (osal_strcasecmp(value_cstr, "yes") == 0 || osal_strcasecmp(value_cstr, "1") == 0 || + osal_strcasecmp(value_cstr, "on") == 0) { value = true; return true; } - if (strcasecmp(value_cstr, "no") == 0 || strcasecmp(value_cstr, "0") == 0 || strcasecmp(value_cstr, "off") == 0) { + if (osal_strcasecmp(value_cstr, "no") == 0 || osal_strcasecmp(value_cstr, "0") == 0 || + osal_strcasecmp(value_cstr, "off") == 0) { value = false; return true; }