2009-04-22 20:04:28 +02:00

130 lines
2.7 KiB
C

/*
map.c - a map (associative array) implementation
Copyright (c) 2002 - 2003 dbjh
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "map.h"
#if defined DJGPP && defined DLL
#include "dxedll_priv.h"
#endif
st_map_t *
map_create (int n_elements)
{
st_map_t *map;
int size = sizeof (st_map_t) + n_elements * sizeof (st_map_element_t);
if ((map = (st_map_t *) malloc (size)) == NULL)
{
fprintf (stderr, "ERROR: Not enough memory for buffer (%d bytes)\n", size);
exit (1);
}
map->data = (st_map_element_t *) (((unsigned char *) map) + sizeof (st_map_t));
memset (map->data, MAP_FREE_KEY, n_elements * sizeof (st_map_element_t));
map->size = n_elements;
map->cmp_key = map_cmp_key_def;
return map;
}
void
map_copy (st_map_t *dest, st_map_t *src)
{
memcpy (dest->data, src->data, src->size * sizeof (st_map_element_t));
dest->cmp_key = src->cmp_key;
}
int
map_cmp_key_def (void *key1, void *key2)
{
return key1 != key2;
}
st_map_t *
map_put (st_map_t *map, void *key, void *object)
{
int n = 0;
while (n < map->size && map->data[n].key != MAP_FREE_KEY &&
map->cmp_key (map->data[n].key, key))
n++;
if (n == map->size) // current map is full
{
int new_size = map->size + 20;
st_map_t *map2;
map2 = map_create (new_size);
map_copy (map2, map);
free (map);
map = map2;
}
map->data[n].key = key;
map->data[n].object = object;
return map;
}
void *
map_get (st_map_t *map, void *key)
{
int n = 0;
while (n < map->size && map->cmp_key (map->data[n].key, key))
n++;
if (n == map->size)
return NULL;
return map->data[n].object;
}
void
map_del (st_map_t *map, void *key)
{
int n = 0;
while (n < map->size && map->cmp_key (map->data[n].key, key))
n++;
if (n < map->size)
map->data[n].key = MAP_FREE_KEY;
}
void
map_dump (st_map_t *map)
{
int n = 0;
while (n < map->size)
{
printf ("%p -> %p\n", map->data[n].key, map->data[n].object);
n++;
}
}