Change of vterm handling logic on backend chardev input event (#40)
[lunaix-os.git] / lunaix-os / kernel / ds / rbuffer.c
index bfcc3a5cd7334c2904e3bfc0c21614a46a64150a..82d1402b8d7d788fa2e48c82bbab010715b8b94a 100644 (file)
@@ -32,7 +32,7 @@ rbuffer_put(struct rbuffer* rb, char c)
     rb->ptr = (rb->ptr + 1) % rb->maxsz;
     rb->len = MIN(rb->len + 1, rb->maxsz);
 
-    return 1;
+    return rb->len < rb->maxsz;
 }
 
 int
@@ -41,29 +41,29 @@ rbuffer_puts(struct rbuffer* rb, char* buf, size_t len)
     if (!len)
         return 0;
 
-    size_t ptr = (rb->ptr + len) % rb->maxsz;
     size_t nlen = MIN(len, rb->maxsz);
-    size_t ptr_start = (ptr - nlen) % rb->maxsz;
+    size_t ptr = (rb->ptr + nlen) % rb->maxsz;
+    size_t ptr_start = rb->ptr;
 
     buf = &buf[nlen];
     if (ptr_start >= ptr) {
         size_t llen = rb->maxsz - ptr_start;
         memcpy(&rb->buffer[ptr_start], &buf[-nlen], llen);
-        memcpy(&rb->buffer[0], &buf[-nlen + llen], ptr + 1);
+        memcpy(&rb->buffer[0], &buf[-nlen + llen], ptr);
     } else {
         memcpy(&rb->buffer[ptr_start], &buf[-nlen], nlen);
     }
 
     rb->ptr = ptr;
-    rb->len = nlen;
+    rb->len = MIN(rb->len + nlen, rb->maxsz);
 
     return nlen;
 }
 
 int
-rbuffer_gets(struct rbuffer* rb, char* buf, size_t len)
+rbuffer_gets_opt(struct rbuffer* rb, char* buf, size_t len, bool consumed)
 {
-    if (!len)
+    if (!len || !rb->len)
         return 0;
 
     size_t nlen = MIN(len, rb->len);
@@ -74,12 +74,14 @@ rbuffer_gets(struct rbuffer* rb, char* buf, size_t len)
     if (ptr_start >= ptr_end) {
         size_t llen = rb->maxsz - ptr_start;
         memcpy(&buf[-nlen], &rb->buffer[ptr_start], llen);
-        memcpy(&buf[-nlen + llen], &rb->buffer[0], ptr_end + 1);
+        memcpy(&buf[-nlen + llen], &rb->buffer[0], ptr_end);
     } else {
         memcpy(&buf[-nlen], &rb->buffer[ptr_start], nlen);
     }
 
-    rb->len -= nlen;
+    if (consumed) {
+        rb->len -= nlen;
+    }
 
     return nlen;
 }