meta-flow: New library for working with fields by id.
[sliver-openvswitch.git] / lib / util.c
index 0b82318..5e90ecb 100644 (file)
@@ -301,9 +301,9 @@ set_program_name__(const char *argv0, const char *date, const char *time)
 
 /* Returns a pointer to a string describing the program version.  The
  * caller must not modify or free the returned string.
- */ 
+ */
 const char *
-get_program_version()
+get_program_version(void)
 {
     return program_version;
 }
@@ -663,3 +663,36 @@ log_2_floor(uint32_t n)
     }
 #endif
 }
+
+/* Returns the number of trailing 0-bits in 'n', or 32 if 'n' is 0. */
+int
+ctz(uint32_t n)
+{
+    if (!n) {
+        return 32;
+    } else {
+#if !defined(UINT_MAX) || !defined(UINT32_MAX)
+#error "Someone screwed up the #includes."
+#elif __GNUC__ >= 4 && UINT_MAX == UINT32_MAX
+        return __builtin_ctz(n);
+#else
+        unsigned int k;
+        int count = 31;
+
+#define CTZ_STEP(X)                             \
+        k = n << (X);                           \
+        if (k) {                                \
+            count -= X;                         \
+            n = k;                              \
+        }
+        CTZ_STEP(16);
+        CTZ_STEP(8);
+        CTZ_STEP(4);
+        CTZ_STEP(2);
+        CTZ_STEP(1);
+#undef CTZ_STEP
+
+        return count;
+#endif
+    }
+}