summaryrefslogtreecommitdiff
path: root/lib/file-set.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2007-09-25 22:17:24 +0200
committerJim Meyering <jim@meyering.net>2007-09-27 10:49:02 +0200
commit024eeefda59f214eeaac745db9f3e982b9a726c3 (patch)
tree8358bccacbe2a6f32952a9e337317377aec0077b /lib/file-set.c
parent04f24b87c679a32a13ccbce418fc04aef8ce16cd (diff)
downloadgnulib-024eeefda59f214eeaac745db9f3e982b9a726c3.tar.gz
New module, file-set.
* modules/file-set: Define it. * lib/file-set.c, lib/file-set.h: Implement.
Diffstat (limited to 'lib/file-set.c')
-rw-r--r--lib/file-set.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/file-set.c b/lib/file-set.c
new file mode 100644
index 0000000000..aa4816c87c
--- /dev/null
+++ b/lib/file-set.c
@@ -0,0 +1,75 @@
+/* Specialized functions to manipulate a set of files.
+ Copyright (C) 2007 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
+ the Free Software Foundation; either version 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+#include "file-set.h"
+
+#include "hash-triple.h"
+#include "xalloc.h"
+
+/* Record file, FILE, and dev/ino from *STATS, in the hash table, HT.
+ If HT is NULL, return immediately.
+ If memory allocation fails, exit immediately. */
+void
+record_file (Hash_table *ht, char const *file, struct stat const *stats)
+{
+ struct F_triple *ent;
+
+ if (ht == NULL)
+ return;
+
+ ent = xmalloc (sizeof *ent);
+ ent->name = xstrdup (file);
+ ent->st_ino = stats->st_ino;
+ ent->st_dev = stats->st_dev;
+
+ {
+ struct F_triple *ent_from_table = hash_insert (ht, ent);
+ if (ent_from_table == NULL)
+ {
+ /* Insertion failed due to lack of memory. */
+ xalloc_die ();
+ }
+
+ if (ent_from_table != ent)
+ {
+ /* There was alread a matching entry in the table, so ENT was
+ not inserted. Free it. */
+ triple_free (ent);
+ }
+ }
+}
+
+/* Return true if there is an entry in hash table, HT,
+ for the file described by FILE and STATS. */
+bool
+seen_file (Hash_table const *ht, char const *file,
+ struct stat const *stats)
+{
+ struct F_triple new_ent;
+
+ if (ht == NULL)
+ return false;
+
+ new_ent.name = (char *) file;
+ new_ent.st_ino = stats->st_ino;
+ new_ent.st_dev = stats->st_dev;
+
+ return !!hash_lookup (ht, &new_ent);
+}