mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 22:45:39 +00:00
add active region; enforce invariants about current
This commit is contained in:
@@ -41,6 +41,7 @@ isc_buffer_init(isc_buffer_t *b, void *base, unsigned int length,
|
|||||||
b->length = length;
|
b->length = length;
|
||||||
b->used = 0;
|
b->used = 0;
|
||||||
b->current = 0;
|
b->current = 0;
|
||||||
|
b->active = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -57,6 +58,7 @@ isc_buffer_invalidate(isc_buffer_t *b) {
|
|||||||
b->length = 0;
|
b->length = 0;
|
||||||
b->used = 0;
|
b->used = 0;
|
||||||
b->current = 0;
|
b->current = 0;
|
||||||
|
b->active = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
@@ -132,6 +134,10 @@ isc_buffer_subtract(isc_buffer_t *b, unsigned int n) {
|
|||||||
REQUIRE(b->used >= n);
|
REQUIRE(b->used >= n);
|
||||||
|
|
||||||
b->used -= n;
|
b->used -= n;
|
||||||
|
if (b->current > b->used)
|
||||||
|
b->current = b->used;
|
||||||
|
if (b->active > b->used)
|
||||||
|
b->active = b->used;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -143,6 +149,8 @@ isc_buffer_clear(isc_buffer_t *b) {
|
|||||||
REQUIRE(VALID_BUFFER(b));
|
REQUIRE(VALID_BUFFER(b));
|
||||||
|
|
||||||
b->used = 0;
|
b->used = 0;
|
||||||
|
b->current = 0;
|
||||||
|
b->active = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -171,6 +179,39 @@ isc_buffer_remaining(isc_buffer_t *b, isc_region_t *r) {
|
|||||||
r->length = b->used - b->current;
|
r->length = b->used - b->current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
isc_buffer_active(isc_buffer_t *b, isc_region_t *r) {
|
||||||
|
/*
|
||||||
|
* Make 'r' refer to the active region of 'b'.
|
||||||
|
*/
|
||||||
|
|
||||||
|
REQUIRE(VALID_BUFFER(b));
|
||||||
|
REQUIRE(r != NULL);
|
||||||
|
|
||||||
|
if (b->current < b->active) {
|
||||||
|
r->base = (unsigned char *)b->base + b->current;
|
||||||
|
r->length = b->active - b->current;
|
||||||
|
} else {
|
||||||
|
r->base = NULL;
|
||||||
|
r->length = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
isc_buffer_setactive(isc_buffer_t *b, unsigned int n) {
|
||||||
|
unsigned int active;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sets the end of the active region 'n' bytes after current.
|
||||||
|
*/
|
||||||
|
|
||||||
|
REQUIRE(VALID_BUFFER(b));
|
||||||
|
active = b->current + n;
|
||||||
|
REQUIRE(active <= b->used);
|
||||||
|
|
||||||
|
b->active = active;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
isc_buffer_first(isc_buffer_t *b) {
|
isc_buffer_first(isc_buffer_t *b) {
|
||||||
/*
|
/*
|
||||||
@@ -223,6 +264,10 @@ isc_buffer_compact(isc_buffer_t *b) {
|
|||||||
length = b->used - b->current;
|
length = b->used - b->current;
|
||||||
(void)memmove(b->base, src, (size_t)length);
|
(void)memmove(b->base, src, (size_t)length);
|
||||||
|
|
||||||
|
if (b->active > b->current)
|
||||||
|
b->active -= b->current;
|
||||||
|
else
|
||||||
|
b->active = 0;
|
||||||
b->current = 0;
|
b->current = 0;
|
||||||
b->used = length;
|
b->used = length;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user