This example_hash page provides an example of librnr support for hashing.
Example main():
This example is a modified version of the unit test code writen by Kaz Kylheku (kaz@a.nosp@m.shi..nosp@m.footp.nosp@m.rint.nosp@m.s.net), (C) 1997. See also the original EULA in hash.h.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
{
char **tokptr;
va_list arglist;
int tokcount = 0;
va_start(arglist, string);
tokptr = va_arg(arglist, char **);
while(tokptr)
{
while(*string && isspace((int)*string))
{
string++;
}
if(!*string)
{
break;
}
*tokptr = string;
while(*string && !isspace((int)*string))
{
string++;
}
tokptr = va_arg(arglist, char **);
tokcount++;
if(!*string)
{
break;
}
*string++ = 0;
}
va_end(arglist);
return tokcount;
}
{
delete(key);
delete(val);
}
static char *Colorado14ers[][2] =
{
{"mt_elbert", "14,433"},
{"mt_massive", "14,421"},
{"mt_harvard", "14,420"},
{"blanca_peak", "14,345"},
{"la_plata_peak", "14,336"},
{"uncompahgre_peak", "14,309"},
{"crestone_peak", "14,294"},
{"mt_lincoln", "14,286"},
{"grays_peak", "14,270"},
{"mt_antero", "14,269"},
{"torreys_peak", "14,267"},
{"castle_peak", "14,265"},
{"quandary_peak", "14,265"},
{"mt_evans", "14,264"},
{"longs_peak", "14,255"},
{"mt_wilson", "14,246"}
};
{
int mtn;
char buf[64];
char *key, *val;
printf(" starting count=%lu, table size=%lu\n", count, size);
while( count++ < size )
{
mtn = (int)(random() % (long int)num_mtns);
sprintf(buf, "%s(%d)", Colorado14ers[mtn][0], MtnCounter++);
{
puts("hash_insert failed");
return;
}
else
{
printf(" added %s -> %s\n", key, val);
}
}
printf(" ending count=%lu, table size=%lu\n", count, size);
}
{
char *key, *val;
printf(" starting count=%lu, table size=%lu\n", count, size);
{
printf(" deleted %s -> %s\n", key, val);
}
printf(" ending count=%lu, table size=%lu\n", count, size);
}
int main(
int argc,
char *argv[])
{
input_t in;
char *tok1, *tok2;
char *key, *val;
int n;
char *help =
"n create new empty hash table\n"
"x delete entire hash table\n"
"a <key> <val> add value to hash table\n"
"d <key> delete value from hash table\n"
"l <key> lookup value in hash table\n"
"c show counts: number of entries and table size\n"
"t dump whole hash table\n"
"+ force increase hash table (by auto-adding)\n"
"- force decrease hash table (by auto-deleting)\n"
"v <level> set logging verbosity level 0-4\n"
"q quit";
puts("Hashing example (enter '?' for list of commands)");
for(;;)
{
printf("hash> ");
if( !fgets(in, (int)sizeof(input_t), stdin) )
{
break;
}
switch( in[0] )
{
case '?':
puts(help);
break;
case 'n':
if( h != NULL )
{
printf("table exists, delete first\n");
}
else
{
true,
NULL,
NULL,
}
break;
case 'x':
if( h == NULL )
{
printf("no table\n");
}
else
{
}
break;
case 'a':
if( h == NULL )
{
printf("no hash table\n");
}
else if(
tokenize(in+1, &tok1, &tok2, (
char **) 0) != 2)
{
puts("what?");
}
else
{
{
puts("hash_insert failed");
}
}
break;
case 'd':
if( h == NULL )
{
printf("no hash table\n");
}
else if(
tokenize(in+1, &tok1, (
char **)0) != 1)
{
puts("what?");
}
{
puts("hash_lookup failed");
}
else
{
printf("deleted %s -> %s\n", key, val);
}
break;
case 'l':
if( h == NULL )
{
printf("no hash table\n");
}
else if(
tokenize(in+1, &tok1, (
char **) 0) != 1)
{
puts("what?");
}
{
puts("hash_lookup failed");
}
else
{
printf("%s -> %s\n", tok1, val);
}
break;
case 'c':
if( h == NULL )
{
printf("no hash table\n");
}
else
{
printf("count=%lu, size=%lu\n",
}
break;
case 't':
if( h == NULL )
{
printf("no hash table\n");
}
else
{
{
}
}
break;
case '+':
if( h == NULL )
{
printf("no hash table\n");
}
else
{
}
break;
case '-':
if( h == NULL )
{
printf("no hash table\n");
}
else
{
}
break;
case 'v':
if(
tokenize(in+1, &tok1, (
char **)0) != 1 )
{
puts("what?");
}
else
{
n = atoi(tok1);
}
break;
case 'q':
exit(0);
break;
case '\0':
case '\n':
break;
default:
puts("?");
break;
}
}
return 0;
}
Generated output:
$ ../loc/bin.x86_64/example_hash
Hashing example (enter '?' for list of commands)
hash> ?
n create new empty hash table
x delete entire hash table
a <key> <val> add value to hash table
d <key> delete value from hash table
l <key> lookup value in hash table
c show counts: number of entries and table size
t dump whole hash table
+ force increase hash table (by auto-adding)
- force decrease hash table (by auto-deleting)
v <level> set logging verbosity level 0-4
q quit
hash> n
hash> c
count=0, size=4
hash> +
starting count=0, table size=4
added mt_lincoln(0) -> 14,286
added crestone_peak(1) -> 14,294
added mt_antero(2) -> 14,269
added blanca_peak(3) -> 14,345
added mt_massive(4) -> 14,421
added mt_wilson(5) -> 14,246
added torreys_peak(6) -> 14,267
added quandary_peak(7) -> 14,265
ending count=8, table size=8
hash> a mt_cameron 14,238
hash> l mt_cameron
mt_cameron -> 14,238
hash> d blanca_peak(3)
deleted blanca_peak(3) -> 14,345
hash> t
mt_wilson(5) -> 14,246
mt_cameron -> 14,238
torreys_peak(6) -> 14,267
crestone_peak(1) -> 14,294
quandary_peak(7) -> 14,265
mt_massive(4) -> 14,421
mt_lincoln(0) -> 14,286
mt_antero(2) -> 14,269
hash> +
starting count=8, table size=8
added mt_antero(8) -> 14,269
added mt_evans(9) -> 14,264
added torreys_peak(10) -> 14,267
added castle_peak(11) -> 14,265
added mt_harvard(12) -> 14,420
added castle_peak(13) -> 14,265
added blanca_peak(14) -> 14,345
added crestone_peak(15) -> 14,294
ending count=16, table size=16
hash> t
castle_peak(13) -> 14,265
mt_wilson(5) -> 14,246
mt_harvard(12) -> 14,420
castle_peak(11) -> 14,265
quandary_peak(7) -> 14,265
torreys_peak(10) -> 14,267
mt_lincoln(0) -> 14,286
mt_antero(2) -> 14,269
blanca_peak(14) -> 14,345
mt_cameron -> 14,238
crestone_peak(1) -> 14,294
torreys_peak(6) -> 14,267
mt_antero(8) -> 14,269
mt_massive(4) -> 14,421
mt_evans(9) -> 14,264
crestone_peak(15) -> 14,294
hash> -
starting count=16, table size=16
deleted castle_peak(13) -> 14,265
deleted mt_wilson(5) -> 14,246
deleted mt_harvard(12) -> 14,420
deleted castle_peak(11) -> 14,265
deleted quandary_peak(7) -> 14,265
deleted torreys_peak(10) -> 14,267
deleted mt_lincoln(0) -> 14,286
deleted mt_antero(2) -> 14,269
ending count=8, table size=8
hash> -
starting count=8, table size=8
deleted blanca_peak(14) -> 14,345
deleted mt_cameron -> 14,238
deleted crestone_peak(1) -> 14,294
deleted torreys_peak(6) -> 14,267
ending count=4, table size=4
hash> t
mt_antero(8) -> 14,269
mt_massive(4) -> 14,421
mt_evans(9) -> 14,264
crestone_peak(15) -> 14,294
hash> x
hash> q