|
Packit Service |
a8c26c |
.fp 5 CW
|
|
Packit Service |
a8c26c |
.de Af
|
|
Packit Service |
a8c26c |
.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2
|
|
Packit Service |
a8c26c |
.if !?\\$4?? .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
|
|
Packit Service |
a8c26c |
..
|
|
Packit Service |
a8c26c |
.de aF
|
|
Packit Service |
a8c26c |
.ie ?\\$3?? .ft \\$1
|
|
Packit Service |
a8c26c |
.el \{\
|
|
Packit Service |
a8c26c |
.ds ;G \&
|
|
Packit Service |
a8c26c |
.nr ;G \\n(.f
|
|
Packit Service |
a8c26c |
.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
|
|
Packit Service |
a8c26c |
\\*(;G
|
|
Packit Service |
a8c26c |
.ft \\n(;G \}
|
|
Packit Service |
a8c26c |
..
|
|
Packit Service |
a8c26c |
.de L
|
|
Packit Service |
a8c26c |
.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
|
|
Packit Service |
a8c26c |
..
|
|
Packit Service |
a8c26c |
.de LR
|
|
Packit Service |
a8c26c |
.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
|
|
Packit Service |
a8c26c |
..
|
|
Packit Service |
a8c26c |
.de RL
|
|
Packit Service |
a8c26c |
.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
|
|
Packit Service |
a8c26c |
..
|
|
Packit Service |
a8c26c |
.de EX \" start example
|
|
Packit Service |
a8c26c |
.ta 1i 2i 3i 4i 5i 6i
|
|
Packit Service |
a8c26c |
.PP
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.PD 0
|
|
Packit Service |
a8c26c |
.ft 5
|
|
Packit Service |
a8c26c |
.nf
|
|
Packit Service |
a8c26c |
..
|
|
Packit Service |
a8c26c |
.de EE \" end example
|
|
Packit Service |
a8c26c |
.fi
|
|
Packit Service |
a8c26c |
.ft
|
|
Packit Service |
a8c26c |
.PD
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
.PP
|
|
Packit Service |
a8c26c |
..
|
|
Packit Service |
a8c26c |
.TH HASH 3
|
|
Packit Service |
a8c26c |
.SH NAME
|
|
Packit Service |
a8c26c |
hash \- hash table support (obsolete: use \fBcdt\fP instead)
|
|
Packit Service |
a8c26c |
.SH SYNOPSIS
|
|
Packit Service |
a8c26c |
.L "#include <hash.h>"
|
|
Packit Service |
a8c26c |
.SH DESCRIPTION
|
|
Packit Service |
a8c26c |
The
|
|
Packit Service |
a8c26c |
.I hash
|
|
Packit Service |
a8c26c |
routines manipulate collections of dynamic, scoped hash tables.
|
|
Packit Service |
a8c26c |
.PP
|
|
Packit Service |
a8c26c |
A hash table provides an association between a
|
|
Packit Service |
a8c26c |
.I key
|
|
Packit Service |
a8c26c |
and its
|
|
Packit Service |
a8c26c |
.IR value .
|
|
Packit Service |
a8c26c |
A
|
|
Packit Service |
a8c26c |
.I key
|
|
Packit Service |
a8c26c |
is a sequence of
|
|
Packit Service |
a8c26c |
.L char
|
|
Packit Service |
a8c26c |
elements and a
|
|
Packit Service |
a8c26c |
.I value
|
|
Packit Service |
a8c26c |
is a user supplied pointer to the value.
|
|
Packit Service |
a8c26c |
Each hash table has a dynamic number of slots,
|
|
Packit Service |
a8c26c |
each pointing to the head of a forward linked
|
|
Packit Service |
a8c26c |
.IR "collision chain" .
|
|
Packit Service |
a8c26c |
.PP
|
|
Packit Service |
a8c26c |
Hashing occurs as follows:
|
|
Packit Service |
a8c26c |
a
|
|
Packit Service |
a8c26c |
.I "hash function"
|
|
Packit Service |
a8c26c |
takes a
|
|
Packit Service |
a8c26c |
.I key
|
|
Packit Service |
a8c26c |
as an argument and returns a non-negative index.
|
|
Packit Service |
a8c26c |
The index modulo the table size produces a
|
|
Packit Service |
a8c26c |
slot that points to a
|
|
Packit Service |
a8c26c |
.IR "collision chain" .
|
|
Packit Service |
a8c26c |
The collision chain is sequentially searched until a match is found for
|
|
Packit Service |
a8c26c |
.IR key .
|
|
Packit Service |
a8c26c |
The hash tables are automatically resized as new entries are added.
|
|
Packit Service |
a8c26c |
.PP
|
|
Packit Service |
a8c26c |
Each hash table has one key type.
|
|
Packit Service |
a8c26c |
The default key type is a pointer to a null-terminated string.
|
|
Packit Service |
a8c26c |
The alternate key type is a pointer to a fixed length byte buffer,
|
|
Packit Service |
a8c26c |
declared for a given table by the
|
|
Packit Service |
a8c26c |
.L hashalloc()
|
|
Packit Service |
a8c26c |
function described below.
|
|
Packit Service |
a8c26c |
.PP
|
|
Packit Service |
a8c26c |
Hash table information is partitioned into two parts for efficient scoping.
|
|
Packit Service |
a8c26c |
The
|
|
Packit Service |
a8c26c |
.I root
|
|
Packit Service |
a8c26c |
part contains fixed information that is shared among a set of related
|
|
Packit Service |
a8c26c |
hash tables.
|
|
Packit Service |
a8c26c |
The remaining information is maintained on a per-table basis.
|
|
Packit Service |
a8c26c |
.PP
|
|
Packit Service |
a8c26c |
These basic types are defined in the header file
|
|
Packit Service |
a8c26c |
.B hash.h
|
|
Packit Service |
a8c26c |
(alternate names are listed in parenthesis):
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_table_t (HASHTABLE)"
|
|
Packit Service |
a8c26c |
The per-table information.
|
|
Packit Service |
a8c26c |
The readonly public elements are:
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int buckets"
|
|
Packit Service |
a8c26c |
The number of table entries.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "char* name"
|
|
Packit Service |
a8c26c |
The hash table name.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "root"
|
|
Packit Service |
a8c26c |
The root information.
|
|
Packit Service |
a8c26c |
The public elements are:
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int root->accesses"
|
|
Packit Service |
a8c26c |
The number of lookups.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int root->collisions"
|
|
Packit Service |
a8c26c |
The number of lookup collisions.
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_table_t* scope"
|
|
Packit Service |
a8c26c |
The table that this scope covers,
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
if the table is not a scope.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int size"
|
|
Packit Service |
a8c26c |
The current hash table size.
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_bucket_t (HASHBUCKET)"
|
|
Packit Service |
a8c26c |
A collision chain hash bucket.
|
|
Packit Service |
a8c26c |
The public structure elements are:
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "char* hashname(Hash_bucket_t*)"
|
|
Packit Service |
a8c26c |
Returns a pointer to the hash bucket key given the bucket pointer.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "char* value"
|
|
Packit Service |
a8c26c |
The value associated with the key.
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_header_t (HASHHEADER)"
|
|
Packit Service |
a8c26c |
The hash bucket header that must be the first element in all user defined
|
|
Packit Service |
a8c26c |
buckets.
|
|
Packit Service |
a8c26c |
.L HASH_VALUE
|
|
Packit Service |
a8c26c |
may not be used with user defined buckets.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_position_t (HASHPOSITION)"
|
|
Packit Service |
a8c26c |
Stores the hash table position for
|
|
Packit Service |
a8c26c |
.LR hashscan .
|
|
Packit Service |
a8c26c |
The public elements are:
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_bucket_t* bucket"
|
|
Packit Service |
a8c26c |
The current hash bucket pointer.
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
.PP
|
|
Packit Service |
a8c26c |
The routines are:
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_table_t* hashalloc(Hash_table_t* ref, int op, ...)"
|
|
Packit Service |
a8c26c |
Creates a new hash table and returns a pointer to the table.
|
|
Packit Service |
a8c26c |
.IR malloc (3)
|
|
Packit Service |
a8c26c |
is used to allocate space for the table.
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
is returned if the table cannot be created.
|
|
Packit Service |
a8c26c |
.L ref
|
|
Packit Service |
a8c26c |
is a pointer to a reference hash table that provides
|
|
Packit Service |
a8c26c |
default values for unspecified information.
|
|
Packit Service |
a8c26c |
The new hash table and
|
|
Packit Service |
a8c26c |
.L ref
|
|
Packit Service |
a8c26c |
share the same root information.
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L ref
|
|
Packit Service |
a8c26c |
is
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
then new root information is created for the new table.
|
|
Packit Service |
a8c26c |
The remaining arguments appear in
|
|
Packit Service |
a8c26c |
.I op-arg
|
|
Packit Service |
a8c26c |
pairs, followed by a final
|
|
Packit Service |
a8c26c |
.L 0
|
|
Packit Service |
a8c26c |
argument.
|
|
Packit Service |
a8c26c |
The
|
|
Packit Service |
a8c26c |
.I op-arg
|
|
Packit Service |
a8c26c |
pairs are:
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_alloc, (char(*)()) alloc"
|
|
Packit Service |
a8c26c |
.L alloc
|
|
Packit Service |
a8c26c |
is a function that is called to process
|
|
Packit Service |
a8c26c |
.L Hash_bucket_t
|
|
Packit Service |
a8c26c |
.L value
|
|
Packit Service |
a8c26c |
assignments.
|
|
Packit Service |
a8c26c |
The single argument is
|
|
Packit Service |
a8c26c |
.L "char* value"
|
|
Packit Service |
a8c26c |
and the processed
|
|
Packit Service |
a8c26c |
.L char*
|
|
Packit Service |
a8c26c |
value is returned.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_clear, int flags"
|
|
Packit Service |
a8c26c |
.L flags
|
|
Packit Service |
a8c26c |
are the
|
|
Packit Service |
a8c26c |
.L ref
|
|
Packit Service |
a8c26c |
flags to be cleared in the new hash table.
|
|
Packit Service |
a8c26c |
See
|
|
Packit Service |
a8c26c |
.L HASH_set
|
|
Packit Service |
a8c26c |
below.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_compare, (int(*)()) compare"
|
|
Packit Service |
a8c26c |
Specifies an alternate
|
|
Packit Service |
a8c26c |
.I key
|
|
Packit Service |
a8c26c |
comparison function.
|
|
Packit Service |
a8c26c |
The arguments and return value for
|
|
Packit Service |
a8c26c |
.L compare
|
|
Packit Service |
a8c26c |
are the same as for
|
|
Packit Service |
a8c26c |
.IR strncmp (3)
|
|
Packit Service |
a8c26c |
if
|
|
Packit Service |
a8c26c |
.L HASH_namesize
|
|
Packit Service |
a8c26c |
is specified and
|
|
Packit Service |
a8c26c |
.IR strcmp (3)
|
|
Packit Service |
a8c26c |
otherwise.
|
|
Packit Service |
a8c26c |
The first argument is the
|
|
Packit Service |
a8c26c |
.I key
|
|
Packit Service |
a8c26c |
from the current hash bucket on the
|
|
Packit Service |
a8c26c |
.I "collision chain"
|
|
Packit Service |
a8c26c |
and the second argument is the user supplied
|
|
Packit Service |
a8c26c |
.IR key .
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_free, (int(*)()) free"
|
|
Packit Service |
a8c26c |
.L free
|
|
Packit Service |
a8c26c |
is a function that is called when a hash bucket is freed.
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L HASH_BUCKET
|
|
Packit Service |
a8c26c |
was set in
|
|
Packit Service |
a8c26c |
.L hashalloc
|
|
Packit Service |
a8c26c |
then the hash bucket pointer is passed, otherwise the bucket
|
|
Packit Service |
a8c26c |
.L value
|
|
Packit Service |
a8c26c |
pointer is passed.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_hash, (int(*)()) hash"
|
|
Packit Service |
a8c26c |
Specifies an alternate
|
|
Packit Service |
a8c26c |
.I key
|
|
Packit Service |
a8c26c |
hash function.
|
|
Packit Service |
a8c26c |
A
|
|
Packit Service |
a8c26c |
.L char*
|
|
Packit Service |
a8c26c |
key argument (and, if
|
|
Packit Service |
a8c26c |
.L HASH_namesize
|
|
Packit Service |
a8c26c |
is specified, an
|
|
Packit Service |
a8c26c |
.L int
|
|
Packit Service |
a8c26c |
key size argument) is passed to
|
|
Packit Service |
a8c26c |
.LR hash .
|
|
Packit Service |
a8c26c |
The return value must be a non-negative
|
|
Packit Service |
a8c26c |
.LR int .
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_meanchain, int meanchain"
|
|
Packit Service |
a8c26c |
Specifies the mean collision chain length.
|
|
Packit Service |
a8c26c |
The hash table is automatically resized when this value is exceeded.
|
|
Packit Service |
a8c26c |
The default mean chain length is 2.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_name, char* name"
|
|
Packit Service |
a8c26c |
Associates
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
with the hash table.
|
|
Packit Service |
a8c26c |
Used by
|
|
Packit Service |
a8c26c |
.LR hashdump) .
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_namesize, int namesize"
|
|
Packit Service |
a8c26c |
The fixed size in bytes for
|
|
Packit Service |
a8c26c |
.I keys
|
|
Packit Service |
a8c26c |
in the table.
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L namesize
|
|
Packit Service |
a8c26c |
is 0 (the default) then the
|
|
Packit Service |
a8c26c |
.I keys
|
|
Packit Service |
a8c26c |
are interpreted as null-terminated strings.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_set, int flags"
|
|
Packit Service |
a8c26c |
Changes the hash table flags by
|
|
Packit Service |
a8c26c |
.IR or ing
|
|
Packit Service |
a8c26c |
in
|
|
Packit Service |
a8c26c |
.LR flags .
|
|
Packit Service |
a8c26c |
The flags, which may be
|
|
Packit Service |
a8c26c |
.IR or ed
|
|
Packit Service |
a8c26c |
together, are:
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L HASH_ALLOCATE
|
|
Packit Service |
a8c26c |
Keys for new hash table entries are to be copied to data areas obtained from
|
|
Packit Service |
a8c26c |
.IR malloc (3).
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L HASH_FIXED
|
|
Packit Service |
a8c26c |
Fixes the hash table size, disabling any automatic table resizing.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L HASH_SCOPE
|
|
Packit Service |
a8c26c |
The new hash table is a scope that is to be pushed on top of
|
|
Packit Service |
a8c26c |
.LR ref .
|
|
Packit Service |
a8c26c |
.L ref
|
|
Packit Service |
a8c26c |
must be
|
|
Packit Service |
a8c26c |
.RL non- NULL .
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_va_list, va_list ap"
|
|
Packit Service |
a8c26c |
.L ap
|
|
Packit Service |
a8c26c |
is a
|
|
Packit Service |
a8c26c |
.L va_list
|
|
Packit Service |
a8c26c |
variable argument list pointer
|
|
Packit Service |
a8c26c |
(see
|
|
Packit Service |
a8c26c |
.LR <stdarg.h> ).
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_table_t* hashfree(Hash_table_t* tab)"
|
|
Packit Service |
a8c26c |
The hash table
|
|
Packit Service |
a8c26c |
.L tab
|
|
Packit Service |
a8c26c |
is freed.
|
|
Packit Service |
a8c26c |
The scope covered table pointer is returned,
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
if
|
|
Packit Service |
a8c26c |
.L tab
|
|
Packit Service |
a8c26c |
is not a scope.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "char* hashlook(Hash_table_t* tab, char* name, int flags, char* value)"
|
|
Packit Service |
a8c26c |
Operates on the key
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
in the hash table
|
|
Packit Service |
a8c26c |
.L tab
|
|
Packit Service |
a8c26c |
according to
|
|
Packit Service |
a8c26c |
.L flags
|
|
Packit Service |
a8c26c |
and
|
|
Packit Service |
a8c26c |
.LR value .
|
|
Packit Service |
a8c26c |
A
|
|
Packit Service |
a8c26c |
.L Hash_bucket_t
|
|
Packit Service |
a8c26c |
pointer is returned unless otherwise noted.
|
|
Packit Service |
a8c26c |
There are three basic lookup operations:
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L HASH_CREATE
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is entered into the top level scope if it does not already exist.
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
also appears in a lower scope and
|
|
Packit Service |
a8c26c |
.L HASH_ALLOC
|
|
Packit Service |
a8c26c |
is set for the table then the new bucket will share the
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
field value with the lower scope.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L HASH_DELETE
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is deleted from the top level scope if it exists.
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
is returned.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L HASH_LOOKUP
|
|
Packit Service |
a8c26c |
The scopes are searched in order from top to bottom for
|
|
Packit Service |
a8c26c |
.L name .
|
|
Packit Service |
a8c26c |
The bucket pointer for the first occurrence is returned.
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
is returned if
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is not found.
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
The basic operations may be qualified by the following
|
|
Packit Service |
a8c26c |
(the qualifiers are restricted to the basic operations in
|
|
Packit Service |
a8c26c |
the parenthesized list):
|
|
Packit Service |
a8c26c |
.RS
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_BUCKET (HASH_CREATE,HASH_DELETE,HASH_LOOKUP)"
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is a pointer to a bucket that has already been entered into the table.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_FIXED (HASH_CREATE)"
|
|
Packit Service |
a8c26c |
.L value
|
|
Packit Service |
a8c26c |
is taken to be the size of the hash bucket to be created for
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
in the top level scope.
|
|
Packit Service |
a8c26c |
The minimum bucket size is silently restricted to
|
|
Packit Service |
a8c26c |
.LR sizeof(Hash_header_t) .
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_INSTALL (HASH_CREATE)"
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is a pointer to a bucket that has not been entered into the table.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_NOSCOPE (HASH_LOOKUP)"
|
|
Packit Service |
a8c26c |
The lookup is restricted to the top level scope.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_OPAQUE (HASH_CREATE,HASH_DELETE)"
|
|
Packit Service |
a8c26c |
Sets
|
|
Packit Service |
a8c26c |
.L (HASH_CREATE)
|
|
Packit Service |
a8c26c |
or clears
|
|
Packit Service |
a8c26c |
.L (HASH_DELETE)
|
|
Packit Service |
a8c26c |
the
|
|
Packit Service |
a8c26c |
.I opaque
|
|
Packit Service |
a8c26c |
property for the bucket.
|
|
Packit Service |
a8c26c |
An opaque bucket is not visible in lower scopes.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_SCOPE (HASH_CREATE,HASH_DELETE)"
|
|
Packit Service |
a8c26c |
All scopes are searched for the bucket.
|
|
Packit Service |
a8c26c |
If the bucket is not found for
|
|
Packit Service |
a8c26c |
.L HASH_CREATE
|
|
Packit Service |
a8c26c |
then a new bucket is created in the lowest scope.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "HASH_VALUE (HASH_CREATE,HASH_LOOKUP)"
|
|
Packit Service |
a8c26c |
For
|
|
Packit Service |
a8c26c |
.L HASH_CREATE
|
|
Packit Service |
a8c26c |
the bucket
|
|
Packit Service |
a8c26c |
.L value
|
|
Packit Service |
a8c26c |
field is set to
|
|
Packit Service |
a8c26c |
.L value
|
|
Packit Service |
a8c26c |
and the bucket
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
value is returned.
|
|
Packit Service |
a8c26c |
For
|
|
Packit Service |
a8c26c |
.L HASH_LOOKUP
|
|
Packit Service |
a8c26c |
the bucket
|
|
Packit Service |
a8c26c |
.L value
|
|
Packit Service |
a8c26c |
field is returned,
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
if the bucket is not found.
|
|
Packit Service |
a8c26c |
.RE
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
then the name from the most recent
|
|
Packit Service |
a8c26c |
.L hashlook()
|
|
Packit Service |
a8c26c |
is used, avoiding recomputation of some internal parameters.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "char* hashget(Hash_table_t* tab, char* name)"
|
|
Packit Service |
a8c26c |
Returns the value
|
|
Packit Service |
a8c26c |
associated with the key
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
in the hash table
|
|
Packit Service |
a8c26c |
.LR tab .
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
then the name from the most recent
|
|
Packit Service |
a8c26c |
.L hashget()
|
|
Packit Service |
a8c26c |
is used, avoiding recomputation of some internal parameters.
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
is returned if
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is not in the table.
|
|
Packit Service |
a8c26c |
All scope covered tables are searched.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_bucket_t* hashlast(Hash_table_t* tab)"
|
|
Packit Service |
a8c26c |
Returns a pointer to the most recent hash bucket for
|
|
Packit Service |
a8c26c |
.LR tab .
|
|
Packit Service |
a8c26c |
The value is set by
|
|
Packit Service |
a8c26c |
.LR hashlook() ,
|
|
Packit Service |
a8c26c |
.L hashscan()
|
|
Packit Service |
a8c26c |
and
|
|
Packit Service |
a8c26c |
.LR hashwalk() .
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "char* hashput(Hash_table_t* tab, char* name, char* value)"
|
|
Packit Service |
a8c26c |
Set the value of the key
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
to
|
|
Packit Service |
a8c26c |
.L value
|
|
Packit Service |
a8c26c |
in the top level scope of the hash table
|
|
Packit Service |
a8c26c |
.LR tab .
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is entered into the top level scope if necessary.
|
|
Packit Service |
a8c26c |
The (possibly re-allocated) key name pointer is returned
|
|
Packit Service |
a8c26c |
(see
|
|
Packit Service |
a8c26c |
.LR HASH_ALLOCATE ).
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
is 0 then the most recent lookup
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
to
|
|
Packit Service |
a8c26c |
.L hashlook()
|
|
Packit Service |
a8c26c |
or
|
|
Packit Service |
a8c26c |
.L hashget()
|
|
Packit Service |
a8c26c |
is used.
|
|
Packit Service |
a8c26c |
This eliminates a re-hash and re-lookup of
|
|
Packit Service |
a8c26c |
.LR name .
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int hashwalk(Hash_table_t* tab, int flags, (int(*)()) walker, char* handle)"
|
|
Packit Service |
a8c26c |
The function
|
|
Packit Service |
a8c26c |
.L walker
|
|
Packit Service |
a8c26c |
is applied to each entry (not covered by a scope starting at
|
|
Packit Service |
a8c26c |
.LR tab )
|
|
Packit Service |
a8c26c |
in the hash table
|
|
Packit Service |
a8c26c |
.LR tab .
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L flags
|
|
Packit Service |
a8c26c |
is
|
|
Packit Service |
a8c26c |
.L HASH_NOSCOPE
|
|
Packit Service |
a8c26c |
then only the top level hash table is used, otherwise the walk includes
|
|
Packit Service |
a8c26c |
all scope covered tables.
|
|
Packit Service |
a8c26c |
.L walker
|
|
Packit Service |
a8c26c |
is called with
|
|
Packit Service |
a8c26c |
.L char*
|
|
Packit Service |
a8c26c |
.I key
|
|
Packit Service |
a8c26c |
as the first argument,
|
|
Packit Service |
a8c26c |
.L char*
|
|
Packit Service |
a8c26c |
.I value
|
|
Packit Service |
a8c26c |
as the second argument, and
|
|
Packit Service |
a8c26c |
.L char*
|
|
Packit Service |
a8c26c |
.I handle
|
|
Packit Service |
a8c26c |
as the third argument.
|
|
Packit Service |
a8c26c |
.I handle
|
|
Packit Service |
a8c26c |
may be
|
|
Packit Service |
a8c26c |
.LR 0 .
|
|
Packit Service |
a8c26c |
The walk terminates after the last entry or when
|
|
Packit Service |
a8c26c |
.L walker
|
|
Packit Service |
a8c26c |
returns a negative value.
|
|
Packit Service |
a8c26c |
The return value of the last call to
|
|
Packit Service |
a8c26c |
.L walker
|
|
Packit Service |
a8c26c |
is returned.
|
|
Packit Service |
a8c26c |
Only one walk may be active within a collection of scoped tables.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_position_t* hashscan(Hash_table_t* tab, int flags)"
|
|
Packit Service |
a8c26c |
Returns a
|
|
Packit Service |
a8c26c |
.L Hash_position_t
|
|
Packit Service |
a8c26c |
pointer for a sequential scan on the hash table
|
|
Packit Service |
a8c26c |
.LR tab .
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L flags
|
|
Packit Service |
a8c26c |
is
|
|
Packit Service |
a8c26c |
.L HASH_NOSCOPE
|
|
Packit Service |
a8c26c |
then only the top level hash table is used, otherwise the scan includes
|
|
Packit Service |
a8c26c |
all scope covered tables.
|
|
Packit Service |
a8c26c |
Only one scan may be active within a collection of scoped tables.
|
|
Packit Service |
a8c26c |
.L hashdone()
|
|
Packit Service |
a8c26c |
must be called to terminate the scan.
|
|
Packit Service |
a8c26c |
.L 0
|
|
Packit Service |
a8c26c |
is returned on error.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "Hash_bucket_t* hashnext(Hash_position_t* pos)"
|
|
Packit Service |
a8c26c |
Returnes a pointer to the next bucket in the sequential scan set up by
|
|
Packit Service |
a8c26c |
.L hashscan()
|
|
Packit Service |
a8c26c |
on
|
|
Packit Service |
a8c26c |
.LR pos .
|
|
Packit Service |
a8c26c |
If no elements remain then
|
|
Packit Service |
a8c26c |
.L 0
|
|
Packit Service |
a8c26c |
is returned.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "void hashdone(Hash_position_t* pos)"
|
|
Packit Service |
a8c26c |
Completes a scan initiated by
|
|
Packit Service |
a8c26c |
.L hashscan()
|
|
Packit Service |
a8c26c |
on
|
|
Packit Service |
a8c26c |
.LR pos .
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int hashset(Hash_table_t* tab, int flags)"
|
|
Packit Service |
a8c26c |
Sets the flags for the hash table
|
|
Packit Service |
a8c26c |
.L tab
|
|
Packit Service |
a8c26c |
by
|
|
Packit Service |
a8c26c |
.IR or ing
|
|
Packit Service |
a8c26c |
in
|
|
Packit Service |
a8c26c |
.LR flags .
|
|
Packit Service |
a8c26c |
Only
|
|
Packit Service |
a8c26c |
.L HASH_ALLOCATE
|
|
Packit Service |
a8c26c |
and
|
|
Packit Service |
a8c26c |
.L HASH_FIXED
|
|
Packit Service |
a8c26c |
may be set.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int hashclear(Hash_table_t* tab, int flags)"
|
|
Packit Service |
a8c26c |
Clears the flags for the hash table
|
|
Packit Service |
a8c26c |
.L tab
|
|
Packit Service |
a8c26c |
by masking out
|
|
Packit Service |
a8c26c |
.LR flags .
|
|
Packit Service |
a8c26c |
Only
|
|
Packit Service |
a8c26c |
.L HASH_ALLOCATE
|
|
Packit Service |
a8c26c |
and
|
|
Packit Service |
a8c26c |
.L HASH_FIXED
|
|
Packit Service |
a8c26c |
may be cleared.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "void hashdump(Hash_table_t* tab, int flags)"
|
|
Packit Service |
a8c26c |
Dumps hash table accounting info to standard error.
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L tab
|
|
Packit Service |
a8c26c |
is
|
|
Packit Service |
a8c26c |
.L NULL
|
|
Packit Service |
a8c26c |
then all allocated hash tables are dumped, otherwise only information on
|
|
Packit Service |
a8c26c |
.L tab
|
|
Packit Service |
a8c26c |
is dumped.
|
|
Packit Service |
a8c26c |
If
|
|
Packit Service |
a8c26c |
.L flags
|
|
Packit Service |
a8c26c |
is
|
|
Packit Service |
a8c26c |
.L HASH_BUCKET
|
|
Packit Service |
a8c26c |
then the hash bucket
|
|
Packit Service |
a8c26c |
.I key-value
|
|
Packit Service |
a8c26c |
pairs for each collision chain are also dumped.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "void hashsize(Hash_table_t* tab, int size)"
|
|
Packit Service |
a8c26c |
Changes the size of the hash table
|
|
Packit Service |
a8c26c |
.L tab
|
|
Packit Service |
a8c26c |
to
|
|
Packit Service |
a8c26c |
.L size
|
|
Packit Service |
a8c26c |
where
|
|
Packit Service |
a8c26c |
.L size
|
|
Packit Service |
a8c26c |
must be a power of 2.
|
|
Packit Service |
a8c26c |
Explicit calls to this routine are not necessary as hash tables
|
|
Packit Service |
a8c26c |
are automatically resized.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int strhash(char* name)"
|
|
Packit Service |
a8c26c |
Hashes the null terminated character string
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
using a linear congruent pseudo-random number generator algorithm
|
|
Packit Service |
a8c26c |
and returns a non-negative
|
|
Packit Service |
a8c26c |
.L int
|
|
Packit Service |
a8c26c |
hash value.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "int memhash(char* buf, int siz)"
|
|
Packit Service |
a8c26c |
Hashes the buffer
|
|
Packit Service |
a8c26c |
.L buf
|
|
Packit Service |
a8c26c |
of
|
|
Packit Service |
a8c26c |
.L siz
|
|
Packit Service |
a8c26c |
bytes using a linear congruent pseudo-random number generator algorithm
|
|
Packit Service |
a8c26c |
and returns a non-negative
|
|
Packit Service |
a8c26c |
.L int
|
|
Packit Service |
a8c26c |
hash value.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "long strsum(char* name, long sum)"
|
|
Packit Service |
a8c26c |
Returns a running 31-bit checksum of the string
|
|
Packit Service |
a8c26c |
.L name
|
|
Packit Service |
a8c26c |
where
|
|
Packit Service |
a8c26c |
.L sum
|
|
Packit Service |
a8c26c |
is
|
|
Packit Service |
a8c26c |
.L 0
|
|
Packit Service |
a8c26c |
on the first call and
|
|
Packit Service |
a8c26c |
the return value from a previous
|
|
Packit Service |
a8c26c |
.L memsum
|
|
Packit Service |
a8c26c |
or
|
|
Packit Service |
a8c26c |
.L strsum
|
|
Packit Service |
a8c26c |
call otherwise.
|
|
Packit Service |
a8c26c |
The checksum value is consistent across all implementations.
|
|
Packit Service |
a8c26c |
.TP
|
|
Packit Service |
a8c26c |
.L "long memsum(char* buf, int siz, long sum)"
|
|
Packit Service |
a8c26c |
Returns a running 31-bit checksum of buffer
|
|
Packit Service |
a8c26c |
.L buf
|
|
Packit Service |
a8c26c |
of
|
|
Packit Service |
a8c26c |
.L siz
|
|
Packit Service |
a8c26c |
bytes where
|
|
Packit Service |
a8c26c |
.L sum
|
|
Packit Service |
a8c26c |
is
|
|
Packit Service |
a8c26c |
.L 0
|
|
Packit Service |
a8c26c |
on the first call and
|
|
Packit Service |
a8c26c |
the return value from a previous
|
|
Packit Service |
a8c26c |
.L memsum
|
|
Packit Service |
a8c26c |
or
|
|
Packit Service |
a8c26c |
.L strsum
|
|
Packit Service |
a8c26c |
call otherwise.
|
|
Packit Service |
a8c26c |
The checksum value is consistent across all implementations.
|
|
Packit Service |
a8c26c |
.SH "SEE ALSO"
|
|
Packit Service |
a8c26c |
sum(1)
|