Select Git revision
hash-map-test-01.c
Peter Gerwinski authored
hash-map-test-01.c 2.00 KiB
#include <stdio.h>
#include <errno.h>
#include <error.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
const int ERROR = -1;
const int size = 1117;
const int bufsize = 100;
int n[size]; // zunächst: alle 0
const char *check[size]; // zunächst: alle NULL
constexpr int hash (const char *name)
{
// Cantor pairing function
uint8_t n0 = name ? name[0] : 0;
uint8_t n1 = n0 ? name[1] : 0;
uint8_t n2 = n1 ? name[2] : 0;
return ((n0 + n1) / 2 * (n0 + n1 + 1) + n2) % size;
}
void put_number (const char *name, int value)
{
int idx = hash (name);
if (check[idx] && strcmp (check[idx], name) != 0)
fprintf (stderr, "occupied: %s = %d\n", name, value);
else
{
check[idx] = name;
n[idx] = value;
}
}
int get_number (const char *name)
{
int value = ERROR;
int idx = hash (name);
if (check[idx] && strcmp (check[idx], name) == 0)
value = n[idx];
else
fprintf (stderr, "not found: %s\n", name);
return value;
}
static void read_data (FILE *f, char **name, int *value)
{
int v;
char buffer[bufsize];
fscanf (f, "%d", &v);
fgets (buffer, bufsize - 1, f);
int l = strlen (buffer);
if (l > 0 && buffer[l - 1] == '\n')
buffer[l - 1] = 0;
const char *n = buffer;
while (n[0] == ' ')
n++;
l = strlen (n);
if (*name == NULL)
*name = (char *) malloc (l);
strncpy (*name, n, l + 1);
*value = v;
}
int main (int argc, char **argv)
{
const char *filename = "hash-test.dat";
if (argc > 1)
filename = argv[1];
FILE *f = fopen (filename, "r");
if (!f)
error (errno, errno, "cannot open file \"%s\"", filename);
while (!feof (f))
{
int value;
char *name = NULL;
read_data (f, &name, &value);
put_number (name, value);
}
rewind (f);
while (!feof (f))
{
int value;
char name[bufsize];
char *p = name;
read_data (f, &p, &value);
int v = get_number (name);
if (v != value)
printf ("%s: %d instead of %d\n", name, v, value);
}
fclose (f);
return 0;
}