maint: update copyright
[gnulib.git] / lib / file-set.c
1 /* Specialized functions to manipulate a set of files.
2    Copyright (C) 2007, 2009-2014 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 /* written by Jim Meyering */
18
19 #include <config.h>
20 #include "file-set.h"
21
22 #include "hash-triple.h"
23 #include "xalloc.h"
24
25 /* Record file, FILE, and dev/ino from *STATS, in the hash table, HT.
26    If HT is NULL, return immediately.
27    If memory allocation fails, exit immediately.  */
28 void
29 record_file (Hash_table *ht, char const *file, struct stat const *stats)
30 {
31   struct F_triple *ent;
32
33   if (ht == NULL)
34     return;
35
36   ent = xmalloc (sizeof *ent);
37   ent->name = xstrdup (file);
38   ent->st_ino = stats->st_ino;
39   ent->st_dev = stats->st_dev;
40
41   {
42     struct F_triple *ent_from_table = hash_insert (ht, ent);
43     if (ent_from_table == NULL)
44       {
45         /* Insertion failed due to lack of memory.  */
46         xalloc_die ();
47       }
48
49     if (ent_from_table != ent)
50       {
51         /* There was alread a matching entry in the table, so ENT was
52            not inserted.  Free it.  */
53         triple_free (ent);
54       }
55   }
56 }
57
58 /* Return true if there is an entry in hash table, HT,
59    for the file described by FILE and STATS.  */
60 bool
61 seen_file (Hash_table const *ht, char const *file,
62            struct stat const *stats)
63 {
64   struct F_triple new_ent;
65
66   if (ht == NULL)
67     return false;
68
69   new_ent.name = (char *) file;
70   new_ent.st_ino = stats->st_ino;
71   new_ent.st_dev = stats->st_dev;
72
73   return !!hash_lookup (ht, &new_ent);
74 }