X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/18c831dcd0ae4d660c70ccac69d27ed2a97851be..refs/heads/master:/struct/buf.c diff --git a/struct/buf.c b/struct/buf.c index 1ac6bb9..11b1425 100644 --- a/struct/buf.c +++ b/struct/buf.c @@ -31,6 +31,7 @@ #include #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); \