* [including the GNU Public Licence.]
*/
-char *lh_version="lhash part of SSLeay 0.9.0b 29-Jun-1998";
-
/* Code for dynamic hash table routines
* Author - Eric Young v 2.0
*
+ * 2.2 eay - added #include "crypto.h" so the memory leak checking code is
+ * present. eay 18-Jun-98
+ *
+ * 2.1 eay - Added an 'error in last operation' flag. eay 6-May-98
+ *
* 2.0 eay - Fixed a bug that occured when using lh_delete
* from inside lh_doall(). As entries were deleted,
* the 'table' was 'contract()ed', making some entries
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-#include "lhash.h"
+#include <openssl/crypto.h>
+#include <openssl/lhash.h>
+
+const char *lh_version="lhash" OPENSSL_VERSION_PTEXT;
#undef MIN_NODES
#define MIN_NODES 16
#define UP_LOAD (2*LH_LOAD_MULT) /* load times 256 (default 2) */
#define DOWN_LOAD (LH_LOAD_MULT) /* load times 256 (default 1) */
-#ifndef NOPROTO
-
-#define P_CP char *
-#define P_CPP char *,char *
static void expand(LHASH *lh);
static void contract(LHASH *lh);
-static LHASH_NODE **getrn(LHASH *lh, char *data, unsigned long *rhash);
-
-#else
+static LHASH_NODE **getrn(LHASH *lh, void *data, unsigned long *rhash);
-#define P_CP
-#define P_CPP
-static void expand();
-static void contract();
-static LHASH_NODE **getrn();
-
-#endif
-
-LHASH *lh_new(h, c)
-unsigned long (*h)();
-int (*c)();
+LHASH *lh_new(unsigned long (*h)(), int (*c)())
{
LHASH *ret;
int i;
- if ((ret=(LHASH *)malloc(sizeof(LHASH))) == NULL)
+ if ((ret=(LHASH *)Malloc(sizeof(LHASH))) == NULL)
goto err0;
- if ((ret->b=(LHASH_NODE **)malloc(sizeof(LHASH_NODE *)*MIN_NODES)) == NULL)
+ if ((ret->b=(LHASH_NODE **)Malloc(sizeof(LHASH_NODE *)*MIN_NODES)) == NULL)
goto err1;
for (i=0; i<MIN_NODES; i++)
ret->b[i]=NULL;
ret->num_retrieve_miss=0;
ret->num_hash_comps=0;
+ ret->error=0;
return(ret);
err1:
- free((char *)ret);
+ Free((char *)ret);
err0:
return(NULL);
}
-void lh_free(lh)
-LHASH *lh;
+void lh_free(LHASH *lh)
{
unsigned int i;
LHASH_NODE *n,*nn;
+ if(lh == NULL)
+ return;
+
for (i=0; i<lh->num_nodes; i++)
{
n=lh->b[i];
while (n != NULL)
{
nn=n->next;
- free(n);
+ Free(n);
n=nn;
}
}
- free((char *)lh->b);
- free((char *)lh);
+ Free((char *)lh->b);
+ Free((char *)lh);
}
-char *lh_insert(lh, data)
-LHASH *lh;
-char *data;
+void *lh_insert(LHASH *lh, void *data)
{
unsigned long hash;
LHASH_NODE *nn,**rn;
- char *ret;
+ void *ret;
+ lh->error=0;
if (lh->up_load <= (lh->num_items*LH_LOAD_MULT/lh->num_nodes))
expand(lh);
if (*rn == NULL)
{
- if ((nn=(LHASH_NODE *)malloc(sizeof(LHASH_NODE))) == NULL)
+ if ((nn=(LHASH_NODE *)Malloc(sizeof(LHASH_NODE))) == NULL)
+ {
+ lh->error++;
return(NULL);
+ }
nn->data=data;
nn->next=NULL;
#ifndef NO_HASH_COMP
return(ret);
}
-char *lh_delete(lh, data)
-LHASH *lh;
-char *data;
+void *lh_delete(LHASH *lh, void *data)
{
unsigned long hash;
LHASH_NODE *nn,**rn;
- char *ret;
+ void *ret;
+ lh->error=0;
rn=getrn(lh,data,&hash);
if (*rn == NULL)
nn= *rn;
*rn=nn->next;
ret=nn->data;
- free((char *)nn);
+ Free((char *)nn);
lh->num_delete++;
}
return(ret);
}
-char *lh_retrieve(lh, data)
-LHASH *lh;
-char *data;
+void *lh_retrieve(LHASH *lh, void *data)
{
unsigned long hash;
LHASH_NODE **rn;
- char *ret;
+ void *ret;
+ lh->error=0;
rn=getrn(lh,data,&hash);
if (*rn == NULL)
return(ret);
}
-void lh_doall(lh, func)
-LHASH *lh;
-void (*func)();
+void lh_doall(LHASH *lh, void (*func)())
{
lh_doall_arg(lh,func,NULL);
}
-void lh_doall_arg(lh, func, arg)
-LHASH *lh;
-void (*func)();
-char *arg;
+void lh_doall_arg(LHASH *lh, void (*func)(), void *arg)
{
int i;
LHASH_NODE *a,*n;
}
}
-static void expand(lh)
-LHASH *lh;
+static void expand(LHASH *lh)
{
LHASH_NODE **n,**n1,**n2,*np;
unsigned int p,i,j;
if ((lh->p) >= lh->pmax)
{
j=(int)lh->num_alloc_nodes*2;
- n=(LHASH_NODE **)realloc((char *)lh->b,
+ n=(LHASH_NODE **)Realloc(lh->b,
(unsigned int)sizeof(LHASH_NODE *)*j);
if (n == NULL)
{
/* fputs("realloc error in lhash",stderr); */
+ lh->error++;
lh->p=0;
return;
}
}
}
-static void contract(lh)
-LHASH *lh;
+static void contract(LHASH *lh)
{
LHASH_NODE **n,*n1,*np;
lh->b[lh->p+lh->pmax-1]=NULL; /* 24/07-92 - eay - weird but :-( */
if (lh->p == 0)
{
- n=(LHASH_NODE **)realloc((char *)lh->b,
+ n=(LHASH_NODE **)Realloc(lh->b,
(unsigned int)(sizeof(LHASH_NODE *)*lh->pmax));
if (n == NULL)
{
/* fputs("realloc error in lhash",stderr); */
+ lh->error++;
return;
}
lh->num_contract_reallocs++;
}
}
-static LHASH_NODE **getrn(lh, data, rhash)
-LHASH *lh;
-char *data;
-unsigned long *rhash;
+static LHASH_NODE **getrn(LHASH *lh, void *data, unsigned long *rhash)
{
LHASH_NODE **ret,*n1;
unsigned long hash,nn;
}
/*
-static unsigned long lh_strhash(str)
-char *str;
+unsigned long lh_strhash(char *str)
{
int i,l;
unsigned long ret=0;
* no collisions on /usr/dict/words and it distributes on %2^n quite
* well, not as good as MD5, but still good.
*/
-unsigned long lh_strhash(c)
-char *c;
+unsigned long lh_strhash(const char *c)
{
unsigned long ret=0;
long n;