src/line_proto.c
changeset 13 ca16f3a8f3b7
parent 12 4147fae232d9
child 17 5001564ac5fc
--- a/src/line_proto.c	Sat Feb 28 18:48:10 2009 +0200
+++ b/src/line_proto.c	Sat Feb 28 19:08:51 2009 +0200
@@ -122,21 +122,28 @@
  *
  */
 int _parse_line (char *buf, size_t len, size_t *hint) {
-    int i;
+    int i, next = 0;
 
     // empty buffer -> nothing
     if (len == 0)
         return 0;
 
-    // look for terminating '\r\n' sequence
-    for (i = *hint; i < len - 1; i++) {
-        // match this + next char
-        if (buf[i] == '\r' && buf[i + 1] == '\n')
+    // look for terminating '\r\n' or '\n' sequence
+    for (i = *hint; i < len; i++) {
+        // match this + next char?
+        if (i < len - 1 && buf[i] == '\r' && buf[i + 1] == '\n') {
+            next = i + 2;
             break;
+
+        } else if (buf[i] == '\n') {
+            next = i + 1;
+            break;
+        }
     }
 
-    // incomplete?
-    if (i >= len - 1) {
+    // searched the whole buffer?
+    if (i >= len) {
+        // do continue one char back, to keep any \r
         *hint = len - 1;
         return 0;
     }
@@ -144,8 +151,8 @@
     // mangle the newline off
     buf[i] = '\0';
 
-    // return offset to next line
-    return i + 2;
+    // return offset to next line, as set in loop based on delim
+    return next;
 }
 
 err_t line_proto_read (struct line_proto *lp, const char **line_ptr)