Line data Source code
1 : /* Specialized functions to manipulate a set of files.
2 : Copyright (C) 2007 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 196 : record_file (Hash_table *ht, char const *file, struct stat const *stats)
30 : {
31 : struct F_triple *ent;
32 :
33 196 : if (ht == NULL)
34 184 : return;
35 :
36 12 : ent = xmalloc (sizeof *ent);
37 12 : ent->name = xstrdup (file);
38 12 : ent->st_ino = stats->st_ino;
39 12 : ent->st_dev = stats->st_dev;
40 :
41 : {
42 12 : struct F_triple *ent_from_table = hash_insert (ht, ent);
43 12 : if (ent_from_table == NULL)
44 : {
45 : /* Insertion failed due to lack of memory. */
46 0 : xalloc_die ();
47 : }
48 :
49 12 : 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 0 : 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 177 : seen_file (Hash_table const *ht, char const *file,
62 : struct stat const *stats)
63 : {
64 : struct F_triple new_ent;
65 :
66 177 : if (ht == NULL)
67 163 : return false;
68 :
69 14 : new_ent.name = (char *) file;
70 14 : new_ent.st_ino = stats->st_ino;
71 14 : new_ent.st_dev = stats->st_dev;
72 :
73 14 : return !!hash_lookup (ht, &new_ent);
74 : }
|