usr/src/lib/libc/port/gen/hsearch.c
author raf
Mon, 10 Apr 2006 12:27:38 -0700
changeset 1778 6357a59054f7
parent 0 68f95e015346
child 6812 febeba71273d
permissions -rw-r--r--
6404383 select() behaviour changed in Solaris 10, breaking binary compatibility
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * Compile time switches:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 *  MULT - use a multiplicative hashing function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 *  DIV - use the remainder mod table size as a hashing function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 *  CHAINED - use a linked list to resolve collisions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 *  OPEN - use open addressing to resolve collisions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 *  BRENT - use Brent's modification to improve the OPEN algorithm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 *  SORTUP - CHAINED list is sorted in increasing order.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 *  SORTDOWN - CHAINED list is sorted in decreasing order.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 *  START - CHAINED list with entries appended at front.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 *  DRIVER - compile in a main program to drive the tests.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 *  DEBUG - compile some debugging printout statements.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *  USCR - user supplied comparison routine.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#pragma weak hcreate = _hcreate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#pragma weak hdestroy = _hdestroy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#pragma weak hsearch = _hsearch
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <mtlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <thread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <search.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
typedef char *POINTER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#define	SUCCEED		0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#define	FAIL		1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#define	TRUE		1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#define	FALSE		0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#define	repeat		for (;;)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#define	until(A)	if (A) break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#ifdef OPEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
#undef CHAINED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#ifndef CHAINED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
#define	OPEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
#ifdef MULT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
#undef DIV
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#ifndef DIV
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
#define	MULT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
#ifdef START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
#undef SORTUP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
#undef SORTDOWN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
#ifdef SORTUP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
#undef SORTDOWN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
#ifdef USCR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
#define	COMPARE(A, B) (* hcompar)((A), (B))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
extern int (* hcompar)();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
#define	COMPARE(A, B) strcmp((A), (B))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
#ifdef MULT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
#define	SHIFT ((CHAR_BIT * sizeof (int)) - m) /* Shift factor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
#define	FACTOR 035761254233	/* Magic multiplication factor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
#define	HASH hashm		/* Multiplicative hash function */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
#define	HASH2 hash2m	/* Secondary hash function */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
static unsigned int hashm(POINTER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
static unsigned int hash2m(POINTER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
#ifdef DIV
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
#define	HASH hashd		/* Division hashing routine */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
#define	HASH2(A) 1		/* Secondary hash function */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
static unsigned int hashd();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
#ifdef CHAINED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
typedef struct node {	/* Part of the linked list of entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	ENTRY item;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	struct node *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
} NODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
typedef NODE *TABELEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
static NODE **table;	/* The address of the hash table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
static ENTRY *build();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
#ifdef OPEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
typedef ENTRY TABELEM;	/* What the table contains (TABle ELEMents) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
static TABELEM *table;	/* The address of the hash table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
static unsigned int count = 0;	/* Number of entries in hash table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
static unsigned int length;	/* Size of the hash table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
static unsigned int m;		/* Log base 2 of length */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
static unsigned int prcnt;	/* Number of probes this item */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
static mutex_t table_lock = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
#define	RETURN(n)    { lmutex_unlock(&table_lock); return (n); }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
 * forward declarations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
static unsigned int crunch(POINTER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
#ifdef DRIVER
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
static void hdump();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
main()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	char line[80];	/* Room for the input line */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	int i = 0;		/* Data generator */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	ENTRY *res;		/* Result of hsearch */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	ENTRY *new;		/* Test entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
start:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	if (hcreate(5))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		printf("Length = %u, m = %u\n", length, m);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		fprintf(stderr, "Out of core\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		exit(FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	repeat {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	hdump();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	printf("Enter a probe: ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	until(EOF == scanf("%s", line) || strcmp(line, "quit") == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	printf("%s, ", line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	printf("division: %d, ", hashd(line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	printf("multiplication: %d\n", hashm(line));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	new = (ENTRY *) malloc(sizeof (ENTRY));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	if (new == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	    fprintf(stderr, "Out of core \n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	    exit(FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	    new->key = malloc((unsigned)strlen(line) + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	    if (new->key == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		fprintf(stderr, "Out of core \n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		exit(FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	    strcpy(new->key, line);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	    new->data = malloc(sizeof (int));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	    if (new->data == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		fprintf(stderr, "Out of core \n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
		exit(FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	    *new->data = i++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	res = hsearch(*new, ENTER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	printf("The number of probes required was %d\n", prcnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	if (res == (ENTRY *) 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	    printf("Table is full\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	    printf("Success: ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	    printf("Key = %s, Value = %d\n", res->key, *res->data);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	printf("Do you wish to start another hash table (yes/no?)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	if (EOF == scanf("%s", line) || strcmp(line, "no") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		exit(SUCCEED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	hdestroy();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	goto start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
hcreate(size_t size)	/* Create a hash table no smaller than size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	/* Minimum "size" for hash table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	size_t unsize;	/* Holds the shifted size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	TABELEM *local_table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	TABELEM *old_table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	unsigned int local_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	unsigned int local_m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	if (size == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	unsize = size;	/* +1 for empty table slot; -1 for ceiling */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	local_length = 1;	/* Maximum entries in table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	local_m = 0;		/* Log2 length */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	while (unsize) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		unsize >>= 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		local_length <<= 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
		local_m++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	local_table = (TABELEM *) calloc(local_length, sizeof (TABELEM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	lmutex_lock(&table_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	old_table = table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	table = local_table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	length = local_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	m = local_m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	lmutex_unlock(&table_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	if (old_table != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		free(old_table);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	return (local_table != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
hdestroy(void)	/* Reset the module to its initial state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	POINTER local_table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	lmutex_lock(&table_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
#ifdef CHAINED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	NODE *p, *oldp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	for (i = 0; i < length; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		if (table[i] != (NODE *)NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
			p = table[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
			while (p != (NODE *)NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
				oldp = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
				p = p -> next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
				 * This is a locking vs malloc() violation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
				 * Fortunately, it is not actually compiled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
				free(oldp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	local_table = (POINTER)table;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
	table = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
#ifdef OPEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	lmutex_unlock(&table_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	free(local_table);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
#ifdef OPEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
 * Hash search of a fixed-capacity table.  Open addressing used to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
 *  resolve collisions.  Algorithm modified from Knuth, Volume 3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
 *  section 6.4, algorithm D.  Labels flag corresponding actions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
/* Find or insert the item into the table */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
ENTRY
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
*hsearch(ENTRY item, ACTION action)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	/* "item" to be inserted or found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	/* action: FIND or ENTER */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	unsigned int i;	/* Insertion index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	unsigned int c;	/* Secondary probe displacement */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	lmutex_lock(&table_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	prcnt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
/* D1: */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	i = HASH(item.key);	/* Primary hash on key */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	if (action == ENTER)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
		printf("hash = %o\n", i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
/* D2: */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	if (table[i].key == NULL)	/* Empty slot? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		goto D6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	else if (COMPARE(table[i].key, item.key) == 0)	/* Match? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		RETURN(&table[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
/* D3: */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	c = HASH2(item.key);	/* No match => compute secondary hash */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	if (action == ENTER)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		printf("hash2 = %o\n", c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
D4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	i = (i + c) % length;	/* Advance to next slot */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	prcnt++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
/* D5: */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	if (table[i].key == NULL)	/* Empty slot? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
		goto D6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	else if (COMPARE(table[i].key, item.key) == 0)	/* Match? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		RETURN(&table[i])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		goto D4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
D6:	if (action == FIND)		/* Insert if requested */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		RETURN((ENTRY *) NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	if (count == (length - 1))	/* Table full? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		RETURN((ENTRY *) 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
#ifdef BRENT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
 * Brent's variation of the open addressing algorithm.  Do extra
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
 * work during insertion to speed retrieval.  May require switching
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
 * of previously placed items.  Adapted from Knuth, Volume 3, section
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
 * 4.6 and Brent's article in CACM, volume 10, #2, February 1973.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	unsigned int p0 = HASH(item.key);   /* First probe index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	unsigned int c0 = HASH2(item.key);  /* Main branch increment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	unsigned int r = prcnt - 1; /* Current minimum distance */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	unsigned int j;		/* Counts along main branch */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	unsigned int k;		/* Counts along secondary branch */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	unsigned int curj;	/* Current best main branch site */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	unsigned int curpos;	/* Current best table index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	unsigned int pj;	/* Main branch indices */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	unsigned int cj;	/* Secondary branch increment distance */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	unsigned int pjk;	/* Secondary branch probe indices */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	if (prcnt >= 3) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
		for (j = 0; j < prcnt; j++) {   /* Count along main branch */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
			pj = (p0 + j * c0) % length; /* New main branch index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
			cj = HASH2(table[pj].key); /* Secondary branch incr. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
			for (k = 1; j+k <= r; k++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
					/* Count on secondary branch */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
				pjk = (pj + k * cj) % length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
					/* Secondary probe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
				if (table[pjk].key == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
					/* Improvement found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
					r = j + k; /* Decrement upper bound */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
					curj = pj; /* Save main probe index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
					curpos = pjk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
						/* Save secondeary index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		if (r != prcnt - 1) {	/* If an improvement occurred */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
			table[curpos] = table[curj]; /* Old key to new site */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
			printf("Switch curpos = %o, curj = %o, oldi = %o\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
				curj, curpos, i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			i = curj;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	count++;			/* Increment table occupancy count */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	table[i] = item;		/* Save item */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	lmutex_unlock(&table_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	return (&table[i]);		/* Address of item is returned */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
#ifdef USCR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
#ifdef DRIVER
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
compare(a, b)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
POINTER a;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
POINTER b;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
    return (strcmp(a, b));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
int (* hcompar)() = compare;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
#ifdef CHAINED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
#ifdef SORTUP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
#define	STRCMP(A, B) (COMPARE((A), (B)) > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
#ifdef SORTDOWN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
#define	STRCMP(A, B) (COMPARE((A), (B)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
#define	STRCMP(A, B) (COMPARE((A), (B)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
ENTRY
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
*hsearch(item, action)	/* Chained search with sorted lists */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
ENTRY item;		/* Item to be inserted or found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
ACTION action;		/* FIND or ENTER */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	NODE *p;		/* Searches through the linked list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	NODE **q;		/* Where to store the pointer to a new NODE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	unsigned int i;		/* Result of hash */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	int res;		/* Result of string comparison */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	lmutex_lock(&table_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	prcnt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	i = HASH(item.key);	/* Table[i] contains list head */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	if (table[i] == (NODE*)NULL) { /* List has not yet been begun */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
		if (action == FIND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
			RETURN((ENTRY *) NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
			RETURN(build(&table[i], (NODE *) NULL, item));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	} else {		/* List is not empty */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		q = &table[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
		p = table[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		while (p != NULL && (res = STRCMP(item.key, p->item.key))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
			prcnt++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
			q = &(p->next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
			p = p->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
		if (p != NULL && res == 0)	/* Item has been found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
			RETURN(&(p->item));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
		else {			/* Item is not yet on list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
			if (action == FIND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
				RETURN((ENTRY *) NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
#ifdef START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
				RETURN(build(&table[i], table[i], item));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
				RETURN(build(q, p, item));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
static ENTRY
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
*build(last, next, item)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
NODE **last;		/* Where to store in last list item */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
NODE *next;		/* Link to next list item */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
ENTRY item;		/* Item to be kept in node */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	 * This is a locking vs malloc() violation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	 * Fortunately, it is not actually compiled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	NODE *p = (NODE *) malloc(sizeof (NODE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	if (p != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		p->item = item;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
		*last = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		p->next = next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
		return (&(p->item));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
#ifdef DIV
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
static unsigned int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
hashd(key)		/* Division hashing scheme */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
POINTER key;		/* Key to be hashed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
    return (crunch(key) % length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
#ifdef MULT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
 *  NOTE: The following algorithm only works on machines where
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
 *  the results of multiplying two integers is the least
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
 *  significant part of the double word integer required to hold
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
 *  the result.  It is adapted from Knuth, Volume 3, section 6.4.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
static unsigned int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
hashm(POINTER key)	/* Multiplication hashing scheme */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	/* "key" to be hashed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	return ((int)(((unsigned)(crunch(key) * FACTOR)) >> SHIFT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
 * Secondary hashing, for use with multiplicitive hashing scheme.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
 * Adapted from Knuth, Volume 3, section 6.4.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
static unsigned int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
hash2m(POINTER key)	/* Secondary hashing routine */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	/* "key" is the string to be hashed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
    return (((unsigned int)((crunch(key) * FACTOR) << m) >> SHIFT) | 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
/* PJ Weinberger's hash function */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
static unsigned int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
crunch(POINTER key)	/* Convert multicharacter key to unsigned int */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	unsigned int h = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	unsigned int g;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	unsigned char *p = (unsigned char *)key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	for (; *p; p++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		h = (h << 4) + *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
		g = h & 0xf0000000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
		if (g != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
			h ^= (g >> 24);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
			h ^= g;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	return (h);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
#ifdef DRIVER
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
hdump()			/* Dumps loc, data, probe count, key */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
	unsigned int i;	/* Counts table slots */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
#ifdef OPEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
	unsigned int sum = 0;	/* Counts probes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
#ifdef CHAINED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	NODE *a;		/* Current Node on list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	for (i = 0; i < length; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
#ifdef OPEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		if (table[i].key == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
			printf("%o.\t-,\t-,\t(NULL)\n", i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
			unsigned int oldpr = prcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
				/* Save current probe count */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
			hsearch(table[i], FIND);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
			sum += prcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
			printf("%o.\t%d,\t%d,\t%s\n", i,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
				*table[i].data, prcnt, table[i].key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
			prcnt = oldpr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	printf("Total probes = %d\n", sum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
#ifdef CHAINED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	if (table[i] == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
	    printf("%o.\t-,\t-,\t(NULL)\n", i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
	    printf("%o.", i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	    for (a = table[i]; a != NULL; a = a->next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
		printf("\t%d,\t%#0.4x,\t%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		    *a->item.data, a, a->item.key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
#endif