fix: corner cases when printing large content through term interface
[lunaix-os.git] / lunaix-os / includes / lunaix / ds / rbuffer.h
1 #ifndef __LUNAIX_RBUFFER_H
2 #define __LUNAIX_RBUFFER_H
3
4 #include <lunaix/types.h>
5
6 struct rbuffer
7 {
8     char* buffer;
9     size_t maxsz;
10     off_t ptr;
11     size_t len;
12 };
13
14 static inline void
15 rbuffer_init(struct rbuffer* rb, char* buf, size_t maxsz)
16 {
17     *rb = (struct rbuffer){ .buffer = buf, .maxsz = maxsz };
18 }
19
20 struct rbuffer*
21 rbuffer_create(char* buf, size_t maxsz);
22
23 int
24 rbuffer_erase(struct rbuffer* rb);
25
26 int
27 rbuffer_put(struct rbuffer* rb, char c);
28
29 int
30 rbuffer_puts(struct rbuffer* rb, char* c, size_t len);
31
32 int
33 rbuffer_gets(struct rbuffer* rb, char* buf, size_t len);
34
35 int
36 rbuffer_get(struct rbuffer* rb, char* c);
37
38
39 static inline void
40 rbuffer_clear(struct rbuffer* rb)
41 {
42     rb->len = rb->ptr = 0;
43 }
44
45 static inline bool
46 rbuffer_empty(struct rbuffer* rb)
47 {
48     return rb->len == 0;
49 }
50
51 static inline bool
52 rbuffer_full(struct rbuffer* rb)
53 {
54     return rb->len == rb->maxsz;
55 }
56
57 static inline int 
58 rbuffer_put_nof(struct rbuffer* rb, char c)
59 {
60     if (rbuffer_full(rb)) {
61         return 0;
62     }
63
64     return rbuffer_put(rb, c);
65 }
66
67 #endif /* __LUNAIX_RBUFFER_H */