Commit 66d884f0 authored by Viktor Dukhovni's avatar Viktor Dukhovni
Browse files

Implement sk_deep_copy.

parent 29edebe9
Loading
Loading
Loading
Loading
+100 −6

File changed.

Preview size limit exceeded, changes collapsed.

+37 −0
Original line number Diff line number Diff line
@@ -112,6 +112,43 @@ err:
	return(NULL);
	}

_STACK *sk_deep_copy(_STACK *sk, void *(*copy_func)(void *),
			 void (*free_func)(void *))
	{
	_STACK *ret;
	int i;

	if ((ret = OPENSSL_malloc(sizeof(_STACK))) == NULL)
		return ret;
	ret->comp = sk->comp;
	ret->sorted = sk->sorted;
	ret->num = sk->num;
	ret->num_alloc = sk->num > MIN_NODES ? sk->num : MIN_NODES;
	ret->data = OPENSSL_malloc(sizeof(char *) * ret->num_alloc);
	if (ret->data == NULL)
		{
		OPENSSL_free(ret);
		return NULL;
		}
	for (i = 0; i < ret->num_alloc; i++)
		ret->data[i] = NULL;

	for (i = 0; i < ret->num; ++i)
		{
		if (sk->data[i] == NULL)
			continue;
		if ((ret->data[i] = copy_func(sk->data[i])) == NULL)
			{
			while (--i >= 0)
				if (ret->data[i] != NULL)
					free_func(ret->data[i]);
			sk_free(ret);
			return NULL;
			}
		}
	return ret;
	}

_STACK *sk_new_null(void)
	{
	return sk_new((int (*)(const void *, const void *))0);
+1 −0
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ _STACK *sk_new(int (*cmp)(const void *, const void *));
_STACK *sk_new_null(void);
void sk_free(_STACK *);
void sk_pop_free(_STACK *st, void (*func)(void *));
_STACK *sk_deep_copy(_STACK *, void *(*)(void *), void (*)(void *));
int sk_insert(_STACK *sk, void *data, int where);
void *sk_delete(_STACK *st, int loc);
void *sk_delete_ptr(_STACK *st, void *p);
+3 −1
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ while(<IN>) {
#define sk_${type_thing}_set_cmp_func(st, cmp) SKM_sk_set_cmp_func($type_thing, (st), (cmp))
#define sk_${type_thing}_dup(st) SKM_sk_dup($type_thing, st)
#define sk_${type_thing}_pop_free(st, free_func) SKM_sk_pop_free($type_thing, (st), (free_func))
#define sk_${type_thing}_deep_copy(st, copy_func, free_func) SKM_sk_deep_copy($type_thing, (st), (copy_func), (free_func))
#define sk_${type_thing}_shift(st) SKM_sk_shift($type_thing, (st))
#define sk_${type_thing}_pop(st) SKM_sk_pop($type_thing, (st))
#define sk_${type_thing}_sort(st) SKM_sk_sort($type_thing, (st))
@@ -108,7 +109,8 @@ EOF
#define sk_${t1}_find(st, val) sk_find(CHECKED_STACK_OF($t1, st), CHECKED_PTR_OF($t2, val))
#define sk_${t1}_value(st, i) (($t1)sk_value(CHECKED_STACK_OF($t1, st), i))
#define sk_${t1}_num(st) SKM_sk_num($t1, st)
#define sk_${t1}_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF($t1, st), CHECKED_SK_FREE_FUNC2($t1, free_func))
#define sk_${t1}_pop_free(st, free_func) sk_pop_free(CHECKED_STACK_OF($t1, st), CHECKED_SK_FREE_FUNC($t2, free_func))
#define sk_${t1}_deep_copy(st, copy_func, free_func) ((STACK_OF($t1) *)sk_deep_copy(CHECKED_STACK_OF($t1, st), CHECKED_SK_COPY_FUNC($t2, copy_func), CHECKED_SK_FREE_FUNC($t2, free_func)))
#define sk_${t1}_insert(st, val, i) sk_insert(CHECKED_STACK_OF($t1, st), CHECKED_PTR_OF($t2, val), i)
#define sk_${t1}_free(st) SKM_sk_free(${t1}, st)
#define sk_${t1}_set(st, i, val) sk_set(CHECKED_STACK_OF($t1, st), i, CHECKED_PTR_OF($t2, val))