*/
extern void dbuf_create(dbuf */*db*/);
+#define DBCREATE(db) do { \
+ (db)->_b.base = (db)->_b.p = (db)->_b.limit = 0; \
+ (db)->_b.f = BF_ALLOC | BF_WRITE; \
+ (db)->a = &arena_stdlib; (db)->sz = 0; \
+} while (0)
/* --- @dbuf_reset@ --- *
*
*/
extern void dbuf_reset(dbuf */*db*/);
-
#define DBRESET(db) do { \
(db)->_b.p = (db)->_b.base; (db)->_b.limit = (db)->_b.base + (db)->sz; \
(db)->_b.f = ((db)->_b.f&~BF_BROKEN) | BF_WRITE; \
*/
extern void dbuf_destroy(dbuf */*db*/);
+#define DBDESTROY(db) do { \
+ if ((db)->_b.base) x_free((db)->a, (db)->_b.base); \
+ (db)->_b.base = (db)->_b.p = (db)->_b.limit = 0; \
+ (db)->_b.f = BF_ALLOC | BF_WRITE; (db)->sz = 0; \
+} while (0)
/* --- @{,d}buf_break@ --- *
*
extern int buf_break(buf */*b*/);
extern int dbuf_break(dbuf */*db*/);
#define dbuf_break(db) (buf_break(DBUF_BUF(db)))
+#define BBREAK(b) do { (b)->f |= BF_BROKEN; } while (0)
+#define DBBREAK(db) BBREAK(DBUF_BUF(db))
/* --- @{,d}buf_flip@ --- *
*
/* --- @{,d}buf_getf64{,l,b} --- *
*
- * Arguments: @buf *b@ = pointer to a bfufer block
+ * Arguments: @buf *b@ = pointer to a buffer block
* @double *x_out@ = where to put the result
*
* Returns: Zero on success, @-1@ on failure (and the buffer is broken).
}) \
MC_AFTER(tag##__poke, { \
size_t _delta = BLEN(b) - (mk) - (lensz); \
- assert(check); \
- if (BOK(b)) poke(BBASE(b) + (mk), _delta); \
+ if (!(check)) (b)->f |= BF_BROKEN; \
+ else if (BOK(b)) poke(BBASE(b) + (mk), _delta); \
})
#define DBUF_ENCLOSETAG(tag, b, mk, check, poke, lensz) \
#define BUF_ENCLOSEITAG(tag, b, mk, W) \
BUF_ENCLOSETAG(tag, (b), (mk), (_delta <= MASK##W), STORE##W, SZ_##W)
#define BUF_ENCLOSEKTAG(tag, b, mk, W) \
- BUF_ENCLOSE(tag, (b), (mk), 1, BUF_STORESZK##W, 8)
+ BUF_ENCLOSETAG(tag, (b), (mk), 1, BUF_STORESZK##W, 8)
#define BUF_ENCLOSEZTAG(tag, b) \
MC_AFTER(tag##__zero, { buf_putbyte((b), 0); })
#define BUF_ENCLOSE8(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 8)
#define BUF_ENCLOSE16(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 16)
-#define BUF_ENCLOSE16_B(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 16_B)
#define BUF_ENCLOSE16_L(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 16_L)
+#define BUF_ENCLOSE16_B(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 16_B)
#define BUF_ENCLOSE24(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 24)
-#define BUF_ENCLOSE24_B(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 24_B)
#define BUF_ENCLOSE24_L(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 24_L)
+#define BUF_ENCLOSE24_B(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 24_B)
#define BUF_ENCLOSE32(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 32)
-#define BUF_ENCLOSE32_B(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 32_B)
#define BUF_ENCLOSE32_L(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 32_L)
+#define BUF_ENCLOSE32_B(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 32_B)
#ifdef HAVE_UINT64
# define BUF_ENCLOSE64(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 64)
-# define BUF_ENCLOSE64_B(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 64_B)
# define BUF_ENCLOSE64_L(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 64_L)
+# define BUF_ENCLOSE64_B(b, mk) BUF_ENCLOSEITAG(encl, (b), (mk), 64_B)
#else
# define BUF_ENCLOSE64(b, mk) BUF_ENCLOSEKTAG(encl, (b), (mk), 64)
-# define BUF_ENCLOSE64_B(b, mk) BUF_ENCLOSEKTAG(encl, (b), (mk), 64_B)
# define BUF_ENCLOSE64_L(b, mk) BUF_ENCLOSEKTAG(encl, (b), (mk), 64_L)
+# define BUF_ENCLOSE64_B(b, mk) BUF_ENCLOSEKTAG(encl, (b), (mk), 64_B)
#endif
#define BUF_ENCLOSEZ(b) BUF_ENCLOSEZTAG(encl, (b))
#define DBUF_ENCLOSE8(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 8)
#define DBUF_ENCLOSE16(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 16)
-#define DBUF_ENCLOSE16_B(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 16_B)
#define DBUF_ENCLOSE16_L(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 16_L)
+#define DBUF_ENCLOSE16_B(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 16_B)
#define DBUF_ENCLOSE24(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 24)
-#define DBUF_ENCLOSE24_B(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 24_B)
#define DBUF_ENCLOSE24_L(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 24_L)
+#define DBUF_ENCLOSE24_B(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 24_B)
#define DBUF_ENCLOSE32(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 32)
-#define DBUF_ENCLOSE32_B(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 32_B)
#define DBUF_ENCLOSE32_L(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 32_L)
+#define DBUF_ENCLOSE32_B(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 32_B)
#ifdef HAVE_UINT64
# define DBUF_ENCLOSE64(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 64)
-# define DBUF_ENCLOSE64_B(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 64_B)
# define DBUF_ENCLOSE64_L(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 64_L)
+# define DBUF_ENCLOSE64_B(db, mk) DBUF_ENCLOSEITAG(encl, (db), (mk), 64_B)
#else
# define DBUF_ENCLOSE64(db, mk) DBUF_ENCLOSEKTAG(encl, (db), (mk), 64)
-# define DBUF_ENCLOSE64_B(db, mk) DBUF_ENCLOSEKTAG(encl, (db), (mk), 64_B)
# define DBUF_ENCLOSE64_L(db, mk) DBUF_ENCLOSEKTAG(encl, (db), (mk), 64_L)
+# define DBUF_ENCLOSE64_B(db, mk) DBUF_ENCLOSEKTAG(encl, (db), (mk), 64_B)
#endif
#define DBUF_ENCLOSEZ(db) DBUF_ENCLOSEZTAG(encl, (db))