{"id":28489246,"url":"https://github.com/fschaefer/ezlib","last_synced_at":"2025-06-30T10:31:29.574Z","repository":{"id":139147744,"uuid":"4345181","full_name":"fschaefer/EZLib","owner":"fschaefer","description":"EZLib is a C utility library, which provides some useful data types, string utilities and memory handling macros. It also provides macros for using object oriented programming in ISO C and a simple implementation of structured exception handling with try/catch blocks.","archived":false,"fork":false,"pushed_at":"2012-05-16T09:16:16.000Z","size":440,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-08T06:41:56.256Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fschaefer.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-05-16T09:07:24.000Z","updated_at":"2014-01-24T11:31:02.000Z","dependencies_parsed_at":"2023-03-13T10:50:01.771Z","dependency_job_id":null,"html_url":"https://github.com/fschaefer/EZLib","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fschaefer/EZLib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fschaefer%2FEZLib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fschaefer%2FEZLib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fschaefer%2FEZLib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fschaefer%2FEZLib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fschaefer","download_url":"https://codeload.github.com/fschaefer/EZLib/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fschaefer%2FEZLib/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262755878,"owners_count":23359425,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-08T06:36:15.288Z","updated_at":"2025-06-30T10:31:29.563Z","avatar_url":"https://github.com/fschaefer.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"EZLib\n=====\n\nEZLib is a C utility library, which provides some useful data types, string utilities and memory handling macros. It also provides macros for using object oriented programming in ISO C and a simple implementation of structured exception handling with try/catch blocks.\n\nAbout\n-----\n\nEZLib is a C utility library, which provides some useful data types, string utilities and memory handling macros.\u003cbr /\u003e\nIt also provides macros for using object oriented programming in ISO C and a simple implementation of structured exception handling with try/catch blocks.\u003cbr /\u003e\n\u003cbr /\u003e\nEZLib is free software, licensed under the GNU LGPL.\n\nWhy\n---\n\nWhile working on small and embedded systems where the GLib isn't available, I started collecting functions for my own utility library.\u003cbr /\u003e\nWhereas GLib is a \"huge beast\" for embedded systems when only using a small subset of the provided functionality, EZLib is very simple and small.\nAnd that's what it meant to be, simple and small.\n\nFeatures\n--------\n\nA list of features of EZLib:\n\n* Simple macros for Memory handling with the Samba trivial allocation library.\n* Many functions for easy string handling of plain C char arrays.\n* A EZString data type (like GLib's GString) and appropriate functions.\n* EZList, an doubly linked lists type (borrowed from GLib's GList).\n* EZArray, a simple dynamiccally growing array.\n* EZStack and EZQueue.\n* EZHashTable, an hash table implementation.\n* Macros for using classes and objects in C with the full gammit of things you expect with normal object oriented languages, for example inheritance and even introspection.\n* Macros for structured exception handling in C with ''try'', ''throw'' and ''catch''.\n\nTodo\n----\n\n* Complete feature tests.\n* Documentation.\n* Examples on Wiki.\n* Unicode support.\n* A lot more.\n\nExamples\n--------\n\nA basic class example.\n\n$ cat TestClass.h:\n\u003cpre\u003e\n#include \u003cezlib.h\u003e\n\nCLASS (TestClass, Object)\n    ATTRIBUTE (TestClass, x, int);\n    ATTRIBUTE (TestClass, y, int);\n    ATTRIBUTE (TestClass, name, char*);\n    TestClass METHOD (TestClass, ctor);\n    void METHOD (TestClass, dtor);\nEND_CLASS\n\u003c/pre\u003e\n\n$ cat TestClass.c:\n\u003cpre\u003e\n#include \"TestClass.h\"\n\nTestClass TestClass_ctor (TestClass self) {\n    printf (\"%s '%s'\\n\", \"in constructor of\", NAMEOF (self));\n\n    self-\u003eset_name (self, ez_strdup_ctx (self, \"Jon Doe\"));\n    \n    return self;\n}\n\nvoid TestClass_dtor (TestClass self) {\n    printf (\"%s '%s'\\n\", \"in destructor of\", NAMEOF (self));\n\n    ez_free (self);\n}\n\nACCESSOR (TestClass, x, int);\nACCESSOR (TestClass, y, int);\nACCESSOR (TestClass, name, char*);\n\nVTABLE (TestClass, Object)\n    VACCESSOR (TestClass, x);\n    VACCESSOR (TestClass, y);\n    VACCESSOR (TestClass, name);\n    VMETHOD (ctor) = TestClass_ctor;\n    VMETHOD (dtor) = TestClass_dtor;\nEND_VTABLE\n\u003c/pre\u003e\n\n$ cat test.c:\n\u003cpre\u003e\n#include \"TestClass.h\"\n\nint main (int argc, char **argv) {\n\n    TestClass tc = CONSTRUCT (TestClass, TestClass, ctor, NULL);\n\n    printf (\"name: %s\\n\", tc-\u003eget_name (tc));\n    \n    tc-\u003eset_x (tc, 15);\n    CALL (tc, set_y, 22);\n\n    printf (\"pos x: %d\\n\", tc-\u003eget_x (tc));\n    printf (\"pos y: %d\\n\", tc-\u003eget_y (tc));\n\n    tc-\u003edtor (tc);\n\n    return 0;\n}\n\u003c/pre\u003e\n\n$ gcc TestClass.c test.c -lezlib -o test \u0026\u0026 ./test:\n\u003cpre\u003e\nin constructor of 'TestClass'\nname: Jon Doe\npos x: 15\npos y: 22\nin destructor of 'TestClass'\n\u003c/pre\u003e\n\nFunctions\n---------\n\n\u003cpre\u003e\n/*    ezarray.c    */\nEZArray*  ez_array_new ();\nvoid      ez_array_free (EZArray *array);\nEZArray*  ez_array_dup (EZArray *array);\nvoid      ez_array_foreach (EZArray *array, ez_array_func foreach);\nint       ez_array_index (EZArray *array, ezpointer value);\nint       ez_array_push (EZArray *array, ezpointer value);\nezpointer ez_array_pop (EZArray *array);\nezpointer ez_array_remove_index (EZArray *array, int index);\nezpointer ez_array_get_index (EZArray *array, int index);\nvoid      ez_array_set_index (EZArray *array, int index, ezpointer value);\n\n/*    ezbase64.c    */\nchar* ez_base64_encode (const void *data, size_t size);\nvoid* ez_base64_decode (const char *str);\n\n/*    ezhash.c    */\nstatic int   ez_hash_table_grow (EZHashTable *hash_table);\nstatic uint  ez_hash_table_strhash (const char *str);\nEZHashTable* ez_hash_table_new (uint capacity);\nvoid         ez_hash_table_free (EZHashTable *hash_table);\nint          ez_hash_table_insert (EZHashTable *hash_table, const char *key, ezpointer value);\nezpointer    ez_hash_table_lookup (EZHashTable *hash_table, const char *key);\nezpointer    ez_hash_table_remove (EZHashTable *hash_table, const char *key);\nuint         ez_hash_table_size (EZHashTable *hash_table);\nvoid         ez_hash_table_foreach (EZHashTable *hash_table, ez_hash_func func, ezpointer user_data);\nEZList*      ez_hash_table_get_keys (EZHashTable *hash_table);\nEZList*      ez_hash_table_get_values (EZHashTable *hash_table);\n\n/*    ezlist.c    */\nEZList* ez_list_alloc ();\nEZList* ez_list_append (EZList *list, ezpointer data);\nEZList* ez_list_last (EZList *list);\nEZList* ez_list_first (EZList *list);\nsize_t  ez_list_length (EZList *list);\nvoid    ez_list_free (EZList *list);\nvoid    ez_list_free_with_data (EZList *list, ez_list_free_func func);\nvoid    ez_list_free_1 (EZList *list);\nEZList* ez_list_prepend (EZList *list, ezpointer data);\nEZList* ez_list_insert (EZList *list, ezpointer data, int position);\nEZList* ez_list_nth (EZList *list, uint n);\nEZList* ez_list_remove (EZList *list, ezpointer data);\nvoid    ez_list_foreach (EZList *list, ez_list_func func, ezpointer user_data);\n\n/*    ezqueue.c    */\nEZQueue*  ez_queue_alloc ();\nvoid      ez_queue_push (EZQueue **queue, ezpointer data);\nezpointer ez_queue_pop (EZQueue **queue);\n\n/*    ezregex.c    */\nconst char* ez_regex_error ();\nint         ez_regex_error_offset ();\nEZRegex*    ez_regex_new (const char *regex);\nEZRegex*    ez_regex_new_with_options (const char *regex, int options);\nvoid        ez_regex_free (EZRegex *ezre);\nint         ez_regex_substrings (EZRegex *ezre);\nbool        ez_regex_match_with_options (EZRegex *ezre, const char *subject, int len, int options);\nbool        ez_regex_match_again_with_options (EZRegex *ezre, int options);\nchar*       ez_regex_get_substring (EZRegex *ezre, int index);\n\n/*    ezstack.c    */\nEZStack*  ez_stack_alloc ();\nvoid      ez_stack_push (EZStack **stack, ezpointer data);\nezpointer ez_stack_pop (EZStack **stack);\n\n/*    ezstrfuncs.c    */\nchar*  ez_strchug (char *string);\nchar*  ez_strchomp (char *string);\nchar*  ez_strstrip (char *string);\nchar*  ez_strchugc (char *string, char c);\nchar*  ez_strchompc (char *string, char c);\nchar*  ez_strstripc (char *string, char c);\nchar*  ez_stpcpy (char *dest, const char *src);\nchar*  ez_strconcat (const char *string1, ...);\nchar** ez_strsplit (const char *string, const char *delimiter, int max_tokens);\nchar*  ez_strjoinv (const char *separator, char **str_array);\nvoid   ez_strfreev (char **str_array);\nuint   ez_strv_length (char **str_array);\nchar*  ez_strjoin (const char *separator, ...);\nbool   ez_str_has_suffix (const char *str, const char *suffix);\nbool   ez_str_has_prefix (const char *str, const char *prefix);\nint    ez_strcmp0 (const char *str1, const char *str2);\nchar*  ez_strdown (char *string);\nchar*  ez_strup (char *string);\nchar*  ez_strreverse (char *string);\nint    ez_strcasecmp (const char *s1, const char *s2);\nint    ez_strncasecmp (const char *s1, const char *s2, size_t n);\nchar*  ez_strtruncate (char *string, size_t len);\nchar*  ez_stroverwrite (char *string, size_t pos, const char *val);\nchar*  ez_strerase (char *string, size_t pos, size_t len);\nchar*  ez_strprintf (const char *format, ...);\nchar*  ez_strreplace (char *string, char *needle, char *replace);\n\n/*    ezstring.c    */\nEZString* ez_string_new (const char* init);\nEZString* ez_string_sized_new (size_t dfl_size);\nEZString* ez_string_append (EZString *string, const char *val);\nEZString* ez_string_append_c (EZString *string, const char val);\nEZString* ez_string_prepend (EZString *string, const char *val);\nEZString* ez_string_prepend_c (EZString *string, const char val);\nEZString* ez_string_reverse (EZString *string);\nEZString* ez_string_up (EZString *string);\nEZString* ez_string_down (EZString *string);\nEZString* ez_string_overwrite (EZString *string, size_t pos, const char *val);\nEZString* ez_string_erase (EZString *string, size_t pos, size_t len);\nEZString* ez_string_printf (const char *format, ...);\nEZString* ez_string_append_printf (EZString *string, const char *format, ...);\nEZString* ez_string_prepend_printf (EZString *string, const char *format, ...);\nEZString* ez_string_truncate (EZString *string, size_t len);\nEZString* ez_string_dup (const EZString *string);\nbool      ez_string_equal (const EZString *v, const EZString *v2);\nuint      ez_string_hash (const EZString *string);\nchar*     ez_string_free (EZString *string, bool free_segment);\n\u003c/pre\u003e\n\nDownload\n--------\nNo releases yet.\n\nFAQ\n---\n\nQ: Why? How? What!?\u003cbr /\u003e\nA: ...\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffschaefer%2Fezlib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffschaefer%2Fezlib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffschaefer%2Fezlib/lists"}