X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fhmapx.c;h=aab7629d74c1df188fc9f4fd2db0c265762a4ffd;hb=5d1c47b1ef2d392ce223606139d45eac749d4c80;hp=d73245084178025d2f550c47af66487590310b7a;hpb=8af88c0b7ea2fe75df7e45497988ed0371006a86;p=pspp diff --git a/src/libpspp/hmapx.c b/src/libpspp/hmapx.c index d732450841..aab7629d74 100644 --- a/src/libpspp/hmapx.c +++ b/src/libpspp/hmapx.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008, 2009, 2010, 2012 Free Software Foundation, Inc. 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 @@ -18,9 +18,9 @@ #include #endif -#include +#include "libpspp/hmapx.h" #include -#include "xalloc.h" +#include "gl/xalloc.h" /* Frees the memory, if any, allocated by hash map MAP, including all hmapx_nodes that it contains. The user-defined data items @@ -28,27 +28,41 @@ items should be freed, then it should be done by iterating through MAP's contents before destroying MAP. */ void -hmapx_destroy (struct hmapx *map) +hmapx_destroy (struct hmapx *map) { - if (map != NULL) + if (map != NULL) { - if (hmapx_count (map) > 0) + if (!(hmapx_is_empty (map))) { struct hmapx_node *node, *next; for (node = hmapx_first (map); node != NULL; node = next) { next = hmapx_next (map, node); - free (node); + free (node); } } hmap_destroy (&map->hmap); } } +/* Removes all hmapx_nodes from MAP and frees them. The user-defined data + items that the hmapx_nodes point to are not affected. */ +void +hmapx_clear (struct hmapx *map) +{ + struct hmapx_node *node, *next; + + for (node = hmapx_first (map); node; node = next) + { + next = hmapx_next (map, node); + hmapx_delete (map, node); + } +} + /* Allocates and returns a new hmapx_node with DATA as its data item. */ static struct hmapx_node * -make_hmapx_node (void *data) +make_hmapx_node (void *data) { struct hmapx_node *node = xmalloc (sizeof *node); node->data = data; @@ -70,7 +84,7 @@ make_hmapx_node (void *data) then the client must check for duplicates itself before inserting the new item. */ struct hmapx_node * -hmapx_insert (struct hmapx *map, void *data, size_t hash) +hmapx_insert (struct hmapx *map, void *data, size_t hash) { struct hmapx_node *node = make_hmapx_node (data); hmap_insert (&map->hmap, &node->hmap_node, hash); @@ -91,7 +105,7 @@ hmapx_insert (struct hmapx *map, void *data, size_t hash) then the client must check for duplicates itself before inserting the new node. */ struct hmapx_node * -hmapx_insert_fast (struct hmapx *map, void *data, size_t hash) +hmapx_insert_fast (struct hmapx *map, void *data, size_t hash) { struct hmapx_node *node = make_hmapx_node (data); hmap_insert_fast (&map->hmap, &node->hmap_node, hash);