#include <string.h>
#include "buf.h"
+#include "macros.h"
/*----- Main code ---------------------------------------------------------*/
}
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
}
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
{ \
uint##n sz; \
if (buf_getu##w(b, &sz)) return (0); \
+ if (BENSURE(b, sz)) return (0); \
*nn = sz; \
return (buf_get(b, sz)); \
}
#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); \