#define ARRAY_SIZE(a) (sizeof(a)/sizeof(*(a)))
#define BYTES(n) ((((uint) (n)) + 7) / 8)
#define CALL(fn, args...) ({ if (fn) fn(args); })
-#define ADVANCE(w, r, l) ({ r -= l; w += l; })
+#define ADVANCE(w, r, l) ({ r -= (l); w += (l); })
static inline int uint_cmp(uint i1, uint i2)
{ return (int)(i1 > i2) - (int)(i1 < i2); }
#define BIT32_CLR(b,p) ((b)[(p)/32] &= ~BIT32_VAL(p))
#define BIT32_ZERO(b,l) memset((b), 0, (l)/8)
+/* The same, but counting bits from MSB */
+#define BIT32R_VAL(p) ((((u32) 1) << 31) >> ((p) % 32))
+#define BIT32R_TEST(b,p) ((b)[(p)/32] & BIT32R_VAL(p))
+#define BIT32R_SET(b,p) ((b)[(p)/32] |= BIT32R_VAL(p))
+#define BIT32R_CLR(b,p) ((b)[(p)/32] &= ~BIT32R_VAL(p))
+#define BIT32R_ZERO(b,l) memset((b), 0, (l)/8)
+
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define UNUSED __attribute__((unused))
#define PACKED __attribute__((packed))
+#ifndef HAVE_THREAD_LOCAL
+#define _Thread_local
+#endif
+
/* Microsecond time */
typedef s64 btime;
#define ASSERT(x) do { if (!(x)) log(L_BUG "Assertion '%s' failed at %s:%d", #x, __FILE__, __LINE__); } while(0)
#endif
+#ifdef DEBUGGING
+asm(
+ ".pushsection \".debug_gdb_scripts\", \"MS\",@progbits,1\n"
+ ".byte 1\n" /* Python */
+ ".asciz \"bird-gdb.py\"\n"
+ ".popsection\n"
+ );
+#endif
+
/* Pseudorandom numbers */
u32 random_u32(void);