diff stream/stream.c @ 30754:dff9ee89b7c1

Move stream_read_line implementation from stream.h to stream.c, it is not speed critical and the function call overhead is not relevant for its overall speed anyway.
author reimar
date Sun, 28 Feb 2010 13:54:55 +0000
parents 9a49143918aa
children 6a5957bf5b70
line wrap: on
line diff
--- a/stream/stream.c	Sun Feb 28 12:54:12 2010 +0000
+++ b/stream/stream.c	Sun Feb 28 13:54:55 2010 +0000
@@ -487,3 +487,29 @@
     if(!stream_check_interrupt_cb) return 0;
     return stream_check_interrupt_cb(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;
+}