Boot framework rework (#45)
[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_opt(struct rbuffer* rb, char* buf, size_t len, bool consumed);
34
35 int
36 rbuffer_get(struct rbuffer* rb, char* c);
37
38 static inline int
39 rbuffer_gets(struct rbuffer* rb, char* buf, size_t len)
40 {
41     return rbuffer_gets_opt(rb, buf, len, true);
42 }
43
44 static inline int
45 rbuffer_gets_no_consume(struct rbuffer* rb, char* buf, size_t len)
46 {
47     return rbuffer_gets_opt(rb, buf, len, false);
48 }
49
50 static inline void
51 rbuffer_clear(struct rbuffer* rb)
52 {
53     rb->len = rb->ptr = 0;
54 }
55
56 static inline bool
57 rbuffer_empty(struct rbuffer* rb)
58 {
59     return rb->len == 0;
60 }
61
62 static inline unsigned int
63 rbuffer_len(struct rbuffer* rb)
64 {
65     return rb->len;
66 }
67
68 static inline void
69 rbuffer_setcontent(struct rbuffer* rb, size_t content_len)
70 {
71     rb->ptr = content_len;
72     rb->len = content_len;
73 }
74
75 static inline bool
76 rbuffer_full(struct rbuffer* rb)
77 {
78     return rb->len == rb->maxsz;
79 }
80
81 static inline int 
82 rbuffer_put_nof(struct rbuffer* rb, char c)
83 {
84     if (rbuffer_full(rb)) {
85         return 0;
86     }
87
88     return rbuffer_put(rb, c);
89 }
90
91 #endif /* __LUNAIX_RBUFFER_H */