Commit 26851b6b authored by Richard Levitte's avatar Richard Levitte
Browse files

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

even if an exact match wasn't found.
parent ea5240a5
Loading
Loading
Loading
Loading
+78 −0

File changed.

Preview size limit exceeded, changes collapsed.

+13 −13
Original line number Diff line number Diff line
@@ -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)
+1 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ int sk_insert(STACK *sk,char *data,int where);
char *sk_delete(STACK *st,int loc);
char *sk_delete_ptr(STACK *st, char *p);
int sk_find(STACK *st,char *data);
int sk_find_ex(STACK *st,char *data);
int sk_push(STACK *st,char *data);
int sk_unshift(STACK *st,char *data);
char *sk_shift(STACK *st);
+1 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ while(<IN>) {
#define sk_${type_thing}_push(st, val) SKM_sk_push($type_thing, (st), (val))
#define sk_${type_thing}_unshift(st, val) SKM_sk_unshift($type_thing, (st), (val))
#define sk_${type_thing}_find(st, val) SKM_sk_find($type_thing, (st), (val))
#define sk_${type_thing}_find_ex(st, val) SKM_sk_find_ex($type_thing, (st), (val))
#define sk_${type_thing}_delete(st, i) SKM_sk_delete($type_thing, (st), (i))
#define sk_${type_thing}_delete_ptr(st, ptr) SKM_sk_delete_ptr($type_thing, (st), (ptr))
#define sk_${type_thing}_insert(st, val, i) SKM_sk_insert($type_thing, (st), (val), (i))