summaryrefslogtreecommitdiffstats
path: root/crypto/stack/stack.c
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2003-04-29 20:30:55 +0000
committerRichard Levitte <levitte@openssl.org>2003-04-29 20:30:55 +0000
commit26851b6b42260bdfd5c5b8332b5d3d00fa60f3df (patch)
tree51c96a33290a9ff033a89936bbad64770edfaf0a /crypto/stack/stack.c
parentea5240a5edceccc6c6410a56b68ec4d8038da4bb (diff)
Add an extended variant of sk_find() which returns a non-NULL pointer
even if an exact match wasn't found.
Diffstat (limited to 'crypto/stack/stack.c')
-rw-r--r--crypto/stack/stack.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/crypto/stack/stack.c b/crypto/stack/stack.c
index 2496f28a8c..98a3eeee64 100644
--- a/crypto/stack/stack.c
+++ b/crypto/stack/stack.c
@@ -210,7 +210,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 +233,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(&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)