Add an extended variant of OBJ_bsearch() that can be given a few
flags.
This commit is contained in:
parent
eec7968f18
commit
ea5240a5ed
15
CHANGES
15
CHANGES
@ -4,6 +4,21 @@
|
||||
|
||||
Changes between 0.9.7a and 0.9.8 [xx XXX xxxx]
|
||||
|
||||
*) Add the function OBJ_bsearch_ex() which works like OBJ_bsearch() but
|
||||
takes an extra flags argument for optional functionality. Currently,
|
||||
the following flags are defined:
|
||||
|
||||
OBJ_BSEARCH_VALUE_ON_NOMATCH
|
||||
This one gets OBJ_bsearch_ex() to return a pointer to the first
|
||||
element where the comparing function returns a negative or zero
|
||||
number.
|
||||
|
||||
OBJ_BSEARCH_FIRST_VALUE_ON_MATCH
|
||||
This one gets OBJ_bsearch_ex() to return a pointer to the first
|
||||
element where the comparing function returns zero. This is useful
|
||||
if there are more than one element where the comparing function
|
||||
returns zero.
|
||||
|
||||
*) Make it possible to create self-signed certificates with 'openssl ca'
|
||||
in such a way that the self-signed certificate becomes part of the
|
||||
CA database and uses the same mechanisms for serial number generation
|
||||
|
@ -556,8 +556,14 @@ static int obj_cmp(const void *ap, const void *bp)
|
||||
const char *OBJ_bsearch(const char *key, const char *base, int num, int size,
|
||||
int (*cmp)(const void *, const void *))
|
||||
{
|
||||
return OBJ_bsearch_ex(key, base, num, size, cmp, 0);
|
||||
}
|
||||
|
||||
const char *OBJ_bsearch_ex(const char *key, const char *base, int num,
|
||||
int size, int (*cmp)(const void *, const void *), int flags)
|
||||
{
|
||||
int l,h,i,c;
|
||||
const char *p;
|
||||
const char *p = NULL;
|
||||
|
||||
if (num == 0) return(NULL);
|
||||
l=0;
|
||||
@ -572,20 +578,33 @@ const char *OBJ_bsearch(const char *key, const char *base, int num, int size,
|
||||
else if (c > 0)
|
||||
l=i+1;
|
||||
else
|
||||
return(p);
|
||||
break;
|
||||
}
|
||||
#ifdef CHARSET_EBCDIC
|
||||
/* THIS IS A KLUDGE - Because the *_obj is sorted in ASCII order, and
|
||||
* I don't have perl (yet), we revert to a *LINEAR* search
|
||||
* when the object wasn't found in the binary search.
|
||||
*/
|
||||
for (i=0; i<num; ++i) {
|
||||
p= &(base[i*size]);
|
||||
if ((*cmp)(key,p) == 0)
|
||||
return p;
|
||||
}
|
||||
if (c != 0)
|
||||
{
|
||||
for (i=0; i<num; ++i)
|
||||
{
|
||||
p= &(base[i*size]);
|
||||
c = (*cmp)(key,p);
|
||||
if (c == 0 || (c < 0 && (flags & OBJ_BSEARCH_VALUE_ON_NOMATCH)))
|
||||
return p;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return(NULL);
|
||||
if (c != 0 && !(flags & OBJ_BSEARCH_VALUE_ON_NOMATCH))
|
||||
p = NULL;
|
||||
else if (c == 0 && (flags & OBJ_BSEARCH_FIRST_VALUE_ON_MATCH))
|
||||
{
|
||||
while(i > 0 && (*cmp)(key,&(base[(i-1)*size])) == 0)
|
||||
i--;
|
||||
p = &(base[i*size]);
|
||||
}
|
||||
return(p);
|
||||
}
|
||||
|
||||
int OBJ_create_objects(BIO *in)
|
||||
|
@ -966,7 +966,10 @@
|
||||
#define OBJ_NAME_TYPE_COMP_METH 0x04
|
||||
#define OBJ_NAME_TYPE_NUM 0x05
|
||||
|
||||
#define OBJ_NAME_ALIAS 0x8000
|
||||
#define OBJ_NAME_ALIAS 0x8000
|
||||
|
||||
#define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01
|
||||
#define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
@ -1010,6 +1013,8 @@ int OBJ_sn2nid(const char *s);
|
||||
int OBJ_cmp(const ASN1_OBJECT *a,const ASN1_OBJECT *b);
|
||||
const char * OBJ_bsearch(const char *key,const char *base,int num,int size,
|
||||
int (*cmp)(const void *, const void *));
|
||||
const char * OBJ_bsearch_ex(const char *key,const char *base,int num,
|
||||
int size, int (*cmp)(const void *, const void *), int flags);
|
||||
|
||||
int OBJ_new_nid(int num);
|
||||
int OBJ_add_object(const ASN1_OBJECT *obj);
|
||||
|
Loading…
x
Reference in New Issue
Block a user