(root)/
findutils-4.9.0/
gl/
lib/
hash-triple-simple.c
       1  /* Hash functions for file-related triples: name, device, inode.
       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  
      21  /* Specification.  */
      22  #include "hash-triple.h"
      23  
      24  #include <stdlib.h>
      25  #include <string.h>
      26  
      27  #include "hash-pjw.h"
      28  #include "same-inode.h"
      29  
      30  #define STREQ(a, b) (strcmp (a, b) == 0)
      31  
      32  /* Hash an F_triple, and *do* consider the file name.  */
      33  size_t
      34  triple_hash (void const *x, size_t table_size)
      35  {
      36    struct F_triple const *p = x;
      37    size_t tmp = hash_pjw (p->name, table_size);
      38  
      39    /* Ignoring the device number here should be fine.  */
      40    return (tmp ^ p->st_ino) % table_size;
      41  }
      42  
      43  /* Compare two F_triple structs.  */
      44  bool
      45  triple_compare_ino_str (void const *x, void const *y)
      46  {
      47    struct F_triple const *a = x;
      48    struct F_triple const *b = y;
      49    return (SAME_INODE (*a, *b) && STREQ (a->name, b->name)) ? true : false;
      50  }
      51  
      52  /* Free an F_triple.  */
      53  void
      54  triple_free (void *x)
      55  {
      56    struct F_triple *a = x;
      57    free (a->name);
      58    free (a);
      59  }