/* crypto/stack/stack.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
#undef MIN_NODES
#define MIN_NODES 4
-char *STACK_version="STACK part of SSLeay 0.8.1b 29-Jun-1998";
+const char *STACK_version="Stack" OPENSSL_VERSION_PTEXT;
#ifndef NOPROTO
#define FP_ICC (int (*)(const void *,const void *))
#include <errno.h>
-void sk_set_cmp_func(sk,c)
-STACK *sk;
-int (*c)();
+int (*sk_set_cmp_func(STACK *sk, int (*c)()))(void)
{
+ int (*old)()=sk->comp;
+
if (sk->comp != c)
sk->sorted=0;
sk->comp=c;
+
+ return old;
}
-STACK *sk_dup(sk)
-STACK *sk;
+STACK *sk_dup(STACK *sk)
{
STACK *ret;
char **s;
return(NULL);
}
-STACK *sk_new(c)
-int (*c)();
+STACK *sk_new(int (*c)())
{
STACK *ret;
int i;
return(NULL);
}
-int sk_insert(st,data,loc)
-STACK *st;
-char *data;
-int loc;
+int sk_insert(STACK *st, char *data, int loc)
{
char **s;
f=(char **)st->data;
t=(char **)&(st->data[1]);
- for (i=st->num; i>loc; i--)
+ for (i=st->num; i>=loc; i--)
t[i]=f[i];
#ifdef undef /* no memmove on sunos :-( */
return(st->num);
}
-char *sk_delete_ptr(st,p)
-STACK *st;
-char *p;
+char *sk_delete_ptr(STACK *st, char *p)
{
int i;
return(NULL);
}
-char *sk_delete(st,loc)
-STACK *st;
-int loc;
+char *sk_delete(STACK *st, int loc)
{
char *ret;
+ int i,j;
if ((st->num == 0) || (loc < 0) || (loc >= st->num)) return(NULL);
ret=st->data[loc];
if (loc != st->num-1)
- memcpy( &(st->data[loc]),
- &(st->data[loc+1]),
- sizeof(char *)*(st->num-loc-1));
+ {
+ j=st->num-1;
+ for (i=loc; i<j; i++)
+ st->data[i]=st->data[i+1];
+ /* In theory memcpy is not safe for this
+ * memcpy( &(st->data[loc]),
+ * &(st->data[loc+1]),
+ * sizeof(char *)*(st->num-loc-1));
+ */
+ }
st->num--;
return(ret);
}
-int sk_find(st,data)
-STACK *st;
-char *data;
+int sk_find(STACK *st, char *data)
{
char **r;
int i;
return(i);
}
-int sk_push(st,data)
-STACK *st;
-char *data;
+int sk_push(STACK *st, char *data)
{
return(sk_insert(st,data,st->num));
}
-int sk_unshift(st,data)
-STACK *st;
-char *data;
+int sk_unshift(STACK *st, char *data)
{
return(sk_insert(st,data,0));
}
-char *sk_shift(st)
-STACK *st;
+char *sk_shift(STACK *st)
{
if (st == NULL) return(NULL);
if (st->num <= 0) return(NULL);
return(sk_delete(st,0));
}
-char *sk_pop(st)
-STACK *st;
+char *sk_pop(STACK *st)
{
if (st == NULL) return(NULL);
if (st->num <= 0) return(NULL);
return(sk_delete(st,st->num-1));
}
-void sk_zero(st)
-STACK *st;
+void sk_zero(STACK *st)
{
if (st == NULL) return;
if (st->num <= 0) return;
st->num=0;
}
-void sk_pop_free(st,func)
-STACK *st;
-void (*func)();
+void sk_pop_free(STACK *st, void (*func)())
{
int i;
sk_free(st);
}
-void sk_free(st)
-STACK *st;
+void sk_free(STACK *st)
{
if (st == NULL) return;
if (st->data != NULL) Free((char *)st->data);