diff options
author | Jim Meyering <jim@meyering.net> | 2007-09-25 22:17:24 +0200 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2007-09-27 10:49:02 +0200 |
commit | 024eeefda59f214eeaac745db9f3e982b9a726c3 (patch) | |
tree | 8358bccacbe2a6f32952a9e337317377aec0077b /lib/file-set.c | |
parent | 04f24b87c679a32a13ccbce418fc04aef8ce16cd (diff) | |
download | gnulib-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.c | 75 |
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); +} |