From 024eeefda59f214eeaac745db9f3e982b9a726c3 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 25 Sep 2007 22:17:24 +0200 Subject: [PATCH] New module, file-set. * modules/file-set: Define it. * lib/file-set.c, lib/file-set.h: Implement. --- ChangeLog | 4 +++ lib/file-set.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/file-set.h | 12 +++++++++ modules/file-set | 27 ++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 lib/file-set.c create mode 100644 lib/file-set.h create mode 100644 modules/file-set diff --git a/ChangeLog b/ChangeLog index 740ac8f39..7b96aaf31 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2007-09-27 Jim Meyering + New module, file-set. + * modules/file-set: Define it. + * lib/file-set.c, lib/file-set.h: Implement. + New module, hash-triple. * modules/hash-triple: Define it. * lib/hash-triple.c, lib/hash-triple.h: Implement. diff --git a/lib/file-set.c b/lib/file-set.c new file mode 100644 index 000000000..aa4816c87 --- /dev/null +++ b/lib/file-set.c @@ -0,0 +1,75 @@ +/* Specialized functions to manipulate a set of files. + Copyright (C) 2007 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* written by Jim Meyering */ + +#include +#include "file-set.h" + +#include "hash-triple.h" +#include "xalloc.h" + +/* Record file, FILE, and dev/ino from *STATS, in the hash table, HT. + If HT is NULL, return immediately. + If memory allocation fails, exit immediately. */ +void +record_file (Hash_table *ht, char const *file, struct stat const *stats) +{ + struct F_triple *ent; + + if (ht == NULL) + return; + + ent = xmalloc (sizeof *ent); + ent->name = xstrdup (file); + ent->st_ino = stats->st_ino; + ent->st_dev = stats->st_dev; + + { + struct F_triple *ent_from_table = hash_insert (ht, ent); + if (ent_from_table == NULL) + { + /* Insertion failed due to lack of memory. */ + xalloc_die (); + } + + if (ent_from_table != ent) + { + /* There was alread a matching entry in the table, so ENT was + not inserted. Free it. */ + triple_free (ent); + } + } +} + +/* Return true if there is an entry in hash table, HT, + for the file described by FILE and STATS. */ +bool +seen_file (Hash_table const *ht, char const *file, + struct stat const *stats) +{ + struct F_triple new_ent; + + if (ht == NULL) + return false; + + new_ent.name = (char *) file; + new_ent.st_ino = stats->st_ino; + new_ent.st_dev = stats->st_dev; + + return !!hash_lookup (ht, &new_ent); +} diff --git a/lib/file-set.h b/lib/file-set.h new file mode 100644 index 000000000..a5a159e94 --- /dev/null +++ b/lib/file-set.h @@ -0,0 +1,12 @@ +#include +#include +#include + +#include "hash.h" + +extern void record_file (Hash_table *ht, char const *file, + struct stat const *stats) + __attribute__((nonnull(2, 3))); + +extern bool seen_file (Hash_table const *ht, char const *file, + struct stat const *stats); diff --git a/modules/file-set b/modules/file-set new file mode 100644 index 000000000..7895cdac1 --- /dev/null +++ b/modules/file-set @@ -0,0 +1,27 @@ +Description: +Very specialized set-of-files code. + +Files: +lib/file-set.c +lib/file-set.h + +Depends-on: +hash +hash-triple +stdbool +xalloc +xalloc-die + +configure.ac: + +Makefile.am: +lib_SOURCES += file-set.c + +Include: +"file-set.h" + +License: +GPL + +Maintainer: +Jim Meyering -- 2.11.0