- {
- if (names_lh != NULL) return(1);
- MemCheck_off();
- names_lh=lh_new(obj_name_hash,obj_name_cmp);
- MemCheck_on();
- return(names_lh != NULL);
- }
-
-int OBJ_NAME_new_index(unsigned long (*hash_func)(), int (*cmp_func)(),
- void (*free_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)
- {
- MemCheck_off();
- names_hash=sk_new_null();
- names_cmp=sk_new_null();
- names_free=sk_new_null();
- MemCheck_on();
- }
- if ((names_free == NULL) || (names_hash == NULL) || (names_cmp == NULL))
- {
- /* ERROR */
- return(0);
- }
- ret=names_type_num;
- names_type_num++;
- for (i=sk_num(names_free); 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);
- MemCheck_on();
- }
- if (hash_func != NULL)
- sk_set(names_hash,ret,tmp_hash_func.char_p);
- if (cmp_func != NULL)
- sk_set(names_cmp,ret,tmp_cmp_func.char_p);
- if (free_func != NULL)
- sk_set(names_free,ret,tmp_free_func.char_p);
- 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))
- {
- cmp.char_p=sk_value(names_cmp,a->type);
- ret=cmp.fn_p(a->name,b->name);
- }
- else
- ret=strcmp(a->name,b->name);
- }
- return(ret);
- }
-
-static unsigned long obj_name_hash(OBJ_NAME *a)
- {
- unsigned long ret;
- union ulong_fn_to_char_u hash;
-
- if ((names_hash != NULL) && (sk_num(names_hash) > a->type))
- {
- hash.char_p=sk_value(names_hash,a->type);
- ret=hash.fn_p(a->name);
- }
- else
- {
- ret=lh_strhash(a->name);
- }
- ret^=a->type;
- return(ret);
- }
+{
+ if (names_lh != NULL)
+ return (1);
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
+ names_lh = lh_OBJ_NAME_new(obj_name_hash, obj_name_cmp);
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ return (names_lh != NULL);
+}
+
+int OBJ_NAME_new_index(unsigned long (*hash_func) (const char *),
+ int (*cmp_func) (const char *, const char *),
+ void (*free_func) (const char *, int, const char *))
+{
+ int ret;
+ int i;
+ NAME_FUNCS *name_funcs;
+
+ if (name_funcs_stack == NULL) {
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
+ name_funcs_stack = sk_NAME_FUNCS_new_null();
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ }
+ if (name_funcs_stack == NULL) {
+ /* ERROR */
+ return (0);
+ }
+ ret = names_type_num;
+ names_type_num++;
+ for (i = sk_NAME_FUNCS_num(name_funcs_stack); i < names_type_num; i++) {
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
+ name_funcs = OPENSSL_zalloc(sizeof(*name_funcs));
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ if (name_funcs == NULL) {
+ OBJerr(OBJ_F_OBJ_NAME_NEW_INDEX, ERR_R_MALLOC_FAILURE);
+ return (0);
+ }
+ name_funcs->hash_func = lh_strhash;
+ name_funcs->cmp_func = OPENSSL_strcmp;
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE);
+ sk_NAME_FUNCS_push(name_funcs_stack, name_funcs);
+ CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE);
+ }
+ name_funcs = sk_NAME_FUNCS_value(name_funcs_stack, ret);
+ if (hash_func != NULL)
+ name_funcs->hash_func = hash_func;
+ if (cmp_func != NULL)
+ name_funcs->cmp_func = cmp_func;
+ if (free_func != NULL)
+ name_funcs->free_func = free_func;
+ return (ret);
+}
+
+static int obj_name_cmp(const OBJ_NAME *a, const OBJ_NAME *b)
+{
+ int ret;
+
+ ret = a->type - b->type;
+ if (ret == 0) {
+ if ((name_funcs_stack != NULL)
+ && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) {
+ ret = sk_NAME_FUNCS_value(name_funcs_stack,
+ a->type)->cmp_func(a->name, b->name);
+ } else
+ ret = strcmp(a->name, b->name);
+ }
+ return (ret);
+}
+
+static unsigned long obj_name_hash(const OBJ_NAME *a)
+{
+ unsigned long ret;
+
+ if ((name_funcs_stack != NULL)
+ && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) {
+ ret =
+ sk_NAME_FUNCS_value(name_funcs_stack,
+ a->type)->hash_func(a->name);
+ } else {
+ ret = lh_strhash(a->name);
+ }
+ ret ^= a->type;
+ return (ret);
+}