|
|
|
@ -31,6 +31,7 @@ |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include <grpc/support/port_platform.h> |
|
|
|
|
#include <grpc/support/slice_buffer.h> |
|
|
|
|
|
|
|
|
|
#include <string.h> |
|
|
|
@ -208,6 +209,44 @@ void gpr_slice_buffer_move_into(gpr_slice_buffer *src, gpr_slice_buffer *dst) { |
|
|
|
|
src->length = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void gpr_slice_buffer_move_first(gpr_slice_buffer *src, size_t n, |
|
|
|
|
gpr_slice_buffer *dst) { |
|
|
|
|
size_t src_idx; |
|
|
|
|
size_t output_len = dst->length + n; |
|
|
|
|
size_t new_input_len = src->length - n; |
|
|
|
|
GPR_ASSERT(src->length >= n); |
|
|
|
|
if (src->length == n) { |
|
|
|
|
gpr_slice_buffer_move_into(src, dst); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
src_idx = 0; |
|
|
|
|
for (;;) { |
|
|
|
|
gpr_slice slice = src->slices[src_idx]; |
|
|
|
|
size_t slice_len = GPR_SLICE_LENGTH(slice); |
|
|
|
|
if (n > slice_len) { |
|
|
|
|
gpr_slice_buffer_add(dst, slice); |
|
|
|
|
n -= slice_len; |
|
|
|
|
src_idx++; |
|
|
|
|
} else if (n == slice_len) { |
|
|
|
|
gpr_slice_buffer_add(dst, slice); |
|
|
|
|
src_idx++; |
|
|
|
|
break; |
|
|
|
|
} else { /* n < slice_len */ |
|
|
|
|
src->slices[src_idx] = gpr_slice_split_tail(&slice, n); |
|
|
|
|
GPR_ASSERT(GPR_SLICE_LENGTH(slice) == n); |
|
|
|
|
GPR_ASSERT(GPR_SLICE_LENGTH(src->slices[src_idx]) == slice_len - n); |
|
|
|
|
gpr_slice_buffer_add(dst, slice); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
GPR_ASSERT(dst->length == output_len); |
|
|
|
|
memmove(src->slices, src->slices + src_idx, |
|
|
|
|
sizeof(gpr_slice) * (src->count - src_idx)); |
|
|
|
|
src->count -= src_idx; |
|
|
|
|
src->length = new_input_len; |
|
|
|
|
GPR_ASSERT(src->count > 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void gpr_slice_buffer_trim_end(gpr_slice_buffer *sb, size_t n, |
|
|
|
|
gpr_slice_buffer *garbage) { |
|
|
|
|
GPR_ASSERT(n <= sb->length); |
|
|
|
@ -231,3 +270,13 @@ void gpr_slice_buffer_trim_end(gpr_slice_buffer *sb, size_t n, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
gpr_slice gpr_slice_buffer_take_first(gpr_slice_buffer *sb) { |
|
|
|
|
gpr_slice slice; |
|
|
|
|
GPR_ASSERT(sb->count > 0); |
|
|
|
|
slice = sb->slices[0]; |
|
|
|
|
memmove(&sb->slices[0], &sb->slices[1], (sb->count - 1) * sizeof(gpr_slice)); |
|
|
|
|
sb->count--; |
|
|
|
|
sb->length -= GPR_SLICE_LENGTH(slice); |
|
|
|
|
return slice; |
|
|
|
|
} |
|
|
|
|