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.  */
28void
29record_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.  */
60bool
61seen_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}
75