From 7872c0d391f45fdc4e92a863137d83f66a6edac3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 4 Aug 2025 23:37:09 +0300 Subject: [PATCH] [LIBCNTPR] Implement NT versions of _stricmp and _strnicmp --- sdk/lib/crt/string/_stricmp_nt.c | 43 +++++++++++++++++++++++++++++ sdk/lib/crt/string/_strnicmp_nt.c | 45 +++++++++++++++++++++++++++++++ sdk/lib/crt/string/string.cmake | 6 +++-- 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 sdk/lib/crt/string/_stricmp_nt.c create mode 100644 sdk/lib/crt/string/_strnicmp_nt.c diff --git a/sdk/lib/crt/string/_stricmp_nt.c b/sdk/lib/crt/string/_stricmp_nt.c new file mode 100644 index 00000000000..2bec446c3a0 --- /dev/null +++ b/sdk/lib/crt/string/_stricmp_nt.c @@ -0,0 +1,43 @@ +/* + * PROJECT: ReactOS NT CRT library + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of _stricmp + * COPYRIGHT: Copyright 2025 Timo Kreuzer + */ + +#include + +_Check_return_ +int +__cdecl +_stricmp( + _In_z_ char const* _String1, + _In_z_ char const* _String2) +{ + char const* p1 = _String1; + char const* p2 = _String2; + char chr1, chr2; + + while (1) + { + chr1 = *p1++; + chr2 = *p2++; + + if (chr1 != chr2) + { + if ((chr1 >= 'A') && (chr1 <= 'Z')) + chr1 += ('a' - 'A'); + if ((chr2 >= 'A') && (chr2 <= 'Z')) + chr2 += ('a' - 'A'); + + if (chr1 != chr2) + return chr1 - chr2; + } + else if (chr1 == 0) + { + break; + } + } + + return 0; +} diff --git a/sdk/lib/crt/string/_strnicmp_nt.c b/sdk/lib/crt/string/_strnicmp_nt.c new file mode 100644 index 00000000000..890944b20be --- /dev/null +++ b/sdk/lib/crt/string/_strnicmp_nt.c @@ -0,0 +1,45 @@ +/* + * PROJECT: ReactOS NT CRT library + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Implementation of _strnicmp + * COPYRIGHT: Copyright 2025 Timo Kreuzer + */ + +#include + +_Check_return_ +int +__cdecl +_strnicmp( + _In_reads_or_z_(_MaxCount) char const* _String1, + _In_reads_or_z_(_MaxCount) char const* _String2, + _In_ size_t _MaxCount) +{ + char const* p1 = _String1; + char const* p2 = _String2; + size_t remaining = _MaxCount; + char chr1, chr2; + + while (remaining-- != 0) + { + chr1 = *p1++; + chr2 = *p2++; + + if (chr1 != chr2) + { + if ((chr1 >= 'A') && (chr1 <= 'Z')) + chr1 += ('a' - 'A'); + if ((chr2 >= 'A') && (chr2 <= 'Z')) + chr2 += ('a' - 'A'); + + if (chr1 != chr2) + return chr1 - chr2; + } + else if (chr1 == 0) + { + break; + } + } + + return 0; +} diff --git a/sdk/lib/crt/string/string.cmake b/sdk/lib/crt/string/string.cmake index 105231205a5..e239ea1f8e5 100644 --- a/sdk/lib/crt/string/string.cmake +++ b/sdk/lib/crt/string/string.cmake @@ -6,8 +6,6 @@ list(APPEND LIBCNTPR_STRING_SOURCE string/is_wctype.c string/scanf.c string/strcspn.c - string/stricmp.c - string/strnicmp.c string/strlwr.c string/strrev.c string/strset.c @@ -95,8 +93,10 @@ list(APPEND CRT_STRING_SOURCE string/strcoll.c string/strdup.c string/strerror.c + string/stricmp.c string/string.c string/strncoll.c + string/strnicmp.c string/strtod.c string/strtok.c string/strtok_s.c @@ -111,6 +111,8 @@ list(APPEND CRT_STRING_ASM_SOURCE ) list(APPEND LIBCNTPR_STRING_SOURCE + string/_stricmp_nt.c + string/_strnicmp_nt.c string/iswctype_nt.c string/mbstowcs_nt.c string/tolower_nt.c