diff options
Diffstat (limited to 'usr/src/lib/libnsctl/common/hash.c')
-rw-r--r-- | usr/src/lib/libnsctl/common/hash.c | 166 |
1 files changed, 0 insertions, 166 deletions
diff --git a/usr/src/lib/libnsctl/common/hash.c b/usr/src/lib/libnsctl/common/hash.c deleted file mode 100644 index 1cc7e8f257..0000000000 --- a/usr/src/lib/libnsctl/common/hash.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <string.h> -#include <stdlib.h> -#include <sys/nsctl/nsc_hash.h> - -#define HASH_PRIME 2039 - -static int calc_hash(const char *); - -hash_node_t ** -nsc_create_hash() -{ - hash_node_t **hash; - - hash = (hash_node_t **)calloc(HASH_PRIME, sizeof (hash_node_t *)); - return (hash); -} - -int -nsc_insert_node(hash_node_t **hash, void *data, const char *key) -{ - int index; - hash_node_t *node; - - node = (hash_node_t *)malloc(sizeof (hash_node_t)); - if (!node) { - return (-1); - } - node->key = strdup(key); - node->data = data; - - /* - * possible enhancement would be to search - * in this index for a duplicate - */ - index = calc_hash(key); - node->next = hash[ index ]; - hash[ index ] = node; - - return (0); -} - -/* - * lookup - * - * Description: - * Searches the hash to find a node. - * - * Return values: - * 0 if not found. - * pointer to node if found. - */ -void * -nsc_lookup(hash_node_t **hash, const char *key) -{ - int index; - hash_node_t *node; - - index = calc_hash(key); - node = hash[ index ]; - while (node) { - if (strcmp(node->key, key) == 0) - return (node->data); - node = node->next; - } - return (0); -} - -void * -nsc_remove_node(hash_node_t **hash, char *key) -{ - int index; - hash_node_t *node, *prev; - void *retval; - - index = calc_hash(key); - if (!hash[ index ]) { - return (0); - } - - if (strcmp(hash[ index ]->key, key) == 0) { - node = hash[ index ]; - retval = node->data; - hash[ index ] = hash[ index ]->next; - free(node->key); - free(node); - return (retval); - } - prev = hash[ index ]; - node = prev->next; - while (node && (strcmp(node->key, key) != 0)) { - prev = node; - node = node->next; - } - - /* did we find it? */ - if (node) { - prev->next = node->next; - retval = node->data; - free(node->key); - free(node); - return (retval); - } - return (0); -} - -void -nsc_remove_all(hash_node_t **hash, void (*callback)(void *)) -{ - int i; - hash_node_t *p, *next; - - for (i = 0; i < HASH_PRIME; i++) { - p = hash[ i ]; - while (p) { - next = p->next; - if (callback) { - callback(p->data); - } - free(p->key); - free(p); - p = next; - } - } - free(hash); -} - -/* ---------------------------------------------------------------------- */ - -/* - * Basic rotating hash, as per Knuth. - */ -static int -calc_hash(const char *key) -{ - unsigned int hash, i; - int len = strlen(key); - for (hash = len, i = 0; i < len; i++) { - hash = (hash << 5) ^ (hash >> 27) ^ key[ i ]; - } - return (hash % HASH_PRIME); -} |