chiark / gitweb /
struct/buf.c: Add new function `buf_fill' to include arbitrary padding.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 9 Jul 2024 17:09:03 +0000 (18:09 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 9 Jul 2024 17:09:03 +0000 (18:09 +0100)
struct/buf.3.in
struct/buf.c
struct/buf.h

index f69d2049f1e033252bf8e026557061c82bc38677..594cbddfd8f1f8fdfe02dbcac843769b51c9950f 100644 (file)
 .\" @buf_tryextend
 .\" @buf_get
 .\" @buf_put
 .\" @buf_tryextend
 .\" @buf_get
 .\" @buf_put
+.\" @buf_fill
 .\" @dbuf_break
 .\" @dbuf_flip
 .\" @dbuf_ensure
 .\" @dbuf_tryextend
 .\" @dbuf_get
 .\" @dbuf_put
 .\" @dbuf_break
 .\" @dbuf_flip
 .\" @dbuf_ensure
 .\" @dbuf_tryextend
 .\" @dbuf_get
 .\" @dbuf_put
+.\" @dbuf_fill
 .
 .\" @buf_getbyte
 .\" @buf_putbyte
 .
 .\" @buf_getbyte
 .\" @buf_putbyte
@@ -536,6 +538,7 @@ and taking a first argument of type
 .PP
 .BI "void *buf_get(buf *" b ", size_t " sz );
 .BI "int buf_put(buf *" b ", const void *" p ", size_t " sz );
 .PP
 .BI "void *buf_get(buf *" b ", size_t " sz );
 .BI "int buf_put(buf *" b ", const void *" p ", size_t " sz );
+.BI "int buf_fill(buf *" b ", int " ch ", size_t " sz );
 .PP
 .BI "int buf_getbyte(buf *" b );
 .BI "int buf_putbyte(buf *" b ", int " ch );
 .PP
 .BI "int buf_getbyte(buf *" b );
 .BI "int buf_putbyte(buf *" b ", int " ch );
@@ -827,6 +830,16 @@ function writes
 bytes of data starting at
 .I p
 to the buffer.  If it succeeded, it returns 0; otherwise it returns \-1.
 bytes of data starting at
 .I p
 to the buffer.  If it succeeded, it returns 0; otherwise it returns \-1.
+.PP
+The
+.B buf_fill
+function writes
+.I sz
+copies of the byte
+.I ch
+to the buffer, as if by calling
+.BR memset (3).
+If it succeeds, it returns 0; otherwise it returns \-1.
 .
 .SS "Formatted buffer access"
 The function
 .
 .SS "Formatted buffer access"
 The function
index 67cc30e93977e0ad2d1548cfc9227fbf304699e2..4b02b28bc456ba64f6a0c3f7a73be2568bbe7f7a 100644 (file)
@@ -200,6 +200,29 @@ int buf_put(buf *b, const void *p, size_t sz)
 int (dbuf_put)(dbuf *db, const void *p, size_t sz)
   { return (dbuf_put(db, p, sz)); }
 
 int (dbuf_put)(dbuf *db, const void *p, size_t sz)
   { return (dbuf_put(db, p, sz)); }
 
+/* --- @{,d}buf_fill@ --- *
+ *
+ * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block
+ *             @int ch@ = fill character
+ *             @size_t sz@ = size to fill
+ *
+ * Returns:    Zero if it worked, nonzero if there wasn't enough space.
+ *
+ * Use:                Write @sz@ bytes with value @ch@ to the buffer, as if with
+ *             @memset@.
+ */
+
+int buf_fill(buf *b, int ch, size_t sz)
+{
+  void *p;
+
+  p = buf_get(b, sz); if (!p) return (-1);
+  if (sz) memset(p, ch, sz);
+  return (0);
+}
+int (dbuf_fill)(dbuf *db, int ch, size_t sz)
+  { return (dbuf_fill(db, ch, sz)); }
+
 /* --- @{,d}buf_getbyte@ --- *
  *
  * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block
 /* --- @{,d}buf_getbyte@ --- *
  *
  * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block
index 2a3722059475d639917e78f2801db294f9a71321..212bd72ef459e31b2169d57c3d3ce5136aa09bb8 100644 (file)
@@ -273,6 +273,22 @@ extern int buf_put(buf */*b*/, const void */*p*/, size_t /*sz*/);
 extern int dbuf_put(dbuf */*db*/, const void */*p*/, size_t /*sz*/);
 #define dbuf_put(db, p, sz) (buf_put(DBUF_BUF(db), (p), (sz)))
 
 extern int dbuf_put(dbuf */*db*/, const void */*p*/, size_t /*sz*/);
 #define dbuf_put(db, p, sz) (buf_put(DBUF_BUF(db), (p), (sz)))
 
+/* --- @{,d}buf_fill@ --- *
+ *
+ * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block
+ *             @int ch@ = fill character
+ *             @size_t sz@ = size to fill
+ *
+ * Returns:    Zero if it worked, nonzero if there wasn't enough space.
+ *
+ * Use:                Write @sz@ bytes with value @ch@ to the buffer, as if with
+ *             @memset@.
+ */
+
+extern int buf_fill(buf */*b*/, int /*ch*/, size_t /*sz*/);
+extern int dbuf_fill(dbuf */*db*/, int /*ch*/, size_t /*sz*/);
+#define dbuf_fill(db, ch, sz) (buf_fill(DBUF_BUF(db), (ch), (sz)))
+
 /* --- @{,d}buf_getbyte@ --- *
  *
  * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block
 /* --- @{,d}buf_getbyte@ --- *
  *
  * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block