coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] di-set: provide a lookup method


From: Jim Meyering
Subject: [PATCH] di-set: provide a lookup method
Date: Mon, 07 Feb 2011 15:51:42 +0100

I'm about to propose a patch to patch that requires this
new method, so add it here, and I will shortly move the
di-set and ino-map modules to gnulib.

>From b9fc790ddc0db2522b0d20d08fd2b8d40ef0fa4e Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Mon, 7 Feb 2011 15:46:09 +0100
Subject: [PATCH] di-set: provide a lookup method

This is required for patch, and hence is about to move to gnulib.
* gl/lib/di-set.c (di_set_lookup): New function.
* gl/lib/di-set.h: Declare it.
* gl/tests/test-di-set.c (main): Exercise it.

The bug was introduced on 2004-12-04 via commit 7380cf79.
---
 gl/lib/di-set.c        |   22 ++++++++++++++++++++++
 gl/lib/di-set.h        |    2 ++
 gl/tests/test-di-set.c |    2 ++
 3 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/gl/lib/di-set.c b/gl/lib/di-set.c
index 05d24d6..5e839a3 100644
--- a/gl/lib/di-set.c
+++ b/gl/lib/di-set.c
@@ -235,3 +235,25 @@ di_set_insert (struct di_set *dis, dev_t dev, ino_t ino)
   /* Put I into the inode set.  */
   return hash_insert0 (ino_set, (void *) i, NULL);
 }
+
+/* Look up the DEV,INO pair in the set DIS.
+   If found, return 1; if not found, return 0.
+   Upon any failure return -1.  */
+int
+di_set_lookup (struct di_set *dis, dev_t dev, ino_t ino)
+{
+  hashint i;
+
+  /* Map the device number to a set of inodes.  */
+  struct hash_table *ino_set = map_device (dis, dev);
+  if (! ino_set)
+    return -1;
+
+  /* Map the inode number to a small representative I.  */
+  i = map_inode_number (dis, ino);
+  if (i == INO_MAP_INSERT_FAILURE)
+    return -1;
+
+  /* Perform the look-up.  */
+  return !!hash_lookup (ino_set, (void const *) i);
+}
diff --git a/gl/lib/di-set.h b/gl/lib/di-set.h
index d30a31e..f05e876 100644
--- a/gl/lib/di-set.h
+++ b/gl/lib/di-set.h
@@ -10,3 +10,5 @@
 struct di_set *di_set_alloc (void);
 int di_set_insert (struct di_set *, dev_t, ino_t) _ATTRIBUTE_NONNULL_ (1);
 void di_set_free (struct di_set *) _ATTRIBUTE_NONNULL_ (1);
+int di_set_lookup (struct di_set *dis, dev_t dev, ino_t ino)
+  _ATTRIBUTE_NONNULL_ (1);;
diff --git a/gl/tests/test-di-set.c b/gl/tests/test-di-set.c
index 7fca4d4..5de8da2 100644
--- a/gl/tests/test-di-set.c
+++ b/gl/tests/test-di-set.c
@@ -42,10 +42,12 @@ main (void)
   struct di_set *dis = di_set_alloc ();
   ASSERT (dis);

+  ASSERT (di_set_lookup (dis, 2, 5) == 0); /* initial lookup fails */
   ASSERT (di_set_insert (dis, 2, 5) == 1); /* first insertion succeeds */
   ASSERT (di_set_insert (dis, 2, 5) == 0); /* duplicate fails */
   ASSERT (di_set_insert (dis, 3, 5) == 1); /* diff dev, duplicate inode is ok 
*/
   ASSERT (di_set_insert (dis, 2, 8) == 1); /* same dev, different inode is ok 
*/
+  ASSERT (di_set_lookup (dis, 2, 5) == 1); /* now, the lookup succeeds */

   /* very large (or negative) inode number */
   ASSERT (di_set_insert (dis, 5, (ino_t) -1) == 1);
--
1.7.4.2.g597a6



reply via email to

[Prev in Thread] Current Thread [Next in Thread]