Alexandre Julliard : ntdll: Add bsearch_s.

Alexandre Julliard julliard at winehq.org
Fri Jul 1 14:01:02 CDT 2022


Module: wine
Branch: master
Commit: 5b36a00b4dc8ae90edd1f9590ccb85cb8226338d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5b36a00b4dc8ae90edd1f9590ccb85cb8226338d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jul  1 16:15:12 2022 +0200

ntdll: Add bsearch_s.

Implementation copied from msvcrt.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/misc.c     | 22 ++++++++++++++++++----
 dlls/ntdll/ntdll.spec |  1 +
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/dlls/ntdll/misc.c b/dlls/ntdll/misc.c
index ab89ccb39d6..d4371166869 100644
--- a/dlls/ntdll/misc.c
+++ b/dlls/ntdll/misc.c
@@ -179,18 +179,21 @@ void __cdecl qsort( void *base, size_t nmemb, size_t size,
 
 
 /*********************************************************************
- *                  bsearch   (NTDLL.@)
+ *                  bsearch_s   (NTDLL.@)
  */
-void * __cdecl bsearch( const void *key, const void *base, size_t nmemb,
-                        size_t size, int (__cdecl *compar)(const void *, const void *) )
+void * __cdecl bsearch_s( const void *key, const void *base, size_t nmemb, size_t size,
+                          int (__cdecl *compare)(void *, const void *, const void *), void *ctx )
 {
     ssize_t min = 0;
     ssize_t max = nmemb - 1;
 
+    if (!size) return NULL;
+    if (!compare) return NULL;
+
     while (min <= max)
     {
         ssize_t cursor = min + (max - min) / 2;
-        int ret = compar(key,(const char *)base+(cursor*size));
+        int ret = compare(ctx, key,(const char *)base+(cursor*size));
         if (!ret)
             return (char*)base+(cursor*size);
         if (ret < 0)
@@ -202,6 +205,17 @@ void * __cdecl bsearch( const void *key, const void *base, size_t nmemb,
 }
 
 
+/*********************************************************************
+ *                  bsearch   (NTDLL.@)
+ */
+void * __cdecl bsearch( const void *key, const void *base, size_t nmemb,
+                        size_t size, int (__cdecl *compar)(const void *, const void *) )
+{
+    return bsearch_s( key, base, nmemb, size, compare_wrapper, compar );
+}
+
+
+
 /*********************************************************************
  *                  _lfind   (NTDLL.@)
  */
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index c10ca903190..26dd6c33879 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1566,6 +1566,7 @@
 @ cdecl atoi(str)
 @ cdecl atol(str)
 @ cdecl bsearch(ptr ptr long long ptr)
+@ cdecl bsearch_s(ptr ptr long long ptr ptr)
 @ cdecl ceil(double)
 @ cdecl cos(double)
 @ cdecl fabs(double)




More information about the wine-cvs mailing list