#include "buffer.h" #include #include #include #include int buffer_grow(struct buffer * b) { int allocated = b->allocated + 1024; if (8192 < allocated) { errno = ENOMEM; return -1; } void * buffer = realloc(b->data, allocated); if (NULL == buffer) return -1; b->data = buffer; b->allocated = allocated; return allocated; } int buffer_read_more(int fd, struct buffer * in, int minimum_length) { const int free_space = in->allocated + in->offset - in->length - 1; while (free_space < minimum_length) { if (-1 == buffer_grow(in)) return -1; } if (0 < in->offset) { memmove(in->data, in->data + in->offset, in->length - in->offset); in->offset = 0; in->length -= in->offset; } int length = read(fd, in->data + in->length, free_space); if (-1 == length) return -1; in->length += length; return length; } int buffer_prepare_at_least(int fd, struct buffer * in, int minimum_length) { const int remaining_bytes = in->length - in->next; if (remaining_bytes < minimum_length) { const int res = buffer_read_more(fd, in, minimum_length); if (-1 == res) return res; } return remaining_bytes; } int buffer_until(struct buffer * b, const char * pattern, int pattern_length) { while (b->next + pattern_length <= b->length) { if (0 == strncmp(&b->data[b->next], pattern, pattern_length)) { return b->next; } else { b->next++; } } return -1; }