git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Change of vterm handling logic on backend chardev input event (#40)
[lunaix-os.git]
/
lunaix-os
/
kernel
/
ds
/
rbuffer.c
diff --git
a/lunaix-os/kernel/ds/rbuffer.c
b/lunaix-os/kernel/ds/rbuffer.c
index bfcc3a5cd7334c2904e3bfc0c21614a46a64150a..82d1402b8d7d788fa2e48c82bbab010715b8b94a 100644
(file)
--- a/
lunaix-os/kernel/ds/rbuffer.c
+++ b/
lunaix-os/kernel/ds/rbuffer.c
@@
-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);
rb->ptr = (rb->ptr + 1) % rb->maxsz;
rb->len = MIN(rb->len + 1, rb->maxsz);
- return
1
;
+ return
rb->len < rb->maxsz
;
}
int
}
int
@@
-41,29
+41,29
@@
rbuffer_puts(struct rbuffer* rb, char* buf, size_t len)
if (!len)
return 0;
if (!len)
return 0;
- size_t ptr = (rb->ptr + len) % rb->maxsz;
size_t nlen = MIN(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);
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;
} 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
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);
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);
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);
}
} else {
memcpy(&buf[-nlen], &rb->buffer[ptr_start], nlen);
}
- rb->len -= nlen;
+ if (consumed) {
+ rb->len -= nlen;
+ }
return nlen;
}
return nlen;
}