chiark / gitweb /
@@@ random mess
[mLib] / struct / buf.h
index 2a3722059475d639917e78f2801db294f9a71321..8201c49f1bddc06216a2e8180d5dc8ae4e4e179f 100644 (file)
@@ -273,6 +273,58 @@ 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_alignskip@ --- *
+ *
+ * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block
+ *             @size_t m, a@ = alignment multiple and offset
+ *
+ * Returns:    Zero if it worked, nonzero if there wasn't enough space.
+ *
+ * Use:                Advance the buffer position as little as possible such that
+ *             it is @a@ greater than a multiple of @m@.  This doesn't write
+ *             anything to the buffer, so it's probably not suitable for
+ *             output: use @buf_alignfill@ instead.
+ */
+
+extern int buf_alignskip(buf */*b*/, size_t /*m*/, size_t /*a*/);
+extern int dbuf_alignskip(dbuf */*db*/, size_t /*m*/, size_t /*a*/);
+#define dbuf_alignskip(db, m, a) (buf_alignskip(DBUF_BUF(db), (m), (a)))
+
+/* --- @{,d}buf_alignfill@ --- *
+ *
+ * Arguments:  @buf *b@ or @dbuf *db@ = pointer to a buffer block
+ *             @int ch@ = fill character
+ *             @size_t m, a@ = alignment multiple and offset
+ *
+ * Returns:    Zero if it worked, nonzero if there wasn't enough space.
+ *
+ * Use:                Fill the buffer with as few copies of @ch@ as possible, as if
+ *             by @memset@, to advance the buffer position to a value @a@
+ *             greater than a multiple of @m@.
+ */
+
+extern int buf_alignfill(buf */*b*/, int /*ch*/, size_t /*m*/, size_t /*a*/);
+extern int (dbuf_alignfill)(dbuf */*db*/, int /*ch*/,
+                           size_t /*m*/, size_t /*a*/);
+#define dbuf_alignfill(db, ch, m, a)                                   \
+  (buf_alignfill(DBUF_BUF(db), (ch), (a), (m)))
+
 /* --- @{,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