123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
-
-
-
-
- #include <stdint.h>
- #include <string.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <gpxe/linebuf.h>
-
-
- char * buffered_line ( struct line_buffer *linebuf ) {
- return ( linebuf->ready ? linebuf->data : NULL );
- }
-
-
- void empty_line_buffer ( struct line_buffer *linebuf ) {
- free ( linebuf->data );
- linebuf->data = NULL;
- linebuf->len = 0;
- linebuf->ready = 0;
- }
-
-
- ssize_t line_buffer ( struct line_buffer *linebuf,
- const char *data, size_t len ) {
- const char *eol;
- size_t consume;
- size_t new_len;
- char *new_data;
-
-
- if ( linebuf->ready )
- empty_line_buffer ( linebuf );
-
-
- if ( ( eol = memchr ( data, '\n', len ) ) ) {
- consume = ( eol - data + 1 );
- } else {
- consume = len;
- }
-
-
- new_len = ( linebuf->len + consume );
- new_data = realloc ( linebuf->data, ( new_len + 1 ) );
- if ( ! new_data )
- return -ENOMEM;
- memcpy ( ( new_data + linebuf->len ), data, consume );
- new_data[new_len] = '\0';
- linebuf->data = new_data;
- linebuf->len = new_len;
-
-
- if ( eol ) {
- linebuf->data[--linebuf->len] = '\0';
- if ( linebuf->data[linebuf->len - 1] == '\r' )
- linebuf->data[--linebuf->len] = '\0';
- linebuf->ready = 1;
- }
-
- return consume;
- }
|