Mercurial > hg > octave-nkf > gnulib-hg
changeset 9226:b7de93942166
New module, file-set.
* modules/file-set: Define it.
* lib/file-set.c, lib/file-set.h: Implement.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Tue, 25 Sep 2007 22:17:24 +0200 |
parents | 5a4ec2c38ec4 |
children | 484ada1ccebf |
files | ChangeLog lib/file-set.c lib/file-set.h modules/file-set |
diffstat | 4 files changed, 118 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2007-09-27 Jim Meyering <jim@meyering.net> + 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.
new file mode 100644 --- /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 <config.h> +#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); +}
new file mode 100644 --- /dev/null +++ b/lib/file-set.h @@ -0,0 +1,12 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <stdbool.h> + +#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);
new file mode 100644 --- /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