struct/buf.c: Add functions for serializing and deserializing `kludge64'.
[mLib] / struct / buf.c
index 1ac6bb9..11b1425 100644 (file)
@@ -31,6 +31,7 @@
 #include <string.h>
 
 #include "buf.h"
+#include "macros.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -186,6 +187,34 @@ int buf_putbyte(buf *b, int ch)
   }
 DOUINTCONV(BUF_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.
+ */
+
+int buf_getk64(buf *b, kludge64 *w)
+{
+  if (BENSURE(b, 8)) return (-1);
+  LOAD64_(*w, b->p); BSTEP(b, 8); return (0);
+}
+
+int buf_getk64l(buf *b, kludge64 *w)
+{
+  if (BENSURE(b, 8)) return (-1);
+  LOAD64_L_(*w, b->p); BSTEP(b, 8); return (0);
+}
+
+int buf_getk64b(buf *b, kludge64 *w)
+{
+  if (BENSURE(b, 8)) return (-1);
+  LOAD64_B_(*w, b->p); BSTEP(b, 8); return (0);
+}
+
 /* --- @buf_putu{8,{16,24,32,64}{,l,b}}@ --- *
  *
  * Arguments:  @buf *b@ = pointer to a buffer block
@@ -206,6 +235,34 @@ DOUINTCONV(BUF_GETU_)
   }
 DOUINTCONV(BUF_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.
+ */
+
+int buf_putk64(buf *b, kludge64 w)
+{
+  if (BENSURE(b, 8)) return (-1);
+  STORE64_(b->p, w); BSTEP(b, 8); return (0);
+}
+
+int buf_putk64l(buf *b, kludge64 w)
+{
+  if (BENSURE(b, 8)) return (-1);
+  STORE64_L_(b->p, w); BSTEP(b, 8); return (0);
+}
+
+int buf_putk64b(buf *b, kludge64 w)
+{
+  if (BENSURE(b, 8)) return (-1);
+  STORE64_B_(b->p, w); BSTEP(b, 8); return (0);
+}
+
 /* --- @findz@ --- *
  *
  * Arguments:  @buf *b@ = pointer to a buffer block
@@ -246,6 +303,7 @@ static int findz(buf *b, size_t *nn)
   {                                                                    \
     uint##n sz;                                                                \
     if (buf_getu##w(b, &sz)) return (0);                               \
+    if (BENSURE(b, sz)) return (0);                                    \
     *nn = sz;                                                          \
     return (buf_get(b, sz));                                           \
   }
@@ -273,7 +331,9 @@ void *buf_getmemz(buf *b, size_t *nn)
 #define BUF_PUTMEM_(n, W, w)                                           \
   int buf_putmem##w(buf *b, const void *p, size_t sz)                  \
   {                                                                    \
-    assert(sz <= MASK##W);                                             \
+    MUFFLE_WARNINGS_STMT                                               \
+      (CLANG_WARNING("-Wtautological-constant-out-of-range-compare"),  \
+       { assert(sz <= MASK##W); });                                    \
     if (buf_putu##w(b, sz) || buf_put(b, p, sz))                       \
       return (-1);                                                     \
     return (0);                                                                \