Add an extended variant of sk_find() which returns a non-NULL pointer

even if an exact match wasn't found.
This commit is contained in:
Richard Levitte
2003-04-29 20:30:55 +00:00
parent ea5240a5ed
commit 26851b6b42
4 changed files with 93 additions and 13 deletions

View File

@@ -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)