(root)/
findutils-4.9.0/
gl/
lib/
file-set.c
       1  /* Specialized functions to manipulate a set of files.
       2     Copyright (C) 2007, 2009-2022 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  }