From: Jim Meyering <meyering@redhat.com>
Date: Sat, 29 Nov 2008 15:08:09 +0000 (+0100)
Subject: fts: fix a thinko
X-Git-Tag: v0.1~6641
X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=d4b129b8e5f8a8d1198020fd6fc79310d305936c;p=gnulib.git

fts: fix a thinko

* lib/fts.c (s_ifmt_shift_bits): Remove function.  Not needed after all.
(set_stat_type): Return S_IF*-valued "type" directly.
Prompted by James Youngman's spotting a related bug.
Confirmed by further testing through find.
---

diff --git a/ChangeLog b/ChangeLog
index 9a4ae1f3f7..2c90f3665d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2008-11-29  Jim Meyering  <meyering@redhat.com>
 
+	fts: fix a thinko
+	* lib/fts.c (s_ifmt_shift_bits): Remove function.  Not needed after all.
+	(set_stat_type): Return S_IF*-valued "type" directly.
+	Prompted by James Youngman's spotting a related bug.
+	Confirmed by further testing through find.
+
 	fts: provide dirent.d_type via FTSENT.fts_statp, when possible
 	* lib/fts.c (D_TYPE): Define.
 	(DT_UNKNOWN, DT_BLK, DT_CHR) [HAVE_STRUCT_DIRENT_D_TYPE]: Define.
diff --git a/lib/fts.c b/lib/fts.c
index 35def60cf4..4689e80ad8 100644
--- a/lib/fts.c
+++ b/lib/fts.c
@@ -1011,26 +1011,6 @@ fts_compare_ino (struct _ftsent const **a, struct _ftsent const **b)
 	  : b[0]->fts_statp->st_ino < a[0]->fts_statp->st_ino ? 1 : 0);
 }
 
-/* Return the number of bits by which a d_type value must be shifted
-   left in order to put it into the S_IFMT bits of stat.st_mode.  */
-static int
-s_ifmt_shift_bits (void)
-{
-  unsigned int v = S_IFMT; /* usually, 0170000 */
-  static const int MultiplyDeBruijnBitPosition[32] =
-    {
-      0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
-      31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
-    };
-
-  /* Find the smallest power of two, P (e.g., 0010000) such that P & V == P. */
-  unsigned int p = v ^ (v & (v - 1));
-
-  /* Compute and return r = log2 (p), using code from
-     http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn */
-  return MultiplyDeBruijnBitPosition[(uint32_t) (p * 0x077CB531UL) >> 27];
-}
-
 /* Map the dirent.d_type value, DTYPE, to the corresponding stat.st_mode
    S_IF* bit and set ST.st_mode, thus clearing all other bits in that field.  */
 static void
@@ -1063,7 +1043,7 @@ set_stat_type (struct stat *st, unsigned int dtype)
     default:
       type = 0;
     }
-  st->st_mode = dtype << s_ifmt_shift_bits ();
+  st->st_mode = type;
 }
 
 /*