diff options
Diffstat (limited to 'stream/stream.c')
-rw-r--r-- | stream/stream.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/stream/stream.c b/stream/stream.c index af194f3a3d..0b0cddc6f9 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -492,3 +492,29 @@ int stream_check_interrupt(int time) { if(!stream_check_interrupt_cb) return 0; return stream_check_interrupt_cb(stream_check_interrupt_ctx, time); } + +unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max) { + int len; + unsigned char* end,*ptr = mem; + if (max < 1) return NULL; + max--; // reserve one for 0-termination + do { + len = s->buf_len-s->buf_pos; + // try to fill the buffer + if(len <= 0 && + (!cache_stream_fill_buffer(s) || + (len = s->buf_len-s->buf_pos) <= 0)) break; + end = (unsigned char*) memchr((void*)(s->buffer+s->buf_pos),'\n',len); + if(end) len = end - (s->buffer+s->buf_pos) + 1; + if(len > 0 && max > 0) { + int l = len > max ? max : len; + memcpy(ptr,s->buffer+s->buf_pos,l); + max -= l; + ptr += l; + } + s->buf_pos += len; + } while(!end); + if(s->eof && ptr == mem) return NULL; + ptr[0] = 0; + return mem; +} |