feat: nearly complete POSIX.1-2008 compliant terminal interface implementation
[lunaix-os.git] / lunaix-os / includes / lunaix / ds / rbuffer.h
diff --git a/lunaix-os/includes/lunaix/ds/rbuffer.h b/lunaix-os/includes/lunaix/ds/rbuffer.h
new file mode 100644 (file)
index 0000000..f3777b6
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef __LUNAIX_RBUFFER_H
+#define __LUNAIX_RBUFFER_H
+
+#include <lunaix/types.h>
+
+struct rbuffer
+{
+    char* buffer;
+    size_t maxsz;
+    off_t ptr;
+    size_t len;
+};
+
+static inline void
+rbuffer_init(struct rbuffer* rb, char* buf, size_t maxsz)
+{
+    *rb = (struct rbuffer){ .buffer = buf, .maxsz = maxsz };
+}
+
+struct rbuffer*
+rbuffer_create(char* buf, size_t maxsz);
+
+static inline void
+rbuffer_clear(struct rbuffer* rb)
+{
+    rb->len = rb->ptr = 0;
+}
+
+static inline bool
+rbuffer_empty(struct rbuffer* rb)
+{
+    return rb->len == 0;
+}
+
+static inline bool
+rbuffer_full(struct rbuffer* rb)
+{
+    return rb->len == rb->maxsz;
+}
+
+int
+rbuffer_erase(struct rbuffer* rb);
+
+int
+rbuffer_put(struct rbuffer* rb, char c);
+
+int
+rbuffer_puts(struct rbuffer* rb, char* c, size_t len);
+
+int
+rbuffer_gets(struct rbuffer* rb, char* buf, size_t len);
+
+int
+rbuffer_get(struct rbuffer* rb, char* c);
+
+#endif /* __LUNAIX_RBUFFER_H */