提交 ea5240a5 编写于 作者: R Richard Levitte

Add an extended variant of OBJ_bsearch() that can be given a few

flags.
上级 eec7968f
...@@ -4,6 +4,21 @@ ...@@ -4,6 +4,21 @@
Changes between 0.9.7a and 0.9.8 [xx XXX xxxx] 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' *) Make it possible to create self-signed certificates with 'openssl ca'
in such a way that the self-signed certificate becomes part of the in such a way that the self-signed certificate becomes part of the
CA database and uses the same mechanisms for serial number generation 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) ...@@ -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, const char *OBJ_bsearch(const char *key, const char *base, int num, int size,
int (*cmp)(const void *, const void *)) 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; int l,h,i,c;
const char *p; const char *p = NULL;
if (num == 0) return(NULL); if (num == 0) return(NULL);
l=0; l=0;
...@@ -572,20 +578,33 @@ const char *OBJ_bsearch(const char *key, const char *base, int num, int size, ...@@ -572,20 +578,33 @@ const char *OBJ_bsearch(const char *key, const char *base, int num, int size,
else if (c > 0) else if (c > 0)
l=i+1; l=i+1;
else else
return(p); break;
} }
#ifdef CHARSET_EBCDIC #ifdef CHARSET_EBCDIC
/* THIS IS A KLUDGE - Because the *_obj is sorted in ASCII order, and /* 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 * I don't have perl (yet), we revert to a *LINEAR* search
* when the object wasn't found in the binary search. * when the object wasn't found in the binary search.
*/ */
for (i=0; i<num; ++i) { if (c != 0)
p= &(base[i*size]); {
if ((*cmp)(key,p) == 0) for (i=0; i<num; ++i)
return p; {
} p= &(base[i*size]);
c = (*cmp)(key,p);
if (c == 0 || (c < 0 && (flags & OBJ_BSEARCH_VALUE_ON_NOMATCH)))
return p;
}
}
#endif #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) int OBJ_create_objects(BIO *in)
......
...@@ -966,7 +966,10 @@ ...@@ -966,7 +966,10 @@
#define OBJ_NAME_TYPE_COMP_METH 0x04 #define OBJ_NAME_TYPE_COMP_METH 0x04
#define OBJ_NAME_TYPE_NUM 0x05 #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 #ifdef __cplusplus
...@@ -1010,6 +1013,8 @@ int OBJ_sn2nid(const char *s); ...@@ -1010,6 +1013,8 @@ int OBJ_sn2nid(const char *s);
int OBJ_cmp(const ASN1_OBJECT *a,const ASN1_OBJECT *b); 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, const char * OBJ_bsearch(const char *key,const char *base,int num,int size,
int (*cmp)(const void *, const void *)); 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_new_nid(int num);
int OBJ_add_object(const ASN1_OBJECT *obj); int OBJ_add_object(const ASN1_OBJECT *obj);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册