aboutsummaryrefslogtreecommitdiff
path: root/development/libs/libbowl/bowl.h
diff options
context:
space:
mode:
Diffstat (limited to 'development/libs/libbowl/bowl.h')
-rw-r--r--development/libs/libbowl/bowl.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/development/libs/libbowl/bowl.h b/development/libs/libbowl/bowl.h
new file mode 100644
index 000000000000..ae1321e4189d
--- /dev/null
+++ b/development/libs/libbowl/bowl.h
@@ -0,0 +1,103 @@
+#ifndef _BOWL_H_
+#define _BOWL_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <memory.h>
+#include <stdbool.h>
+
+#define REAL_STRLEN(str) (strlen(str) + 1)
+#define CHECK(ptr, err) if(!ptr) return err;
+
+/** Define some generic error codes first that we can propagate **/
+typedef enum {
+ OK = 0,
+ ERR = -1,
+ NOT_IMPLEMENTED = 1, // A runtime error for missing features
+
+ INVALID_PARAMS = 2, // A function didn't get the required parameters
+ MALLOC_FAILED = 3, // A memory allocation failed
+ INVALID_STATE = 4, // Calling an operation on an invalid state
+} err_t;
+
+typedef enum {
+ LITERAL, // Any string that is \0 terminated
+ INTEGER, // Integer value
+ REAL, // Floating point value
+ BOOLEAN, // A 1-byte boolean
+ RAW // A platform-length pointer
+} data_t;
+
+typedef enum {
+ LEAF = 1, ARRAY, HASH, LINKED
+} bowl_t;
+
+struct bowl {
+ bowl_t type;
+ union {
+ struct data *data;
+ struct bowl_arr *array;
+ struct b_ptr *linked;
+ } _pl;
+};
+
+struct data {
+ data_t type;
+ union {
+ char *literal;
+ bool boolean;
+ long integer;
+ double real;
+ void *raw;
+ } _pl;
+};
+
+struct bowl_arr {
+ size_t size, used;
+ struct bowl **ptr;
+};
+
+struct b_ptr {
+ struct bowl *self;
+ struct b_ptr *next;
+};
+
+/// Allocate memory for an new, empty bowl node
+err_t bowl_malloc(struct bowl **, bowl_t);
+
+/// Insert one node at the end of another
+err_t bowl_append(struct bowl *, struct bowl *);
+
+/// Insert a node under a specific key (relevant for HASH nodes)
+err_t bowl_insert_key(struct bowl *, char *key, struct bowl *);
+
+/// Insert a node into a specific index of another node
+err_t bowl_insert_idx(struct bowl *, size_t idx, struct bowl *);
+
+/// Insert and swap a key in place, returning the old one
+err_t bowl_swap_idx(struct bowl *, size_t idx, struct bowl *, struct bowl **);
+
+/// Remove a bowl node by it's pointer reference
+err_t bowl_remove(struct bowl *, struct bowl *);
+
+/// Remove a specific key (relevant for HASH nodes)
+err_t bowl_remove_key(struct bowl *, char *key, struct bowl **);
+
+/// Removing a bowl node with a key
+err_t bowl_remove_idx(struct bowl *, size_t idx, struct bowl **);
+
+/// Cascade-free memory from a bowl node
+err_t bowl_free(struct bowl *);
+
+/// Allocate memory for a new data node
+err_t data_malloc(struct bowl **, data_t, ...);
+
+/// Free all data node memory
+err_t data_free(struct data *);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // _BOWL_H_