aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjustanothercatgirl <sotov2070@gmail.com>2024-05-19 11:19:51 +0300
committerjustanothercatgirl <sotov2070@gmail.com>2024-05-19 11:33:00 +0300
commitdff89dcae590315c6916bc24407f9c80dd74f049 (patch)
tree8da32228273b0686376b17e7a9c6989d5d67eae5
parenta5f0d6ae9ace560b67c114af9071a268d8df2dc9 (diff)
tobeamended
-rw-r--r--Makefile2
-rw-r--r--include/dynarray.h2
-rw-r--r--include/ttycolor.h84
-rw-r--r--include/utility.h17
-rw-r--r--tests/dynarray.c31
5 files changed, 126 insertions, 10 deletions
diff --git a/Makefile b/Makefile
index 6dbbfe7..0fb81ad 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
CC := gcc
-CFLAGS := -g -Wall -Wextra -Wpedantic -Werror
+CFLAGS := -g -Wall -Wextra -Wpedantic -Werror -Wno-language-extension-token
tests: dynarray
diff --git a/include/dynarray.h b/include/dynarray.h
index bdb9db9..79b548e 100644
--- a/include/dynarray.h
+++ b/include/dynarray.h
@@ -63,7 +63,7 @@
/// set capacity to minimum possible value
#define array_shrink(array) array = _memshrink_array(array)
/// bound-checks and returns a pointer to that element. on error returns NULL
-#define array_at(array, idx) (idx < array_size(array) ? array[idx] : NULL)
+#define array_at(array, idx) (idx < array_size(array) ? (typeof(array))((byte*)array + idx*array_size(array)) : NULL)
/// sorts the array using compare_func for comparison
#define array_qsort(array, compare_func) qsort(array, array_size(array), array_element_size(array), compare_func)
/// sorts the array using pre-defined compariton functions for signed integers based on size (1, 2, 4, 8)
diff --git a/include/ttycolor.h b/include/ttycolor.h
new file mode 100644
index 0000000..d3f6f85
--- /dev/null
+++ b/include/ttycolor.h
@@ -0,0 +1,84 @@
+#ifndef JUSTANOTHERCATGIRL_HEADERS_TTYCOLOR
+#define JUSTANOTHERCATGIRL_HEADERS_TTYCOLOR
+
+/// This header is a collection of macros and escape sequences for ANSII terminals.
+/// It has common tempalte for abbreviation <Letter1><Letter2(optional)><3 letters>.
+/// * First letter: C for Color (text color), B for Backdround (bg color), T for Text (text mode)
+/// * Second letter: B for Bright, N for uNset (only in combination with T as 1st letter)
+/// * 3 last letters can be checked in comments after each definition
+
+#include "utility.h"
+
+
+#define PAINT_STRING(string, args...) ("\x1b[" arg1 ";" arg2 ";" ... "m" string ARES)
+
+#define ARES "\x1b[0m" // All RESet
+
+// resular text colors
+#define CBLK "\x1b[30m" // black
+#define CRED "\x1b[31m" // red
+#define CGRN "\x1b[32m" // green
+#define CYLW "\x1b[33m" // yellow
+#define CBLU "\x1b[34m" // blue
+#define CMAG "\x1b[35m" // magenta
+#define CCYN "\x1b[36m" // cyan
+#define CWHT "\x1b[37m" // white
+#define CDEF "\x1b[39m" // default
+#define CBLK "\x1b[30m" // black
+
+// regular background colors
+#define BBLK "\x1b[40m" // black
+#define BRED "\x1b[41m" // red
+#define BGRN "\x1b[42m" // green
+#define BYLW "\x1b[43m" // yellow
+#define BBLU "\x1b[44m" // blue
+#define BMAG "\x1b[45m" // magenta
+#define BCYN "\x1b[46m" // cyan
+#define BWHT "\x1b[47m" // white
+#define BDEF "\x1b[49m" // default
+#define BBLK "\x1b[40m" // black
+
+
+// bright text colors
+#define CBBLK "\x1b[90m" // bright black
+#define CBRED "\x1b[91m" // bright red
+#define CBGRN "\x1b[92m" // bright green
+#define CBYLW "\x1b[93m" // bright yellow
+#define CBBLU "\x1b[94m" // bright blue
+#define CBMAG "\x1b[95m" // bright magenta
+#define CBCYN "\x1b[96m" // bright cyan
+#define CBWHT "\x1b[97m" // bright white
+
+// bright baclground colors
+#define BBBLK "\x1b[100m" // bright black
+#define BBRED "\x1b[101m" // bright red
+#define BBGRN "\x1b[102m" // bright green
+#define BBYLW "\x1b[103m" // bright yellow
+#define BBBLU "\x1b[104m" // bright blue
+#define BBMAG "\x1b[105m" // bright magenta
+#define BBCYN "\x1b[106m" // bright cyan
+#define BBWHT "\x1b[107m" // bright white
+
+
+// text style set
+#define TSBLD "\x1b[1m" // bold
+#define TSDIM "\x1b[2m" // dim/faint
+#define TSITL "\x1b[3m" // italic
+#define TSUND "\x1b[4m" // underline
+#define TSBNK "\x1b[5m" // blinking
+#define TSINV "\x1b[7m" // inverse/reverse
+#define TSHID "\x1b[8m" // hidden/invisible
+#define TSSTR "\x1b[9m" // strikethrough
+
+// text style unset
+#define TNBLD "\x1b[22m" // bold
+#define TNDIM "\x1b[22m" // dim/faint
+#define TNITL "\x1b[23m" // italic
+#define TNUND "\x1b[24m" // underline
+#define TNBNK "\x1b[25m" // blinking
+#define TNINV "\x1b[27m" // inverse/reverse
+#define TNHID "\x1b[28m" // hidden/invisible
+#define TNSTR "\x1b[29m" // strikethrough
+
+#endif //JUSTANOTHERCATGIRL_HEADERS_TTYCOLOR
+
diff --git a/include/utility.h b/include/utility.h
index 4f264f0..85948cf 100644
--- a/include/utility.h
+++ b/include/utility.h
@@ -4,6 +4,8 @@
#define stringify(val) _stringify_helper(val)
#define _stringify_helper(val) #val
+#define string_concat_separator(first, ...) stringify(first) ";" string_concat_separator(__VA_ARGS__)
+
#define struct_member_size(type, member) sizeof(( (type*)0 )->member)
typedef unsigned char byte;
#define upper_2_power_32(number) (32 - __builtin_clz(number))
@@ -11,7 +13,7 @@ typedef unsigned char byte;
typedef int(*qsort_cmp_t)(const void*, const void*);
#define get_qsort_cmp(type) __qsort_cmps[sizeof(type)]
-extern const qsort_cmp_t __qsort_cmps[];
+extern const qsort_cmp_t __qsort_cmps[64];
#ifdef UTILITY_EXPOSE_HELPERS
#define _UTILITY_STATIC
@@ -58,17 +60,26 @@ _UTILITY_STATIC int __default_long_cmp(const void* a, const void* b) {
return 0;
}
+#ifdef __GNUC__
// cope
#pragma GCC diagnostic ignored "-Woverride-init" // Is is meant to override it on different platforms
-const qsort_cmp_t __qsort_cmps[] = {
+const qsort_cmp_t __qsort_cmps[64] = {
[sizeof(char)] = __default_char_cmp,
[sizeof(short)] = __default_short_cmp,
[sizeof(int)] = __default_int_cmp,
[sizeof(long)] = __default_long_cmp,
[sizeof(long long)] = __default_long_long_cmp,
- [64] = 0,
+ [63] = 0,
};
#pragma GCC diagnostic warning "-Woverride-init"
+#else // not __GNUC__
+const qsort_cmp_t __qsort_cmps[64] = {
+ 0,
+ __default_char_cmp, __default_short_cmp, 0, __default_int_cmp,
+ 0, 0, 0, __default_long_long_cmp,
+};
+#endif // __GNUC__
+
#endif // UTILITY_IMPLEMENTATION
diff --git a/tests/dynarray.c b/tests/dynarray.c
index e050d07..d7a79d7 100644
--- a/tests/dynarray.c
+++ b/tests/dynarray.c
@@ -39,7 +39,7 @@ void print_arr(TEST_TYPE *a, int line, const char* message)
);
}
-int main()
+int main(void)
{
TEST_TYPE *arr = array_new(TEST_TYPE, 10); // size: 10, cap: 10
for (size_t i = 0; i < array_size(arr); ++i) { arr[i] = 127 - 2 * i; }
@@ -67,16 +67,37 @@ int main()
TEST_TYPE test_arr_data[] = {0, 42, 0, 20, 0, 69, 0, 123, 0, 125, 0, 127, 0, };
TEST_TYPE* test_arr = array_new_buffer_copy(TEST_TYPE, test_arr_data, sizeof(test_arr_data) / sizeof(test_arr_data[0]));
- typeof(EXIT_SUCCESS) exit_status;
if (array_compare(test_arr, arr, __qsort_cmps[sizeof(TEST_TYPE)])) {
puts("\x1b[31mTest for \"" stringify(TEST_TYPE)"\" failed\x1b[0m");
- exit_status = EXIT_FAILURE;
+ goto exit_fail;
} else {
puts("\x1b[32mTest for \"" stringify(TEST_TYPE)"\" passed\x1b[0m");
- exit_status = EXIT_SUCCESS;
+ }
+ TEST_TYPE* elem;
+ if ((elem = array_at(arr, 2)) != NULL) {
+ if (*elem == 42) {
+ puts("array_at(1) = 42");
+ }
+ else {
+ printf("%s@%i: array_at failed\n", __FILE__, __LINE__);
+ goto exit_fail;
+ }
+ } else {
+ printf("%s@%i: array_at failed\n", __FILE__, __LINE__);
+ goto exit_fail;
+
+ }
+ if (( elem = array_at(arr, 69420)) != NULL) {
+ printf("%s@%i: array_at failed\n", __FILE__, __LINE__);
+ goto exit_fail;
}
+//exit:
+ array_free(arr);
+ array_free(test_arr);
+ exit(EXIT_SUCCESS);
+exit_fail:
array_free(arr);
array_free(test_arr);
- exit(exit_status);
+ exit(EXIT_FAILURE);
}