struct/buf.c: Add functions for serializing and deserializing `kludge64'.
[mLib] / struct / buf.h
index b96a886..97dbd10 100644 (file)
 #  include "dstr.h"
 #endif
 
+#ifndef MLIB_MACROS_H
+#  include "macros.h"
+#endif
+
 /*----- Data structures ---------------------------------------------------*/
 
 /* --- Buffers --- *
@@ -71,8 +75,14 @@ typedef struct buf {
 #define BBAD(b) ((b)->f & BF_BROKEN)
 #define BOK(b) (!BBAD(b))
 
-#define BENSURE(b, sz)                                                 \
-  (BBAD(b) ? -1 : (sz) > BLEFT(b) ? (b)->f |= BF_BROKEN, -1 : 0)
+#if GCC_VERSION_P(8, 0)
+#  define BENSURE(b, sz)                                               \
+     MUFFLE_WARNINGS_EXPR(GCC_WARNING("-Wint-in-bool-context"),                \
+       (BBAD(b) ? -1 : (sz) > BLEFT(b) ? (b)->f |= BF_BROKEN, -1 : 0))
+#else
+#  define BENSURE(b, sz)                                               \
+     (BBAD(b) ? -1 : (sz) > BLEFT(b) ? (b)->f |= BF_BROKEN, -1 : 0)
+#endif
 
 #define BUF_DOSUFFIXES(_) DOUINTCONV(_) _(z, z, z)
 
@@ -189,6 +199,20 @@ extern int buf_putbyte(buf */*b*/, int /*ch*/);
   extern int buf_getu##w(buf */*b*/, uint##n */*w*/);
 DOUINTCONV(BUF_DECL_GETU_)
 
+/* --- @buf_getk64{,l,b}@ --- *
+ *
+ * Arguments:  @buf *b@ = pointer to a buffer block
+ *             @kludge64 *w@ = where to put the word
+ *
+ * Returns:    Zero if OK, or nonzero if there wasn't a word there.
+ *
+ * Use:                Gets a word of appropriate size and order from a buffer.
+ */
+
+extern int buf_getk64(buf */*b*/, kludge64 */*w*/);
+extern int buf_getk64l(buf */*b*/, kludge64 */*w*/);
+extern int buf_getk64b(buf */*b*/, kludge64 */*w*/);
+
 /* --- @buf_putu{8,{16,24,32,64}{,l,b}}@ --- *
  *
  * Arguments:  @buf *b@ = pointer to a buffer block
@@ -203,6 +227,20 @@ DOUINTCONV(BUF_DECL_GETU_)
   extern int buf_putu##w(buf */*b*/, uint##n /*w*/);
 DOUINTCONV(BUF_DECL_PUTU_)
 
+/* --- @buf_putk64{,l,b}@ --- *
+ *
+ * Arguments:  @buf *b@ = pointer to a buffer block
+ *             @kludge64 w@ = word to write
+ *
+ * Returns:    Zero if OK, or nonzero if there wasn't enough space
+ *
+ * Use:                Gets a word of appropriate size and order from a buffer.
+ */
+
+extern int buf_putk64(buf */*b*/, kludge64 /*w*/);
+extern int buf_putk64l(buf */*b*/, kludge64 /*w*/);
+extern int buf_putk64b(buf */*b*/, kludge64 /*w*/);
+
 /* --- @buf_getmem{8,{16,24,32,64}{,l,b},z} --- *
  *
  * Arguments:  @buf *b@ = pointer to a buffer block