Stupid bug in float formatting.
[mLib] / bits.h
diff --git a/bits.h b/bits.h
index 175e927..b895dd4 100644 (file)
--- a/bits.h
+++ b/bits.h
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: bits.h,v 1.10 2004/04/08 01:36:11 mdw Exp $
+ * $Id$
  *
  * Portable bit-level manipulation macros
  *
@@ -126,13 +126,32 @@ typedef unsigned char octet;
 
 #define MASK8 0xffu
 #define MASK16 0xffffu
+#define MASK16_L 0xffffu
+#define MASK16_B 0xffffu
 #define MASK24 0xffffffu
+#define MASK24_L 0xffffffu
+#define MASK24_B 0xffffffu
 #define MASK32 0xffffffffu
+#define MASK32_L 0xffffffffu
+#define MASK32_B 0xffffffffu
 
 #ifdef HAVE_UINT64
 #  define MASK64 MLIB_BITS_EXTENSION 0xffffffffffffffffu
 #endif
 
+/* --- Sizes --- */
+
+#define SZ_8 1
+#define SZ_16 2
+#define SZ_16_L 2
+#define SZ_16_B 2
+#define SZ_24 3
+#define SZ_24_L 3
+#define SZ_24_B 3
+#define SZ_32 4
+#define SZ_32_L 4
+#define SZ_32_B 4
+
 /* --- Type coercions --- */
 
 #define U8(x) ((octet)((x) & MASK8))
@@ -217,12 +236,15 @@ typedef unsigned char octet;
      unsigned _s = (s) & 63u;                                          \
      uint32 _l = (v).lo, _h = (v).hi;                                  \
      kludge64 *_d = &(d);                                              \
-     if (_s >= 32) {                                                   \
+     if (_s > 32) {                                                    \
        _d->hi = LSL32(_l, _s - 32u) | LSR32(_h, 64u - _s);             \
        _d->lo = LSL32(_h, _s - 32u) | LSR32(_l, 64u - _s);             \
      } else if (!_s) {                                                 \
        _d->lo = _l;                                                    \
        _d->hi = _h;                                                    \
+     } else if (_s == 32) {                                            \
+       _d->lo = _h;                                                    \
+       _d->hi = _l;                                                    \
      } else {                                                          \
        _d->hi = LSL32(_h, _s) | LSR32(_l, 32u - _s);                   \
        _d->lo = LSL32(_l, _s) | LSR32(_h, 32u - _s);                   \
@@ -232,12 +254,15 @@ typedef unsigned char octet;
      unsigned _s = (s) & 63u;                                          \
      uint32 _l = (v).lo, _h = (v).hi;                                  \
      kludge64 *_d = &(d);                                              \
-     if (_s >= 32) {                                                   \
+     if (_s > 32) {                                                    \
        _d->hi = LSR32(_l, _s - 32u) | LSL32(_h, 64u - _s);             \
        _d->lo = LSR32(_h, _s - 32u) | LSL32(_l, 64u - _s);             \
      } else if (!_s) {                                                 \
        _d->lo = _l;                                                    \
        _d->hi = _h;                                                    \
+     } else if (_s == 32) {                                            \
+       _d->lo = _h;                                                    \
+       _d->hi = _l;                                                    \
      } else {                                                          \
        _d->hi = LSR32(_h, _s) | LSL32(_l, 32u - _s);                   \
        _d->lo = LSR32(_l, _s) | LSL32(_h, 32u - _s);                   \