diff options
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | README.md | 31 | ||||
| -rw-r--r-- | chad/experimental/require.h | 2 | ||||
| -rw-r--r-- | chad/experimental/strlist.h | 65 |
4 files changed, 29 insertions, 75 deletions
@@ -4,11 +4,11 @@ so: ${CC} -fPIC -shared ${SOURCE} -o object/libchad.so dist: - -mkdir object/chad/ + -mkdir object/chad/ 2> /dev/null for d in chad/ extern/; do \ - pushd $$d; \ + pushd $$d &> /dev/null; \ find ./ -type f -name '*.h' -exec cp --parents {} ../object/chad/ \; ; \ - popd; \ + popd &> /dev/null; \ done clean: @@ -16,12 +16,24 @@ C libraries are hard to find; good libraries are even harder. | :--- | :---------- | | dictate.h | Über-printer. | | plumblism.h | PBMplus (PNM) image IO. | +// https://github.com/ClecioJung/ini (slight renaming and _Generic) +// https://github.com/an-dr/microlog ### Datastructures -| Lib | Description | -| :--- | :---------- | -| sds.h | Dynamic strings. | +| Lib | Description | +| :--- | :---------- | +| sds.h | Dynamic strings. | +| haste.h | Type-safe generic containers optimized single threaded speed. | +| strlist.h | String lists. | + +### Memory + +| Lib | Description | +| :--- | :---------- | +| memory-units.h | Memory unit macros. | +| zone.h | Zone allocator. | +// arena allocator ### Ported functionality @@ -40,7 +52,6 @@ Experimental libraries on the other hand are volatile. | Lib | Description | | :--- | :---------- | | bits.h | Various miscellaneous functionalities. | -| kvec.h | Small, typesafe, generic datastructures optimized for speed. | ## Criteria @@ -86,8 +97,6 @@ Complexity has its place: within its own library. } # something addressing math.h # gcd(), lcm(), sq() /*square, after ino*/ - # trim() and pad() even tho its a meme - # MB(n) etc. macros # # the linux kernel has a bunch of small, high quality utilities, # these should be inspected @@ -101,4 +110,14 @@ Complexity has its place: within its own library. # # Same applies to plan9 # * libutf + # + # and qlib + # * qencode + # * qcount + # + # Strings: + # trim() and pad() even tho its a meme + # slugify + # reverse + # case conversions ``` diff --git a/chad/experimental/require.h b/chad/experimental/require.h index e9a8ea8..afb20e9 100644 --- a/chad/experimental/require.h +++ b/chad/experimental/require.h @@ -39,7 +39,7 @@ thread_local long long require_v; #ifndef REQUIRE_TERMINATOR -# define REQUIRE_TERMINATOR default_require_terminator +# define REQUIRE_TERMINATOR(...) default_require_terminator(__VA_ARGS__) #endif [[ noreturn ]] diff --git a/chad/experimental/strlist.h b/chad/experimental/strlist.h deleted file mode 100644 index 33d42f7..0000000 --- a/chad/experimental/strlist.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef STRLIST_H -#define STRLIST_H - -/* The string based list is a common pattern, - * as it is the most intuitive way to serialize a list. - * - * In many languages you would handle it by instantiating - * an actual list by means of splitting, - * but in C we can often do better - * (and we dont have general lists to begin with). - * - * Examples would include: - * + file paths (a/b) - * + file extensions (a.b) - * + unix style option lists (a:b) - * + symbol hierarchies (a->b) - */ - -typedef const char * const * const sep_t; -sep_t UNIX_PATH_SEP = { "/", NULL, }; -sep_t DOS_PATH_SEP = { "\\", NULL, }; -sep_t UNIX_SEP = { ":", NULL, }; -sep_t CPP_SEP = { "::", ".", "->", NULL, }; -sep_t EXT_SEP = { ".", NULL, }; - -size_t strlist_len(char * list, sep_t sep); - -/* This function in an abstract sense performs list indexing. - * The result overwrites the `list` argument and is returned. - * (We know that this may never result in an overflow.) - */ -char * strlist_component(char * list, size_t n, sep_t sep); -/* This function returns a range. - */ -char * strlist_components(char * list, size_t from, size_t to, sep_t sep); - -/* The following are shorthands for component()/components(), - * with a specific numbers which may or may not be length specific - * - * Visual explanation: - * this/is/my/example/path - * Root <----------------> - * Base <--> - * Head <--> - * Tail <----------------> - */ -char * strlist_root(char * list, sep_t sep); -char * strlist_base(char * list, sep_t sep); -char * strlist_head(char * list, sep_t sep); -char * strlist_tail(char * list, sep_t sep); - -/* Notes: - * + we very consciously made the decision to not take a destination operand; - * you would have to allocate it just the same, - * copying the source string is not a real performance concern, - * but we want our interface to be as clean as possible - */ - -/* Example: - * Getting the absolute basename of a file. - * char name[] = "this/is/my.file.example"; - * name = strlist_head(strlist_base(name, UNIX_PATH_SEP), EXT_SEP); - */ - -#endif |
