#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_prepare_at_least(int fd, struct buffer * in, int minimum_length) { const int remaining_bytes = in->length - in->next; if (remaining_bytes >= minimum_length) return remaining_bytes; 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->length -= in->offset; in->next -= in->offset; in->offset = 0; } int length = read(fd, in->data + in->length, free_space); if (-1 == length) return -1; in->length += length; return in->length - in->next; } 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; }