1 /* Specialized functions to manipulate a set of files. 2 Copyright (C) 2007, 2009-2021 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 <https://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 already 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 }