This function was sometimes used from a channel and sometimes from a buffer.
In both cases it requires knowledge of the size of the output data (to skip
them). Here the split ensures the channel can deal with this point, and that
other places not having output data can continue to work.
return 1;
}
+/* b_contig_data() : returns the amount of data that can contiguously be read
+ * at once starting from a relative offset <start> (which allows to easily
+ * pre-compute blocks for memcpy). The start point will typically contain the
+ * amount of past data already returned by a previous call to this function.
+ */
+static inline size_t b_contig_data(const struct buffer *b, size_t start)
+{
+ size_t data = b_wrap(b) - b_peek(b, start);
+ size_t limit = b_data(b) - start;
+
+ if (data > limit)
+ data = limit;
+ return data;
+}
+
/*********************************************/
/* Functions used to modify the buffer state */
return ret;
}
-/* Returns the amount of input data that can contiguously be read at once */
-static inline int bi_contig_data(const struct buffer *b)
-{
- int data = b->data + b->size - b->p;
-
- if (data > b->i)
- data = b->i;
- return data;
-}
-
/* Returns the start of the output data in a buffer */
static inline char *bo_ptr(const struct buffer *b)
{
}
+/* Returns the amount of input data that can contiguously be read at once */
+static inline size_t ci_contig_data(const struct channel *c)
+{
+ return b_contig_data(c->buf, co_data(c));
+}
+
/* Initialize all fields in the channel. */
static inline void channel_init(struct channel *chn)
{
ret = shctx_row_data_append(shctx,
st->first_block,
(unsigned char *)bi_ptr(msg->chn->buf),
- MIN(bi_contig_data(msg->chn->buf), len - st->hdrs_len));
+ MIN(ci_contig_data(msg->chn), len - st->hdrs_len));
/* Rewind the buffer to forward all data */
c_rew(msg->chn, st->hdrs_len);
st->hdrs_len = 0;
len = MIN(tmpbuf->size - buffer_len(tmpbuf), len);
c_adv(chn, *nxt);
- block = bi_contig_data(buf);
+ block = ci_contig_data(chn);
memcpy(bi_end(tmpbuf), bi_ptr(buf), block);
if (len > block)
memcpy(bi_end(tmpbuf)+block, buf->data, len-block);
data_process_len = MIN(out->size - buffer_len(out), sz);
block1 = data_process_len;
- if (block1 > bi_contig_data(in))
- block1 = bi_contig_data(in);
+ if (block1 > b_contig_data(in, in->o))
+ block1 = b_contig_data(in, in->o);
block2 = data_process_len - block1;
/* compressors return < 0 upon error or the amount of bytes read */
/* copy the remaining data in the tmp buffer. */
c_adv(chn, st->consumed);
if (ib->i > 0) {
- left = bi_contig_data(ib);
+ left = ci_contig_data(chn);
memcpy(ob->p + ob->i, bi_ptr(ib), left);
ob->i += left;
if (ib->i - left) {
int block1, block2, i, j, padding;
block1 = len;
- if (block1 > bi_contig_data(buf))
- block1 = bi_contig_data(buf);
- block2 = len - block1;
+ if (block1 > b_contig_data(buf, buf->o))
+ block1 = b_contig_data(buf, buf->o);
+ block2 = len - block1;
memcpy(p, buf->p, block1);
memcpy(p+block1, buf->data, block2);
/* Block1 is the length of the first block before the buffer wraps,
* block2 is the optional second block to reach the end of the frame.
*/
- block1 = bi_contig_data(h2c->dbuf);
+ block1 = b_contig_data(h2c->dbuf, 0);
if (block1 > flen)
block1 = flen;
block2 = flen - block1;