From d9d49f58bc7c4b3754436277b93ff70da6754e98 Mon Sep 17 00:00:00 2001 From: Evan Burkey Date: Wed, 30 Mar 2022 17:02:36 -0700 Subject: [PATCH] start documentation --- README.md | 10 ++- build.sh | 4 +- docs/flinty.jpg | Bin 0 -> 18983 bytes docs/index.md | 19 ++++ docs/lfbinarytree.md | 202 +++++++++++++++++++++++++++++++++++++++++++ docs/lfbool.md | 8 ++ docs/lfinput.md | 88 +++++++++++++++++++ docs/lflinkedlist.md | 3 + docs/lfmath.md | 3 + docs/lfset.md | 3 + docs/lfstack.md | 3 + docs/lfutility.md | 16 ++++ mkdocs.yml | 16 ++++ 13 files changed, 373 insertions(+), 2 deletions(-) create mode 100644 docs/flinty.jpg create mode 100644 docs/index.md create mode 100644 docs/lfbinarytree.md create mode 100644 docs/lfbool.md create mode 100644 docs/lfinput.md create mode 100644 docs/lflinkedlist.md create mode 100644 docs/lfmath.md create mode 100644 docs/lfset.md create mode 100644 docs/lfstack.md create mode 100644 docs/lfutility.md create mode 100644 mkdocs.yml diff --git a/README.md b/README.md index 336c5d7..ddafddd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ # libflint -My personal library of common C data structures and algorithms. +My personal library of common C data structures and algorithms. Supports Linux, OpenBSD, and FreeBSD. + +## Documentation + +Extensive documentation can be found [here](https://docs.fputs.com/libflint/index.html) + +## Requirements + +Building on Linux requires `libbsd`. \ No newline at end of file diff --git a/build.sh b/build.sh index 18423d2..c860355 100755 --- a/build.sh +++ b/build.sh @@ -1,8 +1,10 @@ #!/bin/sh -e +# For building outside of CLion + mkdir -p build cd build cmake .. make cp compile_commands.json .. -cd +cd diff --git a/docs/flinty.jpg b/docs/flinty.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24336aeff89e6b556ccc7cd4db894d582b846e45 GIT binary patch literal 18983 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..8436a95 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,19 @@ +# libflint + +`libflint` is a library of common C data structures and algorithms, designed to be as agnostic as possible for its +users. + +## Requirements + +The only requirement is `libbsd`. This should be available on all major Linux distros. If building on a bsd, then + +## Memory Management + +The parts of this library that create data structures pass all responsibility of memory management to the user. This +is clearly documented in the individual module's documentation. + +## Why 'libflint'? + +`libflint` is named after my dog Flint, who passed away in 2021. I miss you, buddy. + +![flint](flinty.jpg) \ No newline at end of file diff --git a/docs/lfbinarytree.md b/docs/lfbinarytree.md new file mode 100644 index 0000000..6fe1cfb --- /dev/null +++ b/docs/lfbinarytree.md @@ -0,0 +1,202 @@ +# lfbinarytree + +Binary tree with standard leaf operations + +## Usage + +Create the tree. The user is responsible for memory management of the `BinTree` struct. + +```c +BinTree *tree = malloc(sizeof(BinTree)); +``` + +After the tree is created, init it. The second argument on `bintree_init()` is an optional memory freeing function pointer +with signature `void (*destroy)(void *data)`. Use `free()` from the stdlib if you are creating the data with `malloc()`. +If allocation of your data is more complex, you can pass your own memory deallocation function as long as it fits the +signature. + +In this example, we are passing `NULL` because all memory will be stack allocated. + +```c +bintree_init(tree, NULL); +int root = 0; +int l1 = 1; +int l2 = 2; +int r1 = 12; +int r2 = 200; +``` + +Next lets insert our data into the tree. The insert functions signature is `bintree_ins_...(tree, parent, data)`. If you +are inserting data at the root of the tree, you may use either `bintree_ins_left()` or `bintree_ins_right()` as long as +`NULL` is passed as the parent argument. + +```c +bintree_ins_left(tree, NULL, &root); +bintree_ins_left(tree, tree->root, &l1); +bintree_ins_left(tree, tree->root->left, &l2); +bintree_ins_right(tree, tree->root->left, &r2); +bintree_ins_right(tree, tree->root, &r1); +bintree_ins_right(tree, tree->root->right, &r2); +bintree_ins_left(tree, tree->root->right, &l1); +``` + +We can use `bintree_debug_print(tree)` to print a graphical representation of the tree to `stdout` +```plaintext +└──0 + ├──1 + │ ├──2 + │ └──200 + └──12 + ├──1 + └──200 +``` + +To cleanup the tree, first destroy the nodes. If you passed a deallocation function, it will be called on +the data member of each node before the node itself is freed. `bintree_destroy()` does not free the tree itself, just the +nodes inside of it, hence we must also call `free()` on the tree. + +```c +bintree_destroy(tree); +free(tree); +tree = NULL; +``` + +Here is the entire example: + +```c +BinTree *tree = malloc(sizeof(BinTree)); +bintree_init(tree, NULL); + +int root = 0; +int l1 = 1; +int l2 = 2; +int r1 = 12; +int r2 = 200; + +bintree_ins_left(tree, NULL, &root); +bintree_ins_left(tree, tree->root, &l1); +bintree_ins_left(tree, tree->root->left, &l2); +bintree_ins_right(tree, tree->root->left, &r2); +bintree_ins_right(tree, tree->root, &r1); +bintree_ins_right(tree, tree->root->right, &r2); +bintree_ins_left(tree, tree->root->right, &l1); + +bintree_debug_print(tree); + +bintree_destroy(tree); +free(tree); +tree = NULL; +``` + +## Structs + +### BinTree + +Binary tree struct + +```c +typedef struct { + int size; + int (*compare)(const void *a, const void *b); + void (*destroy)(void *data); + struct BinTreeNode *root; +} BinTree; +``` + +Members: + +- `size`: How many nodes the tree contains +- `compare`: Comparison function between data in two nodes. Currently not used for anything +- `destroy`: Optional deallocation function for data inside a node. Typical usage is `NULL` for stack allocated data and `free()` for data created with `malloc()` +- `root`: The root node of the tree + +### BinTreeNode + +Node of the tree + +```c +typedef struct BinTreeNode { + void *data; + struct BinTreeNode *left; + struct BinTreeNode *right; +} BinTreeNode; +``` + +Members: +- `data`: void pointer to data the node contains +- `left`: left facing leaf of the node +- `right`: right facing leaf of the node + +## Functions + +### bintree_init + +Initialize the binary tree. User is responsible for freeing memory with `bintree_destroy()`. + +```c +void bintree_init(BinTree *tree, void (*destroy)(void *data)) +``` + +### bintree_destroy + +Destroys the nodes inside a tree and calls the deallaction function on the data if one was provided. Does not deallocate the tree itself, that is left to the user + +```c +void bintree_destroy(BinTree *tree) +``` + +### bintree_ins_left + +Creates a new node containing `data` and inserts it as the left child of `node` + +```c +int bintree_ins_left(BinTree *tree, BinTreeNode *node, void *data) +``` + +### bintree_ins_right + +Creates a new node containing `data` and inserts it as the right child of `node`. + +```c +int bintree_ins_right(BinTree *tree, BinTreeNode *node, void *data) +``` + +### bintree_rem_left + +Removes and deallocates the left child node of `node`. Calls the deallocation function on the data if one was provided + +```c +void bintree_rem_left(BinTree *tree, BinTreeNode *node) +``` + +### bintree_rem_right + +Removes and deallocates the right child node of `node`. Calls the deallocation function on the data if one was provided + +```c +void bintree_rem_right(BinTree *tree, BinTreeNode *node) +``` + +### bintree_debug_print + +Prints a representation of the tree to stdout. Gets very messy with large trees + +```c +void bintree_debug_print(BinTree *tree) +``` + +### bintree_is_eob + +Utility macro that checks if the node is the End Of Branch + +```c +#define bintree_is_eob(node) ((node) == NULL) +``` + +### bintree_is_leaf + +Utility macro that checks if a node has children + +```c +#define bintree_is_leaf(node) ((node)->left == NULL && (node)->right == NULL) +``` diff --git a/docs/lfbool.md b/docs/lfbool.md new file mode 100644 index 0000000..8a8dd61 --- /dev/null +++ b/docs/lfbool.md @@ -0,0 +1,8 @@ +# lfbool + +Macro representation of truthy values + +```c +#define LFTRUE 1 +#define LFFALSE 0 +``` diff --git a/docs/lfinput.md b/docs/lfinput.md new file mode 100644 index 0000000..3400969 --- /dev/null +++ b/docs/lfinput.md @@ -0,0 +1,88 @@ +# lfinput + +I/O module to assist with consuming data from files + +## Functions + +### get_input + +Reads a file at `path` and returns the contents as a single string. The string is allocated inside the function and +the user is responsible for freeing it when finished. + +```c +char *get_input(const char *path); + +/* Usage */ +char *str = get_input("/home/evan/textfile"); +free(str); +``` + +### get_lines + +Reads a file at `path` and returns the contents as an array of strings. The newline character `\n` is used as the +delimiter to determine where the file is split. The user is responsible for cleaning up the memory using `del_lines()`. +`lsz` is set to the number of lines in the array. + +```c +char **get_lines(const char *path, size_t *lsz); + +/* Usage */ +size_t sz = 0; +char **lines = get_lines("/home/evan/textfile", &sz); +for (size_t i = 0; i < sz; i++) { + printf("%s\n", lines[i]); +} +del_lines(lines); +``` + +### del_lines + +Frees all memory used by `get_lines()` + +```c +void del_lines(char **lines); +``` + +### get_ints +Reads a file at `path` and returns the contents as an array of integers. The file is assumed to be a newline seperated +list of integers and nothing else. + +The newline character `\n` is used as the delimiter to determine where the file is split. The user is responsible for +cleaning up the memory using `free()`. `lsz` is set to the number of lines in the array. + +```c +int *get_ints(const char *path, size_t *lsz); + +/* Usage */ +int *nums = get_ints("/home/evan/intfile"); +for (size_t i = 0; i < sz; i++) { + printf("%d\n", nums[i]); +} +free(nums); +``` + +### split + +Takes a string `s` and splits it into an array of strings based on the delimiter. `s` is left unchanged. The user is +responsible for cleaning up the memory of the split using `del_split()`. `sp_sz` is set to the size of the split. + +```c +char **split(char *s, size_t *lsz, const char *delim) + +/* Usage */ +size_t sp_sz = 0; +char **sp = split("Split on whitespace", &sp_sz, " "); +printf("%s\n", sp[0]); // Prints "Split" +``` + +### del_split + +Frees all memory used by `split()`. Just like `split`, it does not touch the original string +```c +void del_split(char **sp); + +/* Usage */ +size_t sp_sz = 0; +char **sp = split("Delete Me!", &sp_sz, " "); +void del_split(char **sp); +``` diff --git a/docs/lflinkedlist.md b/docs/lflinkedlist.md new file mode 100644 index 0000000..ffc7e88 --- /dev/null +++ b/docs/lflinkedlist.md @@ -0,0 +1,3 @@ +# lflinkedlist + +Coming soon \ No newline at end of file diff --git a/docs/lfmath.md b/docs/lfmath.md new file mode 100644 index 0000000..f816e20 --- /dev/null +++ b/docs/lfmath.md @@ -0,0 +1,3 @@ +# lfmath + +Coming soon \ No newline at end of file diff --git a/docs/lfset.md b/docs/lfset.md new file mode 100644 index 0000000..8d68b40 --- /dev/null +++ b/docs/lfset.md @@ -0,0 +1,3 @@ +# lfset + +Coming soon \ No newline at end of file diff --git a/docs/lfstack.md b/docs/lfstack.md new file mode 100644 index 0000000..ccb61d1 --- /dev/null +++ b/docs/lfstack.md @@ -0,0 +1,3 @@ +# lfstack + +Coming soon \ No newline at end of file diff --git a/docs/lfutility.md b/docs/lfutility.md new file mode 100644 index 0000000..1dc0fef --- /dev/null +++ b/docs/lfutility.md @@ -0,0 +1,16 @@ +# lfutility + +Utility code that does not fit anywhere else + +## Structs + +### Point + +Representation of a point on a two dimensional grid + +```c +typedef struct { + int x; + int y; +} Point; +``` diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..503cf1d --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,16 @@ +site_name: libflint +site_url: https://example.com +theme: + name: readthedocs +nav: + - 'index.md' + - 'Modules': + - 'Boolean': 'lfbool.md' + - 'Input': 'lfinput.md' + - 'Math': 'lfmath.md' + - 'Utility': 'lfutility.md' + - 'Data Structures': + - 'Binary Tree': 'lfbinarytree.md' + - 'Linked List': 'lflinkedlist.md' + - 'Set': 'lfset.md' + - 'Stack': 'lfstack.md'