/* ustream_consume: remove data from the head of the read buffer */
void ustream_consume(struct ustream *s, int len);
+/*
+ * ustream_read: read and consume data in read buffer into caller-specified
+ * area. Return length of data read.
+ */
+int ustream_read(struct ustream *s, char *buf, int buflen);
/* ustream_write: add data to the write buffer */
int ustream_write(struct ustream *s, const char *buf, int len, bool more);
-int ustream_printf(struct ustream *s, const char *format, ...);
-int ustream_vprintf(struct ustream *s, const char *format, va_list arg);
+int ustream_printf(struct ustream *s, const char *format, ...)
+ __attribute__ ((format (printf, 2, 3)));
+int ustream_vprintf(struct ustream *s, const char *format, va_list arg)
+ __attribute__ ((format (printf, 2, 0)));
/* ustream_get_read_buf: get a pointer to the next read buffer data */
char *ustream_get_read_buf(struct ustream *s, int *buflen);
return !!(s->read_blocked & READ_BLOCKED_USER);
}
+static inline int ustream_pending_data(struct ustream *s, bool write)
+{
+ struct ustream_buf_list *b = write ? &s->w : &s->r;
+ return b->data_bytes;
+}
+
static inline bool ustream_read_buf_full(struct ustream *s)
{
- return s->r.data_bytes == s->r.buffer_len;
+ struct ustream_buf *buf = s->r.data_tail;
+ return buf && buf->data == buf->head && buf->tail == buf->end &&
+ s->r.buffers == s->r.max_buffers;
}
/*** --- functions only used by ustream implementations --- ***/