Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Openssl
提交
1e264ff3
T
Third Party Openssl
项目概览
OpenHarmony
/
Third Party Openssl
大约 1 年 前同步成功
通知
9
Star
18
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Openssl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1e264ff3
编写于
1月 29, 2000
作者:
R
Richard Levitte
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Reimplement so only one synchronous stack is used. The benefit is
that function pointers are nicely tucker in their structure.
上级
f27c5509
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
60 addition
and
79 deletion
+60
-79
crypto/objects/o_names.c
crypto/objects/o_names.c
+60
-79
未找到文件。
crypto/objects/o_names.c
浏览文件 @
1e264ff3
...
...
@@ -4,45 +4,25 @@
#include <openssl/lhash.h>
#include <openssl/objects.h>
union
cmp_fn_to_char_u
{
char
*
char_p
;
int
(
*
fn_p
)(
const
char
*
,
const
char
*
);
};
union
hash_fn_to_char_u
{
char
*
char_p
;
unsigned
long
(
*
fn_p
)(
const
char
*
);
};
union
int_fn_to_char_u
{
char
*
char_p
;
int
(
*
fn_p
)();
};
union
ulong_fn_to_char_u
{
char
*
char_p
;
unsigned
long
(
*
fn_p
)();
};
union
void_fn_to_char_u
{
char
*
char_p
;
void
(
*
fn_p
)();
};
#include <openssl/safestack.h>
/* I use the ex_data stuff to manage the identifiers for the obj_name_types
* that applications may define. I only really use the free function field.
*/
static
LHASH
*
names_lh
=
NULL
;
static
int
names_type_num
=
OBJ_NAME_TYPE_NUM
;
static
STACK
*
names_cmp
=
NULL
;
static
STACK
*
names_hash
=
NULL
;
static
STACK
*
names_free
=
NULL
;
typedef
struct
name_funcs_st
{
unsigned
long
(
*
hash_func
)();
int
(
*
cmp_func
)();
void
(
*
free_func
)();
}
NAME_FUNCS
;
DECLARE_STACK_OF
(
NAME_FUNCS
)
IMPLEMENT_STACK_OF
(
NAME_FUNCS
)
STACK_OF
(
NAME_FUNCS
)
*
name_funcs_stack
;
static
unsigned
long
obj_name_hash
(
OBJ_NAME
*
a
);
static
int
obj_name_cmp
(
OBJ_NAME
*
a
,
OBJ_NAME
*
b
);
...
...
@@ -61,62 +41,57 @@ int OBJ_NAME_new_index(unsigned long (*hash_func)(), int (*cmp_func)(),
{
int
ret
;
int
i
;
union
ulong_fn_to_char_u
tmp_hash_func
;
union
int_fn_to_char_u
tmp_cmp_func
;
union
void_fn_to_char_u
tmp_free_func
;
union
cmp_fn_to_char_u
tmp_strcmp
;
union
hash_fn_to_char_u
tmp_lh_strhash
;
tmp_hash_func
.
fn_p
=
hash_func
;
tmp_cmp_func
.
fn_p
=
cmp_func
;
tmp_free_func
.
fn_p
=
free_func
;
tmp_strcmp
.
fn_p
=
(
int
(
*
)(
const
char
*
,
const
char
*
))
strcmp
;
tmp_lh_strhash
.
fn_p
=
lh_strhash
;
if
(
names_free
==
NULL
)
NAME_FUNCS
*
name_funcs
;
if
(
name_funcs_stack
==
NULL
)
{
MemCheck_off
();
names_hash
=
sk_new_null
();
names_cmp
=
sk_new_null
();
names_free
=
sk_new_null
();
name_funcs_stack
=
sk_NAME_FUNCS_new_null
();
MemCheck_on
();
}
if
((
name
s_free
==
NULL
)
||
(
names_hash
==
NULL
)
||
(
names_cmp
==
NULL
))
if
((
name
_funcs_stack
==
NULL
))
{
/* ERROR */
return
(
0
);
}
ret
=
names_type_num
;
names_type_num
++
;
for
(
i
=
sk_
num
(
names_free
);
i
<
names_type_num
;
i
++
)
for
(
i
=
sk_
NAME_FUNCS_num
(
name_funcs_stack
);
i
<
names_type_num
;
i
++
)
{
MemCheck_off
();
sk_push
(
names_hash
,
tmp_strcmp
.
char_p
);
sk_push
(
names_cmp
,
tmp_lh_strhash
.
char_p
);
sk_push
(
names_free
,
NULL
);
name_funcs
=
Malloc
(
sizeof
(
NAME_FUNCS
));
name_funcs
->
hash_func
=
lh_strhash
;
name_funcs
->
cmp_func
=
strcmp
;
name_funcs
->
free_func
=
0
;
/* NULL is often declared to
* ((void *)0), which according
* to Compaq C is not really
* compatible with a function
* pointer. -- Richard Levitte*/
sk_NAME_FUNCS_push
(
name_funcs_stack
,
name_funcs
);
MemCheck_on
();
}
name_funcs
=
sk_NAME_FUNCS_value
(
name_funcs_stack
,
ret
);
if
(
hash_func
!=
NULL
)
sk_set
(
names_hash
,
ret
,
tmp_hash_func
.
char_p
)
;
name_funcs
->
hash_func
=
hash_func
;
if
(
cmp_func
!=
NULL
)
sk_set
(
names_cmp
,
ret
,
tmp_cmp_func
.
char_p
)
;
name_funcs
->
cmp_func
=
cmp_func
;
if
(
free_func
!=
NULL
)
sk_set
(
names_free
,
ret
,
tmp_free_func
.
char_p
)
;
name_funcs
->
free_func
=
free_func
;
return
(
ret
);
}
static
int
obj_name_cmp
(
OBJ_NAME
*
a
,
OBJ_NAME
*
b
)
{
int
ret
;
union
int_fn_to_char_u
cmp
;
ret
=
a
->
type
-
b
->
type
;
if
(
ret
==
0
)
{
if
((
names_cmp
!=
NULL
)
&&
(
sk_num
(
names_cmp
)
>
a
->
type
))
if
((
name_funcs_stack
!=
NULL
)
&&
(
sk_NAME_FUNCS_num
(
name_funcs_stack
)
>
a
->
type
))
{
cmp
.
char_p
=
sk_value
(
names_cmp
,
a
->
type
);
ret
=
cmp
.
fn_p
(
a
->
name
,
b
->
name
);
ret
=
sk_NAME_FUNCS_value
(
name_funcs_stack
,
a
->
type
)
->
cmp_func
(
a
->
name
,
b
->
name
);
}
else
ret
=
strcmp
(
a
->
name
,
b
->
name
);
...
...
@@ -127,12 +102,11 @@ static int obj_name_cmp(OBJ_NAME *a, OBJ_NAME *b)
static
unsigned
long
obj_name_hash
(
OBJ_NAME
*
a
)
{
unsigned
long
ret
;
union
ulong_fn_to_char_u
hash
;
if
((
name
s_hash
!=
NULL
)
&&
(
sk_num
(
names_hash
)
>
a
->
type
))
if
((
name
_funcs_stack
!=
NULL
)
&&
(
sk_NAME_FUNCS_num
(
name_funcs_stack
)
>
a
->
type
))
{
hash
.
char_p
=
sk_value
(
names_hash
,
a
->
type
);
ret
=
hash
.
fn_p
(
a
->
name
);
ret
=
sk_NAME_FUNCS_value
(
name_funcs_stack
,
a
->
type
)
->
hash_func
(
a
->
name
);
}
else
{
...
...
@@ -174,7 +148,6 @@ const char *OBJ_NAME_get(const char *name, int type)
int
OBJ_NAME_add
(
const
char
*
name
,
int
type
,
const
char
*
data
)
{
union
void_fn_to_char_u
f
;
OBJ_NAME
*
onp
,
*
ret
;
int
alias
;
...
...
@@ -199,10 +172,14 @@ int OBJ_NAME_add(const char *name, int type, const char *data)
if
(
ret
!=
NULL
)
{
/* free things */
if
((
name
s_free
!=
NULL
)
&&
(
sk_num
(
names_free
)
>
ret
->
type
))
if
((
name
_funcs_stack
!=
NULL
)
&&
(
sk_NAME_FUNCS_num
(
name_funcs_stack
)
>
ret
->
type
))
{
f
.
char_p
=
sk_value
(
names_free
,
ret
->
type
);
f
.
fn_p
(
ret
->
name
,
ret
->
type
,
ret
->
data
);
/* XXX: I'm not sure I understand why the free
* function should get three arguments...
* -- Richard Levitte
*/
sk_NAME_FUNCS_value
(
name_funcs_stack
,
ret
->
type
)
->
free_func
(
ret
->
name
,
ret
->
type
,
ret
->
data
);
}
Free
((
char
*
)
ret
);
}
...
...
@@ -220,7 +197,6 @@ int OBJ_NAME_add(const char *name, int type, const char *data)
int
OBJ_NAME_remove
(
const
char
*
name
,
int
type
)
{
OBJ_NAME
on
,
*
ret
;
union
void_fn_to_char_u
f
;
if
(
names_lh
==
NULL
)
return
(
0
);
...
...
@@ -231,10 +207,14 @@ int OBJ_NAME_remove(const char *name, int type)
if
(
ret
!=
NULL
)
{
/* free things */
if
((
name
s_free
!=
NULL
)
&&
(
sk_num
(
names_free
)
>
type
))
if
((
name
_funcs_stack
!=
NULL
)
&&
(
sk_NAME_FUNCS_num
(
name_funcs_stack
)
>
ret
->
type
))
{
f
.
char_p
=
sk_value
(
names_free
,
type
);
f
.
fn_p
(
ret
->
name
,
ret
->
type
,
ret
->
data
);
/* XXX: I'm not sure I understand why the free
* function should get three arguments...
* -- Richard Levitte
*/
sk_NAME_FUNCS_value
(
name_funcs_stack
,
ret
->
type
)
->
free_func
(
ret
->
name
,
ret
->
type
,
ret
->
data
);
}
Free
((
char
*
)
ret
);
return
(
1
);
...
...
@@ -256,6 +236,11 @@ static void names_lh_free(OBJ_NAME *onp, int type)
}
}
static
void
name_funcs_free
(
NAME_FUNCS
*
ptr
)
{
Free
(
ptr
);
}
void
OBJ_NAME_cleanup
(
int
type
)
{
unsigned
long
down_load
;
...
...
@@ -270,13 +255,9 @@ void OBJ_NAME_cleanup(int type)
if
(
type
<
0
)
{
lh_free
(
names_lh
);
sk_free
(
names_hash
);
sk_free
(
names_cmp
);
sk_free
(
names_free
);
sk_NAME_FUNCS_pop_free
(
name_funcs_stack
,
name_funcs_free
);
names_lh
=
NULL
;
names_hash
=
NULL
;
names_cmp
=
NULL
;
names_free
=
NULL
;
name_funcs_stack
=
NULL
;
}
else
names_lh
->
down_load
=
down_load
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录