* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
- *
+ *
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
+ *
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
+ * 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
+ *
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
#ifdef OPENSSL_NO_BIO
-void lh_stats(LHASH *lh, FILE *out)
- {
- fprintf(out,"num_items = %lu\n",lh->num_items);
- fprintf(out,"num_nodes = %u\n",lh->num_nodes);
- fprintf(out,"num_alloc_nodes = %u\n",lh->num_alloc_nodes);
- fprintf(out,"num_expands = %lu\n",lh->num_expands);
- fprintf(out,"num_expand_reallocs = %lu\n",lh->num_expand_reallocs);
- fprintf(out,"num_contracts = %lu\n",lh->num_contracts);
- fprintf(out,"num_contract_reallocs = %lu\n",lh->num_contract_reallocs);
- fprintf(out,"num_hash_calls = %lu\n",lh->num_hash_calls);
- fprintf(out,"num_comp_calls = %lu\n",lh->num_comp_calls);
- fprintf(out,"num_insert = %lu\n",lh->num_insert);
- fprintf(out,"num_replace = %lu\n",lh->num_replace);
- fprintf(out,"num_delete = %lu\n",lh->num_delete);
- fprintf(out,"num_no_delete = %lu\n",lh->num_no_delete);
- fprintf(out,"num_retrieve = %lu\n",lh->num_retrieve);
- fprintf(out,"num_retrieve_miss = %lu\n",lh->num_retrieve_miss);
- fprintf(out,"num_hash_comps = %lu\n",lh->num_hash_comps);
+void
+lh_stats(LHASH *lh, FILE *out)
+{
+ fprintf(out, "num_items = %lu\n", lh->num_items);
+ fprintf(out, "num_nodes = %u\n", lh->num_nodes);
+ fprintf(out, "num_alloc_nodes = %u\n", lh->num_alloc_nodes);
+ fprintf(out, "num_expands = %lu\n", lh->num_expands);
+ fprintf(out, "num_expand_reallocs = %lu\n", lh->num_expand_reallocs);
+ fprintf(out, "num_contracts = %lu\n", lh->num_contracts);
+ fprintf(out, "num_contract_reallocs = %lu\n",
+ lh->num_contract_reallocs);
+ fprintf(out, "num_hash_calls = %lu\n", lh->num_hash_calls);
+ fprintf(out, "num_comp_calls = %lu\n", lh->num_comp_calls);
+ fprintf(out, "num_insert = %lu\n", lh->num_insert);
+ fprintf(out, "num_replace = %lu\n", lh->num_replace);
+ fprintf(out, "num_delete = %lu\n", lh->num_delete);
+ fprintf(out, "num_no_delete = %lu\n", lh->num_no_delete);
+ fprintf(out, "num_retrieve = %lu\n", lh->num_retrieve);
+ fprintf(out, "num_retrieve_miss = %lu\n", lh->num_retrieve_miss);
+ fprintf(out, "num_hash_comps = %lu\n", lh->num_hash_comps);
#if 0
- fprintf(out,"p = %u\n",lh->p);
- fprintf(out,"pmax = %u\n",lh->pmax);
- fprintf(out,"up_load = %lu\n",lh->up_load);
- fprintf(out,"down_load = %lu\n",lh->down_load);
+ fprintf(out, "p = %u\n", lh->p);
+ fprintf(out, "pmax = %u\n", lh->pmax);
+ fprintf(out, "up_load = %lu\n", lh->up_load);
+ fprintf(out, "down_load = %lu\n", lh->down_load);
#endif
- }
+}
-void lh_node_stats(LHASH *lh, FILE *out)
- {
+void
+lh_node_stats(LHASH *lh, FILE *out)
+{
LHASH_NODE *n;
- unsigned int i,num;
+ unsigned int i, num;
- for (i=0; i<lh->num_nodes; i++)
- {
- for (n=lh->b[i],num=0; n != NULL; n=n->next)
+ for (i = 0; i < lh->num_nodes; i++) {
+ for (n = lh->b[i], num = 0; n != NULL; n = n->next)
num++;
- fprintf(out,"node %6u -> %3u\n",i,num);
- }
+ fprintf(out, "node %6u -> %3u\n", i, num);
}
+}
-void lh_node_usage_stats(LHASH *lh, FILE *out)
- {
+void
+lh_node_usage_stats(LHASH *lh, FILE *out)
+{
LHASH_NODE *n;
unsigned long num;
unsigned int i;
- unsigned long total=0,n_used=0;
+ unsigned long total = 0, n_used = 0;
- for (i=0; i<lh->num_nodes; i++)
- {
- for (n=lh->b[i],num=0; n != NULL; n=n->next)
+ for (i = 0; i < lh->num_nodes; i++) {
+ for (n = lh->b[i], num = 0; n != NULL; n = n->next)
num++;
- if (num != 0)
- {
+ if (num != 0) {
n_used++;
- total+=num;
- }
+ total += num;
}
- fprintf(out,"%lu nodes used out of %u\n",n_used,lh->num_nodes);
- fprintf(out,"%lu items\n",total);
- if (n_used == 0) return;
- fprintf(out,"load %d.%02d actual load %d.%02d\n",
- (int)(total/lh->num_nodes),
- (int)((total%lh->num_nodes)*100/lh->num_nodes),
- (int)(total/n_used),
- (int)((total%n_used)*100/n_used));
}
+ fprintf(out, "%lu nodes used out of %u\n", n_used, lh->num_nodes);
+ fprintf(out, "%lu items\n", total);
+ if (n_used == 0)
+ return;
+ fprintf(out, "load %d.%02d actual load %d.%02d\n",
+ (int)(total / lh->num_nodes),
+ (int)((total % lh->num_nodes) * 100 / lh->num_nodes),
+ (int)(total / n_used),
+ (int)((total % n_used) * 100 / n_used));
+}
#else
#ifndef OPENSSL_NO_FP_API
-void lh_stats(const _LHASH *lh, FILE *fp)
- {
+void
+lh_stats(const _LHASH *lh, FILE *fp)
+{
BIO *bp;
- bp=BIO_new(BIO_s_file());
- if (bp == NULL) goto end;
- BIO_set_fp(bp,fp,BIO_NOCLOSE);
- lh_stats_bio(lh,bp);
+ bp = BIO_new(BIO_s_file());
+ if (bp == NULL)
+ goto end;
+ BIO_set_fp(bp, fp, BIO_NOCLOSE);
+ lh_stats_bio(lh, bp);
BIO_free(bp);
end:;
- }
+}
-void lh_node_stats(const _LHASH *lh, FILE *fp)
- {
+void
+lh_node_stats(const _LHASH *lh, FILE *fp)
+{
BIO *bp;
- bp=BIO_new(BIO_s_file());
- if (bp == NULL) goto end;
- BIO_set_fp(bp,fp,BIO_NOCLOSE);
- lh_node_stats_bio(lh,bp);
+ bp = BIO_new(BIO_s_file());
+ if (bp == NULL)
+ goto end;
+ BIO_set_fp(bp, fp, BIO_NOCLOSE);
+ lh_node_stats_bio(lh, bp);
BIO_free(bp);
end:;
- }
+}
-void lh_node_usage_stats(const _LHASH *lh, FILE *fp)
- {
+void
+lh_node_usage_stats(const _LHASH *lh, FILE *fp)
+{
BIO *bp;
- bp=BIO_new(BIO_s_file());
- if (bp == NULL) goto end;
- BIO_set_fp(bp,fp,BIO_NOCLOSE);
- lh_node_usage_stats_bio(lh,bp);
+ bp = BIO_new(BIO_s_file());
+ if (bp == NULL)
+ goto end;
+ BIO_set_fp(bp, fp, BIO_NOCLOSE);
+ lh_node_usage_stats_bio(lh, bp);
BIO_free(bp);
end:;
- }
+}
#endif
-void lh_stats_bio(const _LHASH *lh, BIO *out)
- {
- BIO_printf(out,"num_items = %lu\n",lh->num_items);
- BIO_printf(out,"num_nodes = %u\n",lh->num_nodes);
- BIO_printf(out,"num_alloc_nodes = %u\n",lh->num_alloc_nodes);
- BIO_printf(out,"num_expands = %lu\n",lh->num_expands);
- BIO_printf(out,"num_expand_reallocs = %lu\n",
- lh->num_expand_reallocs);
- BIO_printf(out,"num_contracts = %lu\n",lh->num_contracts);
- BIO_printf(out,"num_contract_reallocs = %lu\n",
- lh->num_contract_reallocs);
- BIO_printf(out,"num_hash_calls = %lu\n",lh->num_hash_calls);
- BIO_printf(out,"num_comp_calls = %lu\n",lh->num_comp_calls);
- BIO_printf(out,"num_insert = %lu\n",lh->num_insert);
- BIO_printf(out,"num_replace = %lu\n",lh->num_replace);
- BIO_printf(out,"num_delete = %lu\n",lh->num_delete);
- BIO_printf(out,"num_no_delete = %lu\n",lh->num_no_delete);
- BIO_printf(out,"num_retrieve = %lu\n",lh->num_retrieve);
- BIO_printf(out,"num_retrieve_miss = %lu\n",lh->num_retrieve_miss);
- BIO_printf(out,"num_hash_comps = %lu\n",lh->num_hash_comps);
+void
+lh_stats_bio(const _LHASH *lh, BIO *out)
+{
+ BIO_printf(out, "num_items = %lu\n", lh->num_items);
+ BIO_printf(out, "num_nodes = %u\n", lh->num_nodes);
+ BIO_printf(out, "num_alloc_nodes = %u\n", lh->num_alloc_nodes);
+ BIO_printf(out, "num_expands = %lu\n", lh->num_expands);
+ BIO_printf(out, "num_expand_reallocs = %lu\n",
+ lh->num_expand_reallocs);
+ BIO_printf(out, "num_contracts = %lu\n", lh->num_contracts);
+ BIO_printf(out, "num_contract_reallocs = %lu\n",
+ lh->num_contract_reallocs);
+ BIO_printf(out, "num_hash_calls = %lu\n", lh->num_hash_calls);
+ BIO_printf(out, "num_comp_calls = %lu\n", lh->num_comp_calls);
+ BIO_printf(out, "num_insert = %lu\n", lh->num_insert);
+ BIO_printf(out, "num_replace = %lu\n", lh->num_replace);
+ BIO_printf(out, "num_delete = %lu\n", lh->num_delete);
+ BIO_printf(out, "num_no_delete = %lu\n", lh->num_no_delete);
+ BIO_printf(out, "num_retrieve = %lu\n", lh->num_retrieve);
+ BIO_printf(out, "num_retrieve_miss = %lu\n", lh->num_retrieve_miss);
+ BIO_printf(out, "num_hash_comps = %lu\n", lh->num_hash_comps);
#if 0
- BIO_printf(out,"p = %u\n",lh->p);
- BIO_printf(out,"pmax = %u\n",lh->pmax);
- BIO_printf(out,"up_load = %lu\n",lh->up_load);
- BIO_printf(out,"down_load = %lu\n",lh->down_load);
+ BIO_printf(out, "p = %u\n", lh->p);
+ BIO_printf(out, "pmax = %u\n", lh->pmax);
+ BIO_printf(out, "up_load = %lu\n", lh->up_load);
+ BIO_printf(out, "down_load = %lu\n", lh->down_load);
#endif
- }
+}
-void lh_node_stats_bio(const _LHASH *lh, BIO *out)
- {
+void
+lh_node_stats_bio(const _LHASH *lh, BIO *out)
+{
LHASH_NODE *n;
- unsigned int i,num;
+ unsigned int i, num;
- for (i=0; i<lh->num_nodes; i++)
- {
- for (n=lh->b[i],num=0; n != NULL; n=n->next)
+ for (i = 0; i < lh->num_nodes; i++) {
+ for (n = lh->b[i], num = 0; n != NULL; n = n->next)
num++;
- BIO_printf(out,"node %6u -> %3u\n",i,num);
- }
+ BIO_printf(out, "node %6u -> %3u\n", i, num);
}
+}
-void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out)
- {
+void
+lh_node_usage_stats_bio(const _LHASH *lh, BIO *out)
+{
LHASH_NODE *n;
unsigned long num;
unsigned int i;
- unsigned long total=0,n_used=0;
+ unsigned long total = 0, n_used = 0;
- for (i=0; i<lh->num_nodes; i++)
- {
- for (n=lh->b[i],num=0; n != NULL; n=n->next)
+ for (i = 0; i < lh->num_nodes; i++) {
+ for (n = lh->b[i], num = 0; n != NULL; n = n->next)
num++;
- if (num != 0)
- {
+ if (num != 0) {
n_used++;
- total+=num;
- }
+ total += num;
}
- BIO_printf(out,"%lu nodes used out of %u\n",n_used,lh->num_nodes);
- BIO_printf(out,"%lu items\n",total);
- if (n_used == 0) return;
- BIO_printf(out,"load %d.%02d actual load %d.%02d\n",
- (int)(total/lh->num_nodes),
- (int)((total%lh->num_nodes)*100/lh->num_nodes),
- (int)(total/n_used),
- (int)((total%n_used)*100/n_used));
}
+ BIO_printf(out, "%lu nodes used out of %u\n", n_used, lh->num_nodes);
+ BIO_printf(out, "%lu items\n", total);
+ if (n_used == 0)
+ return;
+ BIO_printf(out, "load %d.%02d actual load %d.%02d\n",
+ (int)(total / lh->num_nodes),
+ (int)((total % lh->num_nodes) * 100 / lh->num_nodes),
+ (int)(total / n_used),
+ (int)((total % n_used) * 100 / n_used));
+}
#endif
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
- *
+ *
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
+ *
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
+ * 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
+ *
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
#include <openssl/lhash.h>
main()
- {
+{
LHASH *conf;
char buf[256];
int i;
- conf=lh_new(lh_strhash,strcmp);
- for (;;)
- {
+ conf = lh_new(lh_strhash, strcmp);
+ for (;;) {
char *p;
- buf[0]='\0';
- fgets(buf,256,stdin);
- if (buf[0] == '\0') break;
- i=strlen(buf);
- p=malloc(i+1);
- memcpy(p,buf,i+1);
- lh_insert(conf,p);
- }
+ buf[0] = '\0';
+ fgets(buf, 256, stdin);
+ if (buf[0] == '\0')
+ break;
+ i = strlen(buf);
+ p = malloc(i + 1);
+ memcpy(p, buf, i + 1);
+ lh_insert(conf, p);
+ }
- lh_node_stats(conf,stdout);
- lh_stats(conf,stdout);
- lh_node_usage_stats(conf,stdout);
+ lh_node_stats(conf, stdout);
+ lh_stats(conf, stdout);
+ lh_node_usage_stats(conf, stdout);
exit(0);
- }
+}
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
- *
+ *
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
+ *
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
+ * 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
+ *
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
#include <openssl/crypto.h>
#include <openssl/lhash.h>
-const char lh_version[]="lhash" OPENSSL_VERSION_PTEXT;
+const char lh_version[] = "lhash" OPENSSL_VERSION_PTEXT;
-#undef MIN_NODES
+#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) */
static void contract(_LHASH *lh);
static LHASH_NODE **getrn(_LHASH *lh, const void *data, unsigned long *rhash);
-_LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c)
- {
+_LHASH *
+lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c)
+{
_LHASH *ret;
int i;
- if ((ret=malloc(sizeof(_LHASH))) == NULL)
+ if ((ret = malloc(sizeof(_LHASH))) == NULL)
goto err0;
- if ((ret->b=malloc(sizeof(LHASH_NODE *)*MIN_NODES)) == NULL)
+ if ((ret->b = malloc(sizeof(LHASH_NODE *) * MIN_NODES)) == NULL)
goto err1;
- for (i=0; i<MIN_NODES; i++)
- ret->b[i]=NULL;
- ret->comp=((c == NULL)?(LHASH_COMP_FN_TYPE)strcmp:c);
- ret->hash=((h == NULL)?(LHASH_HASH_FN_TYPE)lh_strhash:h);
- ret->num_nodes=MIN_NODES/2;
- ret->num_alloc_nodes=MIN_NODES;
- ret->p=0;
- ret->pmax=MIN_NODES/2;
- ret->up_load=UP_LOAD;
- ret->down_load=DOWN_LOAD;
- ret->num_items=0;
-
- ret->num_expands=0;
- ret->num_expand_reallocs=0;
- ret->num_contracts=0;
- ret->num_contract_reallocs=0;
- ret->num_hash_calls=0;
- ret->num_comp_calls=0;
- ret->num_insert=0;
- ret->num_replace=0;
- ret->num_delete=0;
- ret->num_no_delete=0;
- ret->num_retrieve=0;
- ret->num_retrieve_miss=0;
- ret->num_hash_comps=0;
-
- ret->error=0;
- return(ret);
+ for (i = 0; i < MIN_NODES; i++)
+ ret->b[i] = NULL;
+ ret->comp = ((c == NULL) ? (LHASH_COMP_FN_TYPE)strcmp : c);
+ ret->hash = ((h == NULL) ? (LHASH_HASH_FN_TYPE)lh_strhash : h);
+ ret->num_nodes = MIN_NODES / 2;
+ ret->num_alloc_nodes = MIN_NODES;
+ ret->p = 0;
+ ret->pmax = MIN_NODES / 2;
+ ret->up_load = UP_LOAD;
+ ret->down_load = DOWN_LOAD;
+ ret->num_items = 0;
+
+ ret->num_expands = 0;
+ ret->num_expand_reallocs = 0;
+ ret->num_contracts = 0;
+ ret->num_contract_reallocs = 0;
+ ret->num_hash_calls = 0;
+ ret->num_comp_calls = 0;
+ ret->num_insert = 0;
+ ret->num_replace = 0;
+ ret->num_delete = 0;
+ ret->num_no_delete = 0;
+ ret->num_retrieve = 0;
+ ret->num_retrieve_miss = 0;
+ ret->num_hash_comps = 0;
+
+ ret->error = 0;
+ return (ret);
+
err1:
free(ret);
err0:
- return(NULL);
- }
+ return (NULL);
+}
-void lh_free(_LHASH *lh)
- {
+void
+lh_free(_LHASH *lh)
+{
unsigned int i;
- LHASH_NODE *n,*nn;
+ 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;
+ return;
+
+ for (i = 0; i < lh->num_nodes; i++) {
+ n = lh->b[i];
+ while (n != NULL) {
+ nn = n->next;
free(n);
- n=nn;
- }
+ n = nn;
}
+ }
free(lh->b);
free(lh);
- }
+}
-void *lh_insert(_LHASH *lh, void *data)
- {
+void *
+lh_insert(_LHASH *lh, void *data)
+{
unsigned long hash;
- LHASH_NODE *nn,**rn;
+ LHASH_NODE *nn, **rn;
void *ret;
- lh->error=0;
- if (lh->up_load <= (lh->num_items*LH_LOAD_MULT/lh->num_nodes))
+ lh->error = 0;
+ if (lh->up_load <= (lh->num_items * LH_LOAD_MULT / lh->num_nodes))
expand(lh);
- rn=getrn(lh,data,&hash);
+ rn = getrn(lh, data, &hash);
- if (*rn == NULL)
- {
- if ((nn=(LHASH_NODE *)malloc(sizeof(LHASH_NODE))) == NULL)
- {
+ if (*rn == NULL) {
+ if ((nn = (LHASH_NODE *)malloc(sizeof(LHASH_NODE))) == NULL) {
lh->error++;
- return(NULL);
- }
- nn->data=data;
- nn->next=NULL;
+ return (NULL);
+ }
+ nn->data = data;
+ nn->next = NULL;
#ifndef OPENSSL_NO_HASH_COMP
- nn->hash=hash;
+ nn->hash = hash;
#endif
- *rn=nn;
- ret=NULL;
+ *rn = nn;
+ ret = NULL;
lh->num_insert++;
lh->num_items++;
- }
+ }
else /* replace same key */
- {
- ret= (*rn)->data;
- (*rn)->data=data;
+ {
+ ret = (*rn)->data;
+ (*rn)->data = data;
lh->num_replace++;
- }
- return(ret);
}
+ return (ret);
+}
-void *lh_delete(_LHASH *lh, const void *data)
- {
+void *
+lh_delete(_LHASH *lh, const void *data)
+{
unsigned long hash;
- LHASH_NODE *nn,**rn;
+ LHASH_NODE *nn, **rn;
void *ret;
- lh->error=0;
- rn=getrn(lh,data,&hash);
+ lh->error = 0;
+ rn = getrn(lh, data, &hash);
- if (*rn == NULL)
- {
+ if (*rn == NULL) {
lh->num_no_delete++;
- return(NULL);
- }
- else
- {
+ return (NULL);
+ } else {
nn= *rn;
- *rn=nn->next;
- ret=nn->data;
+ *rn = nn->next;
+ ret = nn->data;
free(nn);
lh->num_delete++;
- }
+ }
lh->num_items--;
if ((lh->num_nodes > MIN_NODES) &&
- (lh->down_load >= (lh->num_items*LH_LOAD_MULT/lh->num_nodes)))
+ (lh->down_load >= (lh->num_items * LH_LOAD_MULT / lh->num_nodes)))
contract(lh);
- return(ret);
- }
+ return (ret);
+}
-void *lh_retrieve(_LHASH *lh, const void *data)
- {
+void *
+lh_retrieve(_LHASH *lh, const void *data)
+{
unsigned long hash;
LHASH_NODE **rn;
void *ret;
- lh->error=0;
- rn=getrn(lh,data,&hash);
+ lh->error = 0;
+ rn = getrn(lh, data, &hash);
- if (*rn == NULL)
- {
+ if (*rn == NULL) {
lh->num_retrieve_miss++;
- return(NULL);
- }
- else
- {
- ret= (*rn)->data;
+ return (NULL);
+ } else {
+ ret = (*rn)->data;
lh->num_retrieve++;
- }
- return(ret);
}
+ return (ret);
+}
-static void doall_util_fn(_LHASH *lh, int use_arg, LHASH_DOALL_FN_TYPE func,
- LHASH_DOALL_ARG_FN_TYPE func_arg, void *arg)
- {
+static void
+doall_util_fn(_LHASH *lh, int use_arg, LHASH_DOALL_FN_TYPE func,
+ LHASH_DOALL_ARG_FN_TYPE func_arg, void *arg)
+{
int i;
- LHASH_NODE *a,*n;
+ LHASH_NODE *a, *n;
if (lh == NULL)
return;
/* reverse the order so we search from 'top to bottom'
* We were having memory leaks otherwise */
- for (i=lh->num_nodes-1; i>=0; i--)
- {
- a=lh->b[i];
- while (a != NULL)
- {
+ for (i = lh->num_nodes - 1; i >= 0; i--) {
+ a = lh->b[i];
+ while (a != NULL) {
/* 28/05/91 - eay - n added so items can be deleted
* via lh_doall */
/* 22/05/08 - ben - eh? since a is not passed,
* this should not be needed */
- n=a->next;
- if(use_arg)
- func_arg(a->data,arg);
+ n = a->next;
+ if (use_arg)
+ func_arg(a->data, arg);
else
func(a->data);
- a=n;
- }
+ a = n;
}
}
+}
-void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func)
- {
+void
+lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func)
+{
doall_util_fn(lh, 0, func, (LHASH_DOALL_ARG_FN_TYPE)0, NULL);
- }
+}
-void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg)
- {
+void
+lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg)
+{
doall_util_fn(lh, 1, (LHASH_DOALL_FN_TYPE)0, func, arg);
- }
+}
-static void expand(_LHASH *lh)
- {
- LHASH_NODE **n,**n1,**n2,*np;
- unsigned int p,i,j;
- unsigned long hash,nni;
+static void
+expand(_LHASH *lh)
+{
+ LHASH_NODE **n, **n1, **n2, *np;
+ unsigned int p, i, j;
+ unsigned long hash, nni;
lh->num_nodes++;
lh->num_expands++;
- p=(int)lh->p++;
- n1= &(lh->b[p]);
- n2= &(lh->b[p+(int)lh->pmax]);
- *n2=NULL; /* 27/07/92 - eay - undefined pointer bug */
- nni=lh->num_alloc_nodes;
-
- for (np= *n1; np != NULL; )
- {
+ p = (int)lh->p++;
+ n1 = &(lh->b[p]);
+ n2 = &(lh->b[p + (int)lh->pmax]);
+ *n2 = NULL; /* 27/07/92 - eay - undefined pointer bug */
+ nni = lh->num_alloc_nodes;
+
+ for (np = *n1; np != NULL; ) {
#ifndef OPENSSL_NO_HASH_COMP
- hash=np->hash;
+ hash = np->hash;
#else
- hash=lh->hash(np->data);
+ hash = lh->hash(np->data);
lh->num_hash_calls++;
#endif
- if ((hash%nni) != p)
- { /* move it */
- *n1= (*n1)->next;
+ if ((hash % nni) != p) { /* move it */
+ *n1 = (*n1)->next;
np->next= *n2;
- *n2=np;
- }
- else
- n1= &((*n1)->next);
+ *n2 = np;
+ } else
+ n1 = &((*n1)->next);
np= *n1;
- }
+ }
- if ((lh->p) >= lh->pmax)
- {
- j=(int)lh->num_alloc_nodes*2;
- n=(LHASH_NODE **)realloc(lh->b,
- (int)(sizeof(LHASH_NODE *)*j));
- if (n == NULL)
- {
-/* fputs("realloc error in lhash",stderr); */
+ if ((lh->p) >= lh->pmax) {
+ j = (int)lh->num_alloc_nodes * 2;
+ n = (LHASH_NODE **)realloc(lh->b,
+ (int)(sizeof(LHASH_NODE *) * j));
+ if (n == NULL) {
+/* fputs("realloc error in lhash", stderr); */
lh->error++;
- lh->p=0;
+ lh->p = 0;
return;
- }
+ }
/* else */
- for (i=(int)lh->num_alloc_nodes; i<j; i++)/* 26/02/92 eay */
- n[i]=NULL; /* 02/03/92 eay */
- lh->pmax=lh->num_alloc_nodes;
- lh->num_alloc_nodes=j;
+ for (i = (int)lh->num_alloc_nodes; i < j; i++)/* 26/02/92 eay */
+ n[i] = NULL; /* 02/03/92 eay */
+ lh->pmax = lh->num_alloc_nodes;
+ lh->num_alloc_nodes = j;
lh->num_expand_reallocs++;
- lh->p=0;
- lh->b=n;
- }
+ lh->p = 0;
+ lh->b = n;
}
-
-static void contract(_LHASH *lh)
- {
- LHASH_NODE **n,*n1,*np;
-
- np=lh->b[lh->p+lh->pmax-1];
- lh->b[lh->p+lh->pmax-1]=NULL; /* 24/07-92 - eay - weird but :-( */
- if (lh->p == 0)
- {
- n=(LHASH_NODE **)realloc(lh->b,
- (unsigned int)(sizeof(LHASH_NODE *)*lh->pmax));
- if (n == NULL)
- {
-/* fputs("realloc error in lhash",stderr); */
+}
+
+static void
+contract(_LHASH *lh)
+{
+ LHASH_NODE **n, *n1, *np;
+
+ np = lh->b[lh->p + lh->pmax - 1];
+ lh->b[lh->p+lh->pmax - 1] = NULL; /* 24/07-92 - eay - weird but :-( */
+ if (lh->p == 0) {
+ 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++;
- lh->num_alloc_nodes/=2;
- lh->pmax/=2;
- lh->p=lh->pmax-1;
- lh->b=n;
}
- else
+ lh->num_contract_reallocs++;
+ lh->num_alloc_nodes /= 2;
+ lh->pmax /= 2;
+ lh->p = lh->pmax - 1;
+ lh->b = n;
+ } else
lh->p--;
lh->num_nodes--;
lh->num_contracts++;
- n1=lh->b[(int)lh->p];
+ n1 = lh->b[(int)lh->p];
if (n1 == NULL)
- lh->b[(int)lh->p]=np;
- else
- {
+ lh->b[(int)lh->p] = np;
+ else {
while (n1->next != NULL)
- n1=n1->next;
- n1->next=np;
- }
+ n1 = n1->next;
+ n1->next = np;
}
+}
static LHASH_NODE **getrn(_LHASH *lh, const void *data, unsigned long *rhash)
- {
- LHASH_NODE **ret,*n1;
- unsigned long hash,nn;
+{
+ LHASH_NODE **ret, *n1;
+ unsigned long hash, nn;
LHASH_COMP_FN_TYPE cf;
- hash=(*(lh->hash))(data);
+ hash = (*(lh->hash))(data);
lh->num_hash_calls++;
- *rhash=hash;
+ *rhash = hash;
- nn=hash%lh->pmax;
+ nn = hash % lh->pmax;
if (nn < lh->p)
- nn=hash%lh->num_alloc_nodes;
+ nn = hash % lh->num_alloc_nodes;
- cf=lh->comp;
- ret= &(lh->b[(int)nn]);
- for (n1= *ret; n1 != NULL; n1=n1->next)
- {
+ cf = lh->comp;
+ ret = &(lh->b[(int)nn]);
+ for (n1 = *ret; n1 != NULL; n1 = n1->next) {
#ifndef OPENSSL_NO_HASH_COMP
lh->num_hash_comps++;
- if (n1->hash != hash)
- {
- ret= &(n1->next);
+ if (n1->hash != hash) {
+ ret = &(n1->next);
continue;
- }
+ }
#endif
lh->num_comp_calls++;
- if(cf(n1->data,data) == 0)
+ if (cf(n1->data, data) == 0)
break;
- ret= &(n1->next);
- }
- return(ret);
+ ret = &(n1->next);
}
+ return (ret);
+}
/* The following hash seems to work very well on normal text strings
* 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(const char *c)
- {
- unsigned long ret=0;
+unsigned long
+lh_strhash(const char *c)
+{
+ unsigned long ret = 0;
long n;
unsigned long v;
int r;
if ((c == NULL) || (*c == '\0'))
- return(ret);
+ return (ret);
/*
unsigned char b[16];
MD5(c,strlen(c),b);
- return(b[0]|(b[1]<<8)|(b[2]<<16)|(b[3]<<24));
+ return(b[0]|(b[1]<<8)|(b[2]<<16)|(b[3]<<24));
*/
- n=0x100;
- while (*c)
- {
- v=n|(*c);
- n+=0x100;
- r= (int)((v>>2)^v)&0x0f;
- ret=(ret<<r)|(ret>>(32-r));
- ret&=0xFFFFFFFFL;
- ret^=v*v;
+ n = 0x100;
+ while (*c) {
+ v = n | (*c);
+ n += 0x100;
+ r = (int)((v >> 2) ^ v) & 0x0f;
+ ret = (ret << r)|(ret >> (32 - r));
+ ret &= 0xFFFFFFFFL;
+ ret ^= v * v;
c++;
- }
- return((ret>>16)^ret);
}
+ return ((ret >> 16) ^ ret);
+}
-unsigned long lh_num_items(const _LHASH *lh)
- {
+unsigned long
+lh_num_items(const _LHASH *lh)
+{
return lh ? lh->num_items : 0;
- }
+}
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
- *
+ *
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
+ *
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
+ * 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
+ *
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
extern "C" {
#endif
-typedef struct lhash_node_st
- {
+typedef struct lhash_node_st {
void *data;
struct lhash_node_st *next;
#ifndef OPENSSL_NO_HASH_COMP
unsigned long hash;
#endif
- } LHASH_NODE;
+} LHASH_NODE;
typedef int (*LHASH_COMP_FN_TYPE)(const void *, const void *);
typedef unsigned long (*LHASH_HASH_FN_TYPE)(const void *);
name##_doall_arg(a, b); }
#define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG
-typedef struct lhash_st
- {
+typedef struct lhash_st {
LHASH_NODE **b;
LHASH_COMP_FN_TYPE comp;
LHASH_HASH_FN_TYPE hash;
unsigned long num_hash_comps;
int error;
- } _LHASH; /* Do not use _LHASH directly, use LHASH_OF
- * and friends */
+} _LHASH; /* Do not use _LHASH directly, use LHASH_OF
+ * and friends */
#define LH_LOAD_MULT 256
#endif
#endif
-
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
- *
+ *
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
+ *
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
+ * 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
+ *
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
#ifdef OPENSSL_NO_BIO
-void lh_stats(LHASH *lh, FILE *out)
- {
- fprintf(out,"num_items = %lu\n",lh->num_items);
- fprintf(out,"num_nodes = %u\n",lh->num_nodes);
- fprintf(out,"num_alloc_nodes = %u\n",lh->num_alloc_nodes);
- fprintf(out,"num_expands = %lu\n",lh->num_expands);
- fprintf(out,"num_expand_reallocs = %lu\n",lh->num_expand_reallocs);
- fprintf(out,"num_contracts = %lu\n",lh->num_contracts);
- fprintf(out,"num_contract_reallocs = %lu\n",lh->num_contract_reallocs);
- fprintf(out,"num_hash_calls = %lu\n",lh->num_hash_calls);
- fprintf(out,"num_comp_calls = %lu\n",lh->num_comp_calls);
- fprintf(out,"num_insert = %lu\n",lh->num_insert);
- fprintf(out,"num_replace = %lu\n",lh->num_replace);
- fprintf(out,"num_delete = %lu\n",lh->num_delete);
- fprintf(out,"num_no_delete = %lu\n",lh->num_no_delete);
- fprintf(out,"num_retrieve = %lu\n",lh->num_retrieve);
- fprintf(out,"num_retrieve_miss = %lu\n",lh->num_retrieve_miss);
- fprintf(out,"num_hash_comps = %lu\n",lh->num_hash_comps);
+void
+lh_stats(LHASH *lh, FILE *out)
+{
+ fprintf(out, "num_items = %lu\n", lh->num_items);
+ fprintf(out, "num_nodes = %u\n", lh->num_nodes);
+ fprintf(out, "num_alloc_nodes = %u\n", lh->num_alloc_nodes);
+ fprintf(out, "num_expands = %lu\n", lh->num_expands);
+ fprintf(out, "num_expand_reallocs = %lu\n", lh->num_expand_reallocs);
+ fprintf(out, "num_contracts = %lu\n", lh->num_contracts);
+ fprintf(out, "num_contract_reallocs = %lu\n",
+ lh->num_contract_reallocs);
+ fprintf(out, "num_hash_calls = %lu\n", lh->num_hash_calls);
+ fprintf(out, "num_comp_calls = %lu\n", lh->num_comp_calls);
+ fprintf(out, "num_insert = %lu\n", lh->num_insert);
+ fprintf(out, "num_replace = %lu\n", lh->num_replace);
+ fprintf(out, "num_delete = %lu\n", lh->num_delete);
+ fprintf(out, "num_no_delete = %lu\n", lh->num_no_delete);
+ fprintf(out, "num_retrieve = %lu\n", lh->num_retrieve);
+ fprintf(out, "num_retrieve_miss = %lu\n", lh->num_retrieve_miss);
+ fprintf(out, "num_hash_comps = %lu\n", lh->num_hash_comps);
#if 0
- fprintf(out,"p = %u\n",lh->p);
- fprintf(out,"pmax = %u\n",lh->pmax);
- fprintf(out,"up_load = %lu\n",lh->up_load);
- fprintf(out,"down_load = %lu\n",lh->down_load);
+ fprintf(out, "p = %u\n", lh->p);
+ fprintf(out, "pmax = %u\n", lh->pmax);
+ fprintf(out, "up_load = %lu\n", lh->up_load);
+ fprintf(out, "down_load = %lu\n", lh->down_load);
#endif
- }
+}
-void lh_node_stats(LHASH *lh, FILE *out)
- {
+void
+lh_node_stats(LHASH *lh, FILE *out)
+{
LHASH_NODE *n;
- unsigned int i,num;
+ unsigned int i, num;
- for (i=0; i<lh->num_nodes; i++)
- {
- for (n=lh->b[i],num=0; n != NULL; n=n->next)
+ for (i = 0; i < lh->num_nodes; i++) {
+ for (n = lh->b[i], num = 0; n != NULL; n = n->next)
num++;
- fprintf(out,"node %6u -> %3u\n",i,num);
- }
+ fprintf(out, "node %6u -> %3u\n", i, num);
}
+}
-void lh_node_usage_stats(LHASH *lh, FILE *out)
- {
+void
+lh_node_usage_stats(LHASH *lh, FILE *out)
+{
LHASH_NODE *n;
unsigned long num;
unsigned int i;
- unsigned long total=0,n_used=0;
+ unsigned long total = 0, n_used = 0;
- for (i=0; i<lh->num_nodes; i++)
- {
- for (n=lh->b[i],num=0; n != NULL; n=n->next)
+ for (i = 0; i < lh->num_nodes; i++) {
+ for (n = lh->b[i], num = 0; n != NULL; n = n->next)
num++;
- if (num != 0)
- {
+ if (num != 0) {
n_used++;
- total+=num;
- }
+ total += num;
}
- fprintf(out,"%lu nodes used out of %u\n",n_used,lh->num_nodes);
- fprintf(out,"%lu items\n",total);
- if (n_used == 0) return;
- fprintf(out,"load %d.%02d actual load %d.%02d\n",
- (int)(total/lh->num_nodes),
- (int)((total%lh->num_nodes)*100/lh->num_nodes),
- (int)(total/n_used),
- (int)((total%n_used)*100/n_used));
}
+ fprintf(out, "%lu nodes used out of %u\n", n_used, lh->num_nodes);
+ fprintf(out, "%lu items\n", total);
+ if (n_used == 0)
+ return;
+ fprintf(out, "load %d.%02d actual load %d.%02d\n",
+ (int)(total / lh->num_nodes),
+ (int)((total % lh->num_nodes) * 100 / lh->num_nodes),
+ (int)(total / n_used),
+ (int)((total % n_used) * 100 / n_used));
+}
#else
#ifndef OPENSSL_NO_FP_API
-void lh_stats(const _LHASH *lh, FILE *fp)
- {
+void
+lh_stats(const _LHASH *lh, FILE *fp)
+{
BIO *bp;
- bp=BIO_new(BIO_s_file());
- if (bp == NULL) goto end;
- BIO_set_fp(bp,fp,BIO_NOCLOSE);
- lh_stats_bio(lh,bp);
+ bp = BIO_new(BIO_s_file());
+ if (bp == NULL)
+ goto end;
+ BIO_set_fp(bp, fp, BIO_NOCLOSE);
+ lh_stats_bio(lh, bp);
BIO_free(bp);
end:;
- }
+}
-void lh_node_stats(const _LHASH *lh, FILE *fp)
- {
+void
+lh_node_stats(const _LHASH *lh, FILE *fp)
+{
BIO *bp;
- bp=BIO_new(BIO_s_file());
- if (bp == NULL) goto end;
- BIO_set_fp(bp,fp,BIO_NOCLOSE);
- lh_node_stats_bio(lh,bp);
+ bp = BIO_new(BIO_s_file());
+ if (bp == NULL)
+ goto end;
+ BIO_set_fp(bp, fp, BIO_NOCLOSE);
+ lh_node_stats_bio(lh, bp);
BIO_free(bp);
end:;
- }
+}
-void lh_node_usage_stats(const _LHASH *lh, FILE *fp)
- {
+void
+lh_node_usage_stats(const _LHASH *lh, FILE *fp)
+{
BIO *bp;
- bp=BIO_new(BIO_s_file());
- if (bp == NULL) goto end;
- BIO_set_fp(bp,fp,BIO_NOCLOSE);
- lh_node_usage_stats_bio(lh,bp);
+ bp = BIO_new(BIO_s_file());
+ if (bp == NULL)
+ goto end;
+ BIO_set_fp(bp, fp, BIO_NOCLOSE);
+ lh_node_usage_stats_bio(lh, bp);
BIO_free(bp);
end:;
- }
+}
#endif
-void lh_stats_bio(const _LHASH *lh, BIO *out)
- {
- BIO_printf(out,"num_items = %lu\n",lh->num_items);
- BIO_printf(out,"num_nodes = %u\n",lh->num_nodes);
- BIO_printf(out,"num_alloc_nodes = %u\n",lh->num_alloc_nodes);
- BIO_printf(out,"num_expands = %lu\n",lh->num_expands);
- BIO_printf(out,"num_expand_reallocs = %lu\n",
- lh->num_expand_reallocs);
- BIO_printf(out,"num_contracts = %lu\n",lh->num_contracts);
- BIO_printf(out,"num_contract_reallocs = %lu\n",
- lh->num_contract_reallocs);
- BIO_printf(out,"num_hash_calls = %lu\n",lh->num_hash_calls);
- BIO_printf(out,"num_comp_calls = %lu\n",lh->num_comp_calls);
- BIO_printf(out,"num_insert = %lu\n",lh->num_insert);
- BIO_printf(out,"num_replace = %lu\n",lh->num_replace);
- BIO_printf(out,"num_delete = %lu\n",lh->num_delete);
- BIO_printf(out,"num_no_delete = %lu\n",lh->num_no_delete);
- BIO_printf(out,"num_retrieve = %lu\n",lh->num_retrieve);
- BIO_printf(out,"num_retrieve_miss = %lu\n",lh->num_retrieve_miss);
- BIO_printf(out,"num_hash_comps = %lu\n",lh->num_hash_comps);
+void
+lh_stats_bio(const _LHASH *lh, BIO *out)
+{
+ BIO_printf(out, "num_items = %lu\n", lh->num_items);
+ BIO_printf(out, "num_nodes = %u\n", lh->num_nodes);
+ BIO_printf(out, "num_alloc_nodes = %u\n", lh->num_alloc_nodes);
+ BIO_printf(out, "num_expands = %lu\n", lh->num_expands);
+ BIO_printf(out, "num_expand_reallocs = %lu\n",
+ lh->num_expand_reallocs);
+ BIO_printf(out, "num_contracts = %lu\n", lh->num_contracts);
+ BIO_printf(out, "num_contract_reallocs = %lu\n",
+ lh->num_contract_reallocs);
+ BIO_printf(out, "num_hash_calls = %lu\n", lh->num_hash_calls);
+ BIO_printf(out, "num_comp_calls = %lu\n", lh->num_comp_calls);
+ BIO_printf(out, "num_insert = %lu\n", lh->num_insert);
+ BIO_printf(out, "num_replace = %lu\n", lh->num_replace);
+ BIO_printf(out, "num_delete = %lu\n", lh->num_delete);
+ BIO_printf(out, "num_no_delete = %lu\n", lh->num_no_delete);
+ BIO_printf(out, "num_retrieve = %lu\n", lh->num_retrieve);
+ BIO_printf(out, "num_retrieve_miss = %lu\n", lh->num_retrieve_miss);
+ BIO_printf(out, "num_hash_comps = %lu\n", lh->num_hash_comps);
#if 0
- BIO_printf(out,"p = %u\n",lh->p);
- BIO_printf(out,"pmax = %u\n",lh->pmax);
- BIO_printf(out,"up_load = %lu\n",lh->up_load);
- BIO_printf(out,"down_load = %lu\n",lh->down_load);
+ BIO_printf(out, "p = %u\n", lh->p);
+ BIO_printf(out, "pmax = %u\n", lh->pmax);
+ BIO_printf(out, "up_load = %lu\n", lh->up_load);
+ BIO_printf(out, "down_load = %lu\n", lh->down_load);
#endif
- }
+}
-void lh_node_stats_bio(const _LHASH *lh, BIO *out)
- {
+void
+lh_node_stats_bio(const _LHASH *lh, BIO *out)
+{
LHASH_NODE *n;
- unsigned int i,num;
+ unsigned int i, num;
- for (i=0; i<lh->num_nodes; i++)
- {
- for (n=lh->b[i],num=0; n != NULL; n=n->next)
+ for (i = 0; i < lh->num_nodes; i++) {
+ for (n = lh->b[i], num = 0; n != NULL; n = n->next)
num++;
- BIO_printf(out,"node %6u -> %3u\n",i,num);
- }
+ BIO_printf(out, "node %6u -> %3u\n", i, num);
}
+}
-void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out)
- {
+void
+lh_node_usage_stats_bio(const _LHASH *lh, BIO *out)
+{
LHASH_NODE *n;
unsigned long num;
unsigned int i;
- unsigned long total=0,n_used=0;
+ unsigned long total = 0, n_used = 0;
- for (i=0; i<lh->num_nodes; i++)
- {
- for (n=lh->b[i],num=0; n != NULL; n=n->next)
+ for (i = 0; i < lh->num_nodes; i++) {
+ for (n = lh->b[i], num = 0; n != NULL; n = n->next)
num++;
- if (num != 0)
- {
+ if (num != 0) {
n_used++;
- total+=num;
- }
+ total += num;
}
- BIO_printf(out,"%lu nodes used out of %u\n",n_used,lh->num_nodes);
- BIO_printf(out,"%lu items\n",total);
- if (n_used == 0) return;
- BIO_printf(out,"load %d.%02d actual load %d.%02d\n",
- (int)(total/lh->num_nodes),
- (int)((total%lh->num_nodes)*100/lh->num_nodes),
- (int)(total/n_used),
- (int)((total%n_used)*100/n_used));
}
+ BIO_printf(out, "%lu nodes used out of %u\n", n_used, lh->num_nodes);
+ BIO_printf(out, "%lu items\n", total);
+ if (n_used == 0)
+ return;
+ BIO_printf(out, "load %d.%02d actual load %d.%02d\n",
+ (int)(total / lh->num_nodes),
+ (int)((total % lh->num_nodes) * 100 / lh->num_nodes),
+ (int)(total / n_used),
+ (int)((total % n_used) * 100 / n_used));
+}
#endif
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
- *
+ *
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
+ *
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
+ * 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
+ *
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
#include <openssl/lhash.h>
main()
- {
+{
LHASH *conf;
char buf[256];
int i;
- conf=lh_new(lh_strhash,strcmp);
- for (;;)
- {
+ conf = lh_new(lh_strhash, strcmp);
+ for (;;) {
char *p;
- buf[0]='\0';
- fgets(buf,256,stdin);
- if (buf[0] == '\0') break;
- i=strlen(buf);
- p=malloc(i+1);
- memcpy(p,buf,i+1);
- lh_insert(conf,p);
- }
+ buf[0] = '\0';
+ fgets(buf, 256, stdin);
+ if (buf[0] == '\0')
+ break;
+ i = strlen(buf);
+ p = malloc(i + 1);
+ memcpy(p, buf, i + 1);
+ lh_insert(conf, p);
+ }
- lh_node_stats(conf,stdout);
- lh_stats(conf,stdout);
- lh_node_usage_stats(conf,stdout);
+ lh_node_stats(conf, stdout);
+ lh_stats(conf, stdout);
+ lh_node_usage_stats(conf, stdout);
exit(0);
- }
+}
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
- *
+ *
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
+ *
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
+ * 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
+ *
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
#include <openssl/crypto.h>
#include <openssl/lhash.h>
-const char lh_version[]="lhash" OPENSSL_VERSION_PTEXT;
+const char lh_version[] = "lhash" OPENSSL_VERSION_PTEXT;
-#undef MIN_NODES
+#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) */
static void contract(_LHASH *lh);
static LHASH_NODE **getrn(_LHASH *lh, const void *data, unsigned long *rhash);
-_LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c)
- {
+_LHASH *
+lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c)
+{
_LHASH *ret;
int i;
- if ((ret=malloc(sizeof(_LHASH))) == NULL)
+ if ((ret = malloc(sizeof(_LHASH))) == NULL)
goto err0;
- if ((ret->b=malloc(sizeof(LHASH_NODE *)*MIN_NODES)) == NULL)
+ if ((ret->b = malloc(sizeof(LHASH_NODE *) * MIN_NODES)) == NULL)
goto err1;
- for (i=0; i<MIN_NODES; i++)
- ret->b[i]=NULL;
- ret->comp=((c == NULL)?(LHASH_COMP_FN_TYPE)strcmp:c);
- ret->hash=((h == NULL)?(LHASH_HASH_FN_TYPE)lh_strhash:h);
- ret->num_nodes=MIN_NODES/2;
- ret->num_alloc_nodes=MIN_NODES;
- ret->p=0;
- ret->pmax=MIN_NODES/2;
- ret->up_load=UP_LOAD;
- ret->down_load=DOWN_LOAD;
- ret->num_items=0;
-
- ret->num_expands=0;
- ret->num_expand_reallocs=0;
- ret->num_contracts=0;
- ret->num_contract_reallocs=0;
- ret->num_hash_calls=0;
- ret->num_comp_calls=0;
- ret->num_insert=0;
- ret->num_replace=0;
- ret->num_delete=0;
- ret->num_no_delete=0;
- ret->num_retrieve=0;
- ret->num_retrieve_miss=0;
- ret->num_hash_comps=0;
-
- ret->error=0;
- return(ret);
+ for (i = 0; i < MIN_NODES; i++)
+ ret->b[i] = NULL;
+ ret->comp = ((c == NULL) ? (LHASH_COMP_FN_TYPE)strcmp : c);
+ ret->hash = ((h == NULL) ? (LHASH_HASH_FN_TYPE)lh_strhash : h);
+ ret->num_nodes = MIN_NODES / 2;
+ ret->num_alloc_nodes = MIN_NODES;
+ ret->p = 0;
+ ret->pmax = MIN_NODES / 2;
+ ret->up_load = UP_LOAD;
+ ret->down_load = DOWN_LOAD;
+ ret->num_items = 0;
+
+ ret->num_expands = 0;
+ ret->num_expand_reallocs = 0;
+ ret->num_contracts = 0;
+ ret->num_contract_reallocs = 0;
+ ret->num_hash_calls = 0;
+ ret->num_comp_calls = 0;
+ ret->num_insert = 0;
+ ret->num_replace = 0;
+ ret->num_delete = 0;
+ ret->num_no_delete = 0;
+ ret->num_retrieve = 0;
+ ret->num_retrieve_miss = 0;
+ ret->num_hash_comps = 0;
+
+ ret->error = 0;
+ return (ret);
+
err1:
free(ret);
err0:
- return(NULL);
- }
+ return (NULL);
+}
-void lh_free(_LHASH *lh)
- {
+void
+lh_free(_LHASH *lh)
+{
unsigned int i;
- LHASH_NODE *n,*nn;
+ 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;
+ return;
+
+ for (i = 0; i < lh->num_nodes; i++) {
+ n = lh->b[i];
+ while (n != NULL) {
+ nn = n->next;
free(n);
- n=nn;
- }
+ n = nn;
}
+ }
free(lh->b);
free(lh);
- }
+}
-void *lh_insert(_LHASH *lh, void *data)
- {
+void *
+lh_insert(_LHASH *lh, void *data)
+{
unsigned long hash;
- LHASH_NODE *nn,**rn;
+ LHASH_NODE *nn, **rn;
void *ret;
- lh->error=0;
- if (lh->up_load <= (lh->num_items*LH_LOAD_MULT/lh->num_nodes))
+ lh->error = 0;
+ if (lh->up_load <= (lh->num_items * LH_LOAD_MULT / lh->num_nodes))
expand(lh);
- rn=getrn(lh,data,&hash);
+ rn = getrn(lh, data, &hash);
- if (*rn == NULL)
- {
- if ((nn=(LHASH_NODE *)malloc(sizeof(LHASH_NODE))) == NULL)
- {
+ if (*rn == NULL) {
+ if ((nn = (LHASH_NODE *)malloc(sizeof(LHASH_NODE))) == NULL) {
lh->error++;
- return(NULL);
- }
- nn->data=data;
- nn->next=NULL;
+ return (NULL);
+ }
+ nn->data = data;
+ nn->next = NULL;
#ifndef OPENSSL_NO_HASH_COMP
- nn->hash=hash;
+ nn->hash = hash;
#endif
- *rn=nn;
- ret=NULL;
+ *rn = nn;
+ ret = NULL;
lh->num_insert++;
lh->num_items++;
- }
+ }
else /* replace same key */
- {
- ret= (*rn)->data;
- (*rn)->data=data;
+ {
+ ret = (*rn)->data;
+ (*rn)->data = data;
lh->num_replace++;
- }
- return(ret);
}
+ return (ret);
+}
-void *lh_delete(_LHASH *lh, const void *data)
- {
+void *
+lh_delete(_LHASH *lh, const void *data)
+{
unsigned long hash;
- LHASH_NODE *nn,**rn;
+ LHASH_NODE *nn, **rn;
void *ret;
- lh->error=0;
- rn=getrn(lh,data,&hash);
+ lh->error = 0;
+ rn = getrn(lh, data, &hash);
- if (*rn == NULL)
- {
+ if (*rn == NULL) {
lh->num_no_delete++;
- return(NULL);
- }
- else
- {
+ return (NULL);
+ } else {
nn= *rn;
- *rn=nn->next;
- ret=nn->data;
+ *rn = nn->next;
+ ret = nn->data;
free(nn);
lh->num_delete++;
- }
+ }
lh->num_items--;
if ((lh->num_nodes > MIN_NODES) &&
- (lh->down_load >= (lh->num_items*LH_LOAD_MULT/lh->num_nodes)))
+ (lh->down_load >= (lh->num_items * LH_LOAD_MULT / lh->num_nodes)))
contract(lh);
- return(ret);
- }
+ return (ret);
+}
-void *lh_retrieve(_LHASH *lh, const void *data)
- {
+void *
+lh_retrieve(_LHASH *lh, const void *data)
+{
unsigned long hash;
LHASH_NODE **rn;
void *ret;
- lh->error=0;
- rn=getrn(lh,data,&hash);
+ lh->error = 0;
+ rn = getrn(lh, data, &hash);
- if (*rn == NULL)
- {
+ if (*rn == NULL) {
lh->num_retrieve_miss++;
- return(NULL);
- }
- else
- {
- ret= (*rn)->data;
+ return (NULL);
+ } else {
+ ret = (*rn)->data;
lh->num_retrieve++;
- }
- return(ret);
}
+ return (ret);
+}
-static void doall_util_fn(_LHASH *lh, int use_arg, LHASH_DOALL_FN_TYPE func,
- LHASH_DOALL_ARG_FN_TYPE func_arg, void *arg)
- {
+static void
+doall_util_fn(_LHASH *lh, int use_arg, LHASH_DOALL_FN_TYPE func,
+ LHASH_DOALL_ARG_FN_TYPE func_arg, void *arg)
+{
int i;
- LHASH_NODE *a,*n;
+ LHASH_NODE *a, *n;
if (lh == NULL)
return;
/* reverse the order so we search from 'top to bottom'
* We were having memory leaks otherwise */
- for (i=lh->num_nodes-1; i>=0; i--)
- {
- a=lh->b[i];
- while (a != NULL)
- {
+ for (i = lh->num_nodes - 1; i >= 0; i--) {
+ a = lh->b[i];
+ while (a != NULL) {
/* 28/05/91 - eay - n added so items can be deleted
* via lh_doall */
/* 22/05/08 - ben - eh? since a is not passed,
* this should not be needed */
- n=a->next;
- if(use_arg)
- func_arg(a->data,arg);
+ n = a->next;
+ if (use_arg)
+ func_arg(a->data, arg);
else
func(a->data);
- a=n;
- }
+ a = n;
}
}
+}
-void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func)
- {
+void
+lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func)
+{
doall_util_fn(lh, 0, func, (LHASH_DOALL_ARG_FN_TYPE)0, NULL);
- }
+}
-void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg)
- {
+void
+lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg)
+{
doall_util_fn(lh, 1, (LHASH_DOALL_FN_TYPE)0, func, arg);
- }
+}
-static void expand(_LHASH *lh)
- {
- LHASH_NODE **n,**n1,**n2,*np;
- unsigned int p,i,j;
- unsigned long hash,nni;
+static void
+expand(_LHASH *lh)
+{
+ LHASH_NODE **n, **n1, **n2, *np;
+ unsigned int p, i, j;
+ unsigned long hash, nni;
lh->num_nodes++;
lh->num_expands++;
- p=(int)lh->p++;
- n1= &(lh->b[p]);
- n2= &(lh->b[p+(int)lh->pmax]);
- *n2=NULL; /* 27/07/92 - eay - undefined pointer bug */
- nni=lh->num_alloc_nodes;
-
- for (np= *n1; np != NULL; )
- {
+ p = (int)lh->p++;
+ n1 = &(lh->b[p]);
+ n2 = &(lh->b[p + (int)lh->pmax]);
+ *n2 = NULL; /* 27/07/92 - eay - undefined pointer bug */
+ nni = lh->num_alloc_nodes;
+
+ for (np = *n1; np != NULL; ) {
#ifndef OPENSSL_NO_HASH_COMP
- hash=np->hash;
+ hash = np->hash;
#else
- hash=lh->hash(np->data);
+ hash = lh->hash(np->data);
lh->num_hash_calls++;
#endif
- if ((hash%nni) != p)
- { /* move it */
- *n1= (*n1)->next;
+ if ((hash % nni) != p) { /* move it */
+ *n1 = (*n1)->next;
np->next= *n2;
- *n2=np;
- }
- else
- n1= &((*n1)->next);
+ *n2 = np;
+ } else
+ n1 = &((*n1)->next);
np= *n1;
- }
+ }
- if ((lh->p) >= lh->pmax)
- {
- j=(int)lh->num_alloc_nodes*2;
- n=(LHASH_NODE **)realloc(lh->b,
- (int)(sizeof(LHASH_NODE *)*j));
- if (n == NULL)
- {
-/* fputs("realloc error in lhash",stderr); */
+ if ((lh->p) >= lh->pmax) {
+ j = (int)lh->num_alloc_nodes * 2;
+ n = (LHASH_NODE **)realloc(lh->b,
+ (int)(sizeof(LHASH_NODE *) * j));
+ if (n == NULL) {
+/* fputs("realloc error in lhash", stderr); */
lh->error++;
- lh->p=0;
+ lh->p = 0;
return;
- }
+ }
/* else */
- for (i=(int)lh->num_alloc_nodes; i<j; i++)/* 26/02/92 eay */
- n[i]=NULL; /* 02/03/92 eay */
- lh->pmax=lh->num_alloc_nodes;
- lh->num_alloc_nodes=j;
+ for (i = (int)lh->num_alloc_nodes; i < j; i++)/* 26/02/92 eay */
+ n[i] = NULL; /* 02/03/92 eay */
+ lh->pmax = lh->num_alloc_nodes;
+ lh->num_alloc_nodes = j;
lh->num_expand_reallocs++;
- lh->p=0;
- lh->b=n;
- }
+ lh->p = 0;
+ lh->b = n;
}
-
-static void contract(_LHASH *lh)
- {
- LHASH_NODE **n,*n1,*np;
-
- np=lh->b[lh->p+lh->pmax-1];
- lh->b[lh->p+lh->pmax-1]=NULL; /* 24/07-92 - eay - weird but :-( */
- if (lh->p == 0)
- {
- n=(LHASH_NODE **)realloc(lh->b,
- (unsigned int)(sizeof(LHASH_NODE *)*lh->pmax));
- if (n == NULL)
- {
-/* fputs("realloc error in lhash",stderr); */
+}
+
+static void
+contract(_LHASH *lh)
+{
+ LHASH_NODE **n, *n1, *np;
+
+ np = lh->b[lh->p + lh->pmax - 1];
+ lh->b[lh->p+lh->pmax - 1] = NULL; /* 24/07-92 - eay - weird but :-( */
+ if (lh->p == 0) {
+ 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++;
- lh->num_alloc_nodes/=2;
- lh->pmax/=2;
- lh->p=lh->pmax-1;
- lh->b=n;
}
- else
+ lh->num_contract_reallocs++;
+ lh->num_alloc_nodes /= 2;
+ lh->pmax /= 2;
+ lh->p = lh->pmax - 1;
+ lh->b = n;
+ } else
lh->p--;
lh->num_nodes--;
lh->num_contracts++;
- n1=lh->b[(int)lh->p];
+ n1 = lh->b[(int)lh->p];
if (n1 == NULL)
- lh->b[(int)lh->p]=np;
- else
- {
+ lh->b[(int)lh->p] = np;
+ else {
while (n1->next != NULL)
- n1=n1->next;
- n1->next=np;
- }
+ n1 = n1->next;
+ n1->next = np;
}
+}
static LHASH_NODE **getrn(_LHASH *lh, const void *data, unsigned long *rhash)
- {
- LHASH_NODE **ret,*n1;
- unsigned long hash,nn;
+{
+ LHASH_NODE **ret, *n1;
+ unsigned long hash, nn;
LHASH_COMP_FN_TYPE cf;
- hash=(*(lh->hash))(data);
+ hash = (*(lh->hash))(data);
lh->num_hash_calls++;
- *rhash=hash;
+ *rhash = hash;
- nn=hash%lh->pmax;
+ nn = hash % lh->pmax;
if (nn < lh->p)
- nn=hash%lh->num_alloc_nodes;
+ nn = hash % lh->num_alloc_nodes;
- cf=lh->comp;
- ret= &(lh->b[(int)nn]);
- for (n1= *ret; n1 != NULL; n1=n1->next)
- {
+ cf = lh->comp;
+ ret = &(lh->b[(int)nn]);
+ for (n1 = *ret; n1 != NULL; n1 = n1->next) {
#ifndef OPENSSL_NO_HASH_COMP
lh->num_hash_comps++;
- if (n1->hash != hash)
- {
- ret= &(n1->next);
+ if (n1->hash != hash) {
+ ret = &(n1->next);
continue;
- }
+ }
#endif
lh->num_comp_calls++;
- if(cf(n1->data,data) == 0)
+ if (cf(n1->data, data) == 0)
break;
- ret= &(n1->next);
- }
- return(ret);
+ ret = &(n1->next);
}
+ return (ret);
+}
/* The following hash seems to work very well on normal text strings
* 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(const char *c)
- {
- unsigned long ret=0;
+unsigned long
+lh_strhash(const char *c)
+{
+ unsigned long ret = 0;
long n;
unsigned long v;
int r;
if ((c == NULL) || (*c == '\0'))
- return(ret);
+ return (ret);
/*
unsigned char b[16];
MD5(c,strlen(c),b);
- return(b[0]|(b[1]<<8)|(b[2]<<16)|(b[3]<<24));
+ return(b[0]|(b[1]<<8)|(b[2]<<16)|(b[3]<<24));
*/
- n=0x100;
- while (*c)
- {
- v=n|(*c);
- n+=0x100;
- r= (int)((v>>2)^v)&0x0f;
- ret=(ret<<r)|(ret>>(32-r));
- ret&=0xFFFFFFFFL;
- ret^=v*v;
+ n = 0x100;
+ while (*c) {
+ v = n | (*c);
+ n += 0x100;
+ r = (int)((v >> 2) ^ v) & 0x0f;
+ ret = (ret << r)|(ret >> (32 - r));
+ ret &= 0xFFFFFFFFL;
+ ret ^= v * v;
c++;
- }
- return((ret>>16)^ret);
}
+ return ((ret >> 16) ^ ret);
+}
-unsigned long lh_num_items(const _LHASH *lh)
- {
+unsigned long
+lh_num_items(const _LHASH *lh)
+{
return lh ? lh->num_items : 0;
- }
+}
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
- *
+ *
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
- *
+ *
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
- * 4. If you include any Windows specific code (or a derivative thereof) from
+ * 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
- *
+ *
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
extern "C" {
#endif
-typedef struct lhash_node_st
- {
+typedef struct lhash_node_st {
void *data;
struct lhash_node_st *next;
#ifndef OPENSSL_NO_HASH_COMP
unsigned long hash;
#endif
- } LHASH_NODE;
+} LHASH_NODE;
typedef int (*LHASH_COMP_FN_TYPE)(const void *, const void *);
typedef unsigned long (*LHASH_HASH_FN_TYPE)(const void *);
name##_doall_arg(a, b); }
#define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG
-typedef struct lhash_st
- {
+typedef struct lhash_st {
LHASH_NODE **b;
LHASH_COMP_FN_TYPE comp;
LHASH_HASH_FN_TYPE hash;
unsigned long num_hash_comps;
int error;
- } _LHASH; /* Do not use _LHASH directly, use LHASH_OF
- * and friends */
+} _LHASH; /* Do not use _LHASH directly, use LHASH_OF
+ * and friends */
#define LH_LOAD_MULT 256
#endif
#endif
-