Lines Matching +full:start +full:- +full:up

7  * SPDX-License-Identifier:	GPL-2.0+
17 /* set mb->head and mb->tail so the buffers look empty */ in membuff_purge()
18 mb->head = mb->start; in membuff_purge()
19 mb->tail = mb->start; in membuff_purge()
27 /* always write to 'mb->head' */ in membuff_putrawflex()
29 *data = &mb->start; in membuff_putrawflex()
30 *offsetp = mb->head - mb->start; in membuff_putrawflex()
33 if (!mb->start) in membuff_putrawflex()
40 if (mb->head >= mb->tail) { in membuff_putrawflex()
42 len = mb->end - mb->head - 1; in membuff_putrawflex()
48 mb->head += len; in membuff_putrawflex()
51 * if the tail isn't at start of the buffer, then we can in membuff_putrawflex()
54 if ((maxlen < 0 || len < maxlen) && mb->tail != mb->start) { in membuff_putrawflex()
57 mb->head = mb->start; in membuff_putrawflex()
63 len = mb->tail - mb->head - 1; in membuff_putrawflex()
69 mb->head += len; in membuff_putrawflex()
110 if (mb->head > mb->tail) { in membuff_getraw()
112 *data = mb->tail; in membuff_getraw()
113 len = mb->head - mb->tail; in membuff_getraw()
121 mb->tail += len; in membuff_getraw()
126 * and some more data between 'start' and 'head'(which we can't in membuff_getraw()
129 else if (mb->head < mb->tail) { in membuff_getraw()
131 *data = mb->tail; in membuff_getraw()
132 len = mb->end - mb->tail; in membuff_getraw()
136 mb->tail += len; in membuff_getraw()
137 if (mb->tail == mb->end) in membuff_getraw()
138 mb->tail = mb->start; in membuff_getraw()
143 maxlen, update, (int)(mb->head - mb->start), in membuff_getraw()
144 (int)(mb->tail - mb->start), (int)(*data - mb->start), len); in membuff_getraw()
154 return membuff_getraw(mb, 1, true, &data) != 1 ? -1 : *(uint8_t *)data; in membuff_getbyte()
161 return membuff_getraw(mb, 1, false, &data) != 1 ? -1 : *(uint8_t *)data; in membuff_peekbyte()
170 * do this in up to two lots(see GetRaw for why) stopping when there in membuff_get()
180 maxlen -= len; in membuff_get()
184 return buffptr - buff; in membuff_get()
200 length -= towrite; in membuff_put()
209 return mb->head == mb->tail; in membuff_isempty()
223 avail += membuff_getraw(&copy, -1, true, &data); in membuff_avail()
231 return mb->end - mb->start; in membuff_size()
239 (int)(mb->head - mb->start), (int)(mb->tail - mb->start), in membuff_makecontig()
240 (int)(mb->end - mb->start)); in membuff_makecontig()
243 * first we move anything at the start of the buffer into the correct in membuff_makecontig()
246 if (mb->tail > mb->head) { in membuff_makecontig()
248 * the data is split into two parts, from 0 to ->head and in membuff_makecontig()
249 * from ->tail to ->end. We move the stuff from 0 to ->head in membuff_makecontig()
250 * up to make space for the other data before it in membuff_makecontig()
252 topsize = mb->end - mb->tail; in membuff_makecontig()
253 botsize = mb->head - mb->start; in membuff_makecontig()
256 * must move data at bottom up by 'topsize' bytes - check if in membuff_makecontig()
259 if (mb->head + topsize >= mb->tail) in membuff_makecontig()
261 memmove(mb->start + topsize, mb->start, botsize); in membuff_makecontig()
262 debug(" - memmove(%d, %d, %d)", topsize, 0, botsize); in membuff_makecontig()
264 /* nothing at the start, so skip that step */ in membuff_makecontig()
266 topsize = mb->head - mb->tail; in membuff_makecontig()
271 memcpy(mb->start, mb->tail, topsize); in membuff_makecontig()
272 debug(" - memcpy(%d, %d, %d)", 0, (int)(mb->tail - mb->start), topsize); in membuff_makecontig()
275 mb->tail = mb->start; in membuff_makecontig()
276 mb->head = mb->start + topsize + botsize; in membuff_makecontig()
278 debug(" - head=%d, tail=%d", (int)(mb->head - mb->start), in membuff_makecontig()
279 (int)(mb->tail - mb->start)); in membuff_makecontig()
287 return mb->end == mb->start ? 0 : in membuff_free()
288 (mb->end - mb->start) - 1 - membuff_avail(mb); in membuff_free()
298 end = mb->head >= mb->tail ? mb->head : mb->end; in membuff_readline()
299 for (len = 0, s = mb->tail; s < end && len < maxlen - 1; str++) { in membuff_readline()
306 if (s == end && mb->tail > mb->head) { in membuff_readline()
307 s = mb->start; in membuff_readline()
308 end = mb->head; in membuff_readline()
321 mb->tail = s == mb->end ? mb->start : s; in membuff_readline()
334 for (orig = mb->end - mb->start, size = orig; size < orig + by;) in membuff_extend_by()
336 if (max != -1) in membuff_extend_by()
338 by = size - orig; in membuff_extend_by()
340 /* if we're already at maximum, give up */ in membuff_extend_by()
342 return -E2BIG; in membuff_extend_by()
344 oldhead = mb->head - mb->start; in membuff_extend_by()
345 oldtail = mb->tail - mb->start; in membuff_extend_by()
346 ptr = realloc(mb->start, size); in membuff_extend_by()
348 return -ENOMEM; in membuff_extend_by()
349 mb->start = ptr; in membuff_extend_by()
350 mb->head = mb->start + oldhead; in membuff_extend_by()
351 mb->tail = mb->start + oldtail; in membuff_extend_by()
353 if (mb->head < mb->tail) { in membuff_extend_by()
354 memmove(mb->tail + by, mb->tail, orig - oldtail); in membuff_extend_by()
355 mb->tail += by; in membuff_extend_by()
357 mb->end = mb->start + size; in membuff_extend_by()
364 mb->start = buff; in membuff_init()
365 mb->end = mb->start + size; in membuff_init()
371 mb->start = malloc(size); in membuff_new()
372 if (!mb->start) in membuff_new()
373 return -ENOMEM; in membuff_new()
375 membuff_init(mb, mb->start, size); in membuff_new()
381 mb->end = NULL; in membuff_uninit()
382 mb->start = NULL; in membuff_uninit()
388 free(&mb->start); in membuff_dispose()