Include objects.h to get a correct declaration of OBJ_bsearch_ex(),
[openssl.git] / crypto / stack / stack.c
index 2496f28a8c01b0faaf36d8355495ce249aa2855c..1d2b47ee678d3caa25d9275fb5d5247c337ec50a 100644 (file)
@@ -68,6 +68,7 @@
 #include <stdio.h>
 #include "cryptlib.h"
 #include <openssl/stack.h>
+#include <openssl/objects.h>
 
 #undef MIN_NODES
 #define MIN_NODES      4
@@ -210,7 +211,7 @@ char *sk_delete(STACK *st, int loc)
        return(ret);
        }
 
-int sk_find(STACK *st, char *data)
+static int internal_find(STACK *st, char *data, int ret_val_options)
        {
        char **r;
        int i;
@@ -233,19 +234,19 @@ int sk_find(STACK *st, char *data)
         * not (type *) pointers, but the *pointers* to (type *) pointers,
         * so we get our extra level of pointer dereferencing that way. */
        comp_func=(int (*)(const void *,const void *))(st->comp);
-       r=(char **)bsearch(&data,(char *)st->data,
-               st->num,sizeof(char *), comp_func);
+       r=(char **)OBJ_bsearch_ex((char *)&data,(char *)st->data,
+               st->num,sizeof(char *),comp_func,ret_val_options);
        if (r == NULL) return(-1);
-       i=(int)(r-st->data);
-       for ( ; i>0; i--)
-               /* This needs a cast because the type being pointed to from
-                * the "&" expressions are (char *) rather than (const char *).
-                * For an explanation, read:
-                * http://www.eskimo.com/~scs/C-faq/q11.10.html :-) */
-               if ((*st->comp)((const char * const *)&(st->data[i-1]),
-                               (const char * const *)&data) < 0)
-                       break;
-       return(i);
+       return((int)(r-st->data));
+       }
+
+int sk_find(STACK *st, char *data)
+       {
+       return internal_find(st, data, OBJ_BSEARCH_FIRST_VALUE_ON_MATCH);
+       }
+int sk_find_ex(STACK *st, char *data)
+       {
+       return internal_find(st, data, OBJ_BSEARCH_VALUE_ON_NOMATCH);
        }
 
 int sk_push(STACK *st, char *data)