From 2f96fd401790cc4ba26b4aa5eccf65d548d38bb7 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sat, 25 Nov 2023 17:56:18 +0500 Subject: [PATCH 01/43] =?UTF-8?q?upd:=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=B0=D0=B8=D0=B2=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?push=20&=20pop=20+=20=D1=80=D0=B0=D0=B7=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82?= =?UTF-8?q?=D1=83=D1=80=D0=B0=20=D1=81=D1=82=D0=B5=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 7 +++-- cstack.c | 83 ++++++++++++++++++++++++++++++++++++++++++++------ cstack.h | 6 ++++ test.cpp | 60 +++++++++++++++++++++++++++++------- 4 files changed, 133 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a404d75..8df70cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,15 @@ -cmake_minimum_required(VERSION 3.22) +cmake_minimum_required(VERSION 3.20) project(cstack) enable_testing() -option(WITH_TEST "Build test (GTest library required)" OFF) +option(WITH_TEST "Build test (GTest library required)" ON) + +include(FetchContent) # build library add_library(cstack STATIC cstack.c) + # build test if (WITH_TEST) enable_testing() diff --git a/cstack.c b/cstack.c index 72e36b4..9b6cd20 100644 --- a/cstack.c +++ b/cstack.c @@ -1,16 +1,71 @@ #include "cstack.h" -#include +// Реализация записи данных позаимствована отсюда +// https://constantsmatter.com/posts/generic-ds-c/ + +// *** LIBRARY SETTINGS *** + +#define STACK_TABLE_HANDLER_MIN_CAP 10 +#define STACK_MIN_CAP_SIZE 256 #define UNUSED(VAR) (void)(VAR) +// ======================== + +#pragma pack(push, 1) +typedef struct node +{ + unsigned int size; + void* data; + struct node* prev; +} node_t; +#pragma pack(pop) + +#pragma pack(push, 1) +struct stack +{ + unsigned int reserved; + struct node* entry; +}; +#pragma pack(pop) + +#pragma pack(push, 1) +struct stack_entries_table +{ + int size_stack; + + int capacity; + int count; + struct stack* stacks; // Указывает на указатели входа в стеки +}; +#pragma pack(pop) + +struct stack_entries_table g_table = +{ + STACK_MIN_CAP_SIZE, + STACK_TABLE_HANDLER_MIN_CAP, + 0, + NULL +}; + hstack_t stack_new(void) { - return -1; + if (g_table.count == 0) + stack_init(); + + ++g_table.count; + return 0; +} + +void stack_init(void) { + g_table.stacks = malloc((sizeof(char*) * g_table.capacity) * g_table.size_stack); + for (int i = 0; i < g_table.capacity; ++i) { + g_table.stacks[i].entry = malloc(sizeof(node_t) * g_table.size_stack); + } } void stack_free(const hstack_t hstack) { - UNUSED(hstack); + free(&g_table.stacks[hstack]); } int stack_valid_handler(const hstack_t hstack) @@ -27,16 +82,24 @@ unsigned int stack_size(const hstack_t hstack) void stack_push(const hstack_t hstack, const void* data_in, const unsigned int size) { - UNUSED(hstack); - UNUSED(data_in); - UNUSED(size); + node_t* ptr = malloc(sizeof(node_t) + size); + if (ptr != NULL) { + ptr->size = size; + ptr->data = ptr + sizeof size; + memcpy(ptr, data_in, size); + ptr->prev = g_table.stacks[hstack].entry; + g_table.stacks[hstack].entry = ptr; + } } unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int size) { - UNUSED(hstack); - UNUSED(data_out); - UNUSED(size); - return 0; + if (g_table.stacks[hstack].entry == NULL) + return 0; + memcpy(data_out, g_table.stacks[hstack].entry, size); + node_t* ptr_prev = g_table.stacks[hstack].entry->prev; + free(g_table.stacks[hstack].entry); + g_table.stacks[hstack].entry = ptr_prev; + return size; } diff --git a/cstack.h b/cstack.h index 09cabb4..a71a6a2 100644 --- a/cstack.h +++ b/cstack.h @@ -1,6 +1,10 @@ #ifndef CSTACK_H #define CSTACK_H +#include +#include +#include + typedef int hstack_t; hstack_t stack_new(void); @@ -10,4 +14,6 @@ unsigned int stack_size(const hstack_t stack); void stack_push(const hstack_t stack, const void* data_in, const unsigned int size); unsigned int stack_pop(const hstack_t stack, void* data_out, const unsigned int size); +void stack_init(void); + #endif /* CSTACK_H */ diff --git a/test.cpp b/test.cpp index 657219b..47ba12f 100644 --- a/test.cpp +++ b/test.cpp @@ -5,23 +5,61 @@ extern "C" { #include "cstack.h" } -TEST(AllAPITest, BadStackHandler) -{ - stack_free(-1); - EXPECT_EQ(stack_valid_handler(-1), 1); - EXPECT_EQ(stack_size(-1), 0u); +//TEST(AllAPITest, BadStackHandler) +//{ +// stack_free(-1); +// EXPECT_EQ(stack_valid_handler(-1), 1); +// EXPECT_EQ(stack_size(-1), 0u); +// const int data_in = 1; +// stack_push(-1, &data_in, sizeof(data_in)); +// int data_out = 0; +// EXPECT_EQ(stack_pop(-1, &data_out, sizeof(data_out)), 0u); +// EXPECT_EQ(data_out, 0); +//} + + +TEST(AllocationTests, Kostya1) { + const hstack_t stack = stack_new(); const int data_in = 1; - stack_push(-1, &data_in, sizeof(data_in)); - int data_out = 0; - EXPECT_EQ(stack_pop(-1, &data_out, sizeof(data_out)), 0u); - EXPECT_EQ(data_out, 0); + stack_push(stack, &data_in, sizeof(data_in)); + int data_out; + EXPECT_EQ(stack_pop(stack, &data_out, sizeof(data_out)), sizeof(data_out)); + EXPECT_EQ(data_out, 1); +} + +TEST(AllocationTests, Kostya2) { + const hstack_t stack = stack_new(); + const int data_in1 = 1; + const int data_in2 = 2; + stack_push(stack, &data_in1, sizeof(data_in1)); + stack_push(stack, &data_in2, sizeof(data_in2)); + int data_out; + EXPECT_EQ(stack_pop(stack, &data_out, sizeof(data_out)), sizeof(data_out)); + EXPECT_EQ(data_out, 2); + EXPECT_EQ(stack_pop(stack, &data_out, sizeof(data_out)), sizeof(data_out)); + EXPECT_EQ(data_out, 1); +} + +TEST(AllocationTests, Kostya3) { + const hstack_t stack = stack_new(); + const int data_in1 = 1; + const double data_in2 = 2.2; + stack_push(stack, &data_in1, sizeof(data_in1)); + stack_push(stack, &data_in2, sizeof(data_in2)); + int data_out1; + double data_out2; + EXPECT_EQ(stack_pop(stack, &data_out2, sizeof(data_out2)), sizeof(data_out2)); + EXPECT_EQ(data_out2, 2.2); + EXPECT_EQ(stack_pop(stack, &data_out1, sizeof(data_out1)), sizeof(data_out1)); + EXPECT_EQ(data_out1, 1); } + TEST(AllocationTests, SingleAllocation) { const hstack_t stack = stack_new(); - EXPECT_EQ(stack_valid_handler(stack), 0); - EXPECT_EQ(stack_size(stack), 0u); + //EXPECT_EQ(stack_valid_handler(stack), 0); + //EXPECT_EQ(stack_size(stack), 0u); stack_free(stack); EXPECT_EQ(stack_valid_handler(stack), 1); } From 5743621e554a1b2f94d8f979ea0c6a5e5d14a176 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 26 Nov 2023 21:46:22 +0500 Subject: [PATCH 02/43] slv: first version of working stack --- cstack.c | 136 +++++++++++++++++++++++++++++++++++++------------------ cstack.h | 2 - test.cpp | 31 +++++++------ 3 files changed, 110 insertions(+), 59 deletions(-) diff --git a/cstack.c b/cstack.c index 9b6cd20..84189e2 100644 --- a/cstack.c +++ b/cstack.c @@ -5,8 +5,8 @@ // *** LIBRARY SETTINGS *** -#define STACK_TABLE_HANDLER_MIN_CAP 10 -#define STACK_MIN_CAP_SIZE 256 +#define STACK_TABLE_HANDLER 12u +#define STACK_MIN_CAPACITY 256u #define UNUSED(VAR) (void)(VAR) // ======================== @@ -14,92 +14,140 @@ #pragma pack(push, 1) typedef struct node { - unsigned int size; void* data; - struct node* prev; + struct node* prev; } node_t; #pragma pack(pop) #pragma pack(push, 1) -struct stack +typedef struct stack { - unsigned int reserved; + _Bool isFree; + unsigned int capacity; + unsigned int reserved; // Количество занятых байтов в стеке struct node* entry; -}; +} stack_t; #pragma pack(pop) #pragma pack(push, 1) -struct stack_entries_table +typedef struct stack_entries_table { - int size_stack; - - int capacity; - int count; - struct stack* stacks; // Указывает на указатели входа в стеки -}; + int count; + stack_t* stacks[STACK_TABLE_HANDLER]; // Указывает на указатели входа в стеки +} stack_entries_table_t; #pragma pack(pop) -struct stack_entries_table g_table = +stack_entries_table_t g_table = { - STACK_MIN_CAP_SIZE, - STACK_TABLE_HANDLER_MIN_CAP, 0, NULL }; hstack_t stack_new(void) { - if (g_table.count == 0) - stack_init(); - - ++g_table.count; - return 0; -} + stack_t* _stack = (stack_t*)malloc(sizeof(stack_t)); -void stack_init(void) { - g_table.stacks = malloc((sizeof(char*) * g_table.capacity) * g_table.size_stack); - for (int i = 0; i < g_table.capacity; ++i) { - g_table.stacks[i].entry = malloc(sizeof(node_t) * g_table.size_stack); + if (_stack == NULL) { + return -1; } + + _stack->reserved = 0; + _stack->capacity = STACK_MIN_CAPACITY; + _stack->isFree = 0; + _stack->entry = NULL; + + g_table.stacks[g_table.count] = _stack; + + return g_table.count++; } void stack_free(const hstack_t hstack) { - free(&g_table.stacks[hstack]); + if (g_table.stacks[hstack] == NULL || hstack >= STACK_TABLE_HANDLER) { + return; + } + + stack_t* ptrStack = g_table.stacks[hstack]; + if (!ptrStack->entry) { + free(ptrStack->entry); + } + free(ptrStack); + g_table.stacks[hstack] = (stack_t*)NULL; + --g_table.count; } int stack_valid_handler(const hstack_t hstack) { - UNUSED(hstack); - return 1; + if (g_table.stacks[hstack] == NULL) { + return 1; + } + return 0; } unsigned int stack_size(const hstack_t hstack) { - UNUSED(hstack); - return 0; + if (g_table.stacks[hstack] == NULL || hstack >= STACK_TABLE_HANDLER) { + return 0; + } + + int _i = 0; + + for (node_t* _node = g_table.stacks[hstack]->entry; !(_node == NULL); _node = _node->prev) { + ++_i; + } + return _i; } void stack_push(const hstack_t hstack, const void* data_in, const unsigned int size) { - node_t* ptr = malloc(sizeof(node_t) + size); - if (ptr != NULL) { - ptr->size = size; - ptr->data = ptr + sizeof size; - memcpy(ptr, data_in, size); - ptr->prev = g_table.stacks[hstack].entry; - g_table.stacks[hstack].entry = ptr; + if (g_table.stacks[hstack] == NULL || hstack >= STACK_TABLE_HANDLER) { + return; + } + + if (data_in == NULL || size <= 0) { + return; + } + + node_t* ptr = (node_t*)malloc(sizeof(node_t)); + + if (ptr == NULL) { + return; } + + + ptr->data = malloc(size); + if (ptr->data == NULL) { + free(ptr); + return; + } + + memcpy(ptr->data, data_in, size); + + ptr->prev = g_table.stacks[hstack]->entry; + + g_table.stacks[hstack]->entry = ptr; + g_table.stacks[hstack]->reserved += size + sizeof(node_t); } unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int size) { - if (g_table.stacks[hstack].entry == NULL) + if (g_table.stacks[hstack] == NULL || hstack >= STACK_TABLE_HANDLER) { return 0; - memcpy(data_out, g_table.stacks[hstack].entry, size); - node_t* ptr_prev = g_table.stacks[hstack].entry->prev; - free(g_table.stacks[hstack].entry); - g_table.stacks[hstack].entry = ptr_prev; + } + + if (data_out == NULL || size <= 0) { + return 0; + } + + if (g_table.stacks[hstack]->entry == NULL) { + return 0; + } + + memcpy(data_out, g_table.stacks[hstack]->entry->data, size); + + node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev; + g_table.stacks[hstack]->entry = _nextTopNode; + g_table.stacks[hstack]->reserved -= size + sizeof(node_t); return size; } diff --git a/cstack.h b/cstack.h index a71a6a2..5fe6a5f 100644 --- a/cstack.h +++ b/cstack.h @@ -14,6 +14,4 @@ unsigned int stack_size(const hstack_t stack); void stack_push(const hstack_t stack, const void* data_in, const unsigned int size); unsigned int stack_pop(const hstack_t stack, void* data_out, const unsigned int size); -void stack_init(void); - #endif /* CSTACK_H */ diff --git a/test.cpp b/test.cpp index 47ba12f..809f3e4 100644 --- a/test.cpp +++ b/test.cpp @@ -5,17 +5,17 @@ extern "C" { #include "cstack.h" } -//TEST(AllAPITest, BadStackHandler) -//{ -// stack_free(-1); -// EXPECT_EQ(stack_valid_handler(-1), 1); -// EXPECT_EQ(stack_size(-1), 0u); -// const int data_in = 1; -// stack_push(-1, &data_in, sizeof(data_in)); -// int data_out = 0; -// EXPECT_EQ(stack_pop(-1, &data_out, sizeof(data_out)), 0u); -// EXPECT_EQ(data_out, 0); -//} +TEST(AllAPITest, BadStackHandler) +{ + stack_free(-1); + EXPECT_EQ(stack_valid_handler(-1), 1); + EXPECT_EQ(stack_size(-1), 0u); + const int data_in = 1; + stack_push(-1, &data_in, sizeof(data_in)); + int data_out = 0; + EXPECT_EQ(stack_pop(-1, &data_out, sizeof(data_out)), 0u); + EXPECT_EQ(data_out, 0); +} TEST(AllocationTests, Kostya1) { @@ -25,6 +25,7 @@ TEST(AllocationTests, Kostya1) { int data_out; EXPECT_EQ(stack_pop(stack, &data_out, sizeof(data_out)), sizeof(data_out)); EXPECT_EQ(data_out, 1); + stack_free(0); } TEST(AllocationTests, Kostya2) { @@ -38,6 +39,7 @@ TEST(AllocationTests, Kostya2) { EXPECT_EQ(data_out, 2); EXPECT_EQ(stack_pop(stack, &data_out, sizeof(data_out)), sizeof(data_out)); EXPECT_EQ(data_out, 1); + stack_free(0); } TEST(AllocationTests, Kostya3) { @@ -46,19 +48,22 @@ TEST(AllocationTests, Kostya3) { const double data_in2 = 2.2; stack_push(stack, &data_in1, sizeof(data_in1)); stack_push(stack, &data_in2, sizeof(data_in2)); + EXPECT_EQ(stack_size(stack), 2); int data_out1; double data_out2; EXPECT_EQ(stack_pop(stack, &data_out2, sizeof(data_out2)), sizeof(data_out2)); EXPECT_EQ(data_out2, 2.2); EXPECT_EQ(stack_pop(stack, &data_out1, sizeof(data_out1)), sizeof(data_out1)); EXPECT_EQ(data_out1, 1); + stack_free(0); } TEST(AllocationTests, SingleAllocation) { + EXPECT_EQ(stack_valid_handler(0), 1); const hstack_t stack = stack_new(); - //EXPECT_EQ(stack_valid_handler(stack), 0); + EXPECT_EQ(stack_valid_handler(stack), 0); //EXPECT_EQ(stack_size(stack), 0u); stack_free(stack); EXPECT_EQ(stack_valid_handler(stack), 1); @@ -113,7 +118,7 @@ TEST_F(ModifyTests, PopBadArgs) { const size_t size = 5; const int data_in[size] = {1}; - stack_push(stack, &data_in, sizeof(data_in)); + stack_push(stack, &data_in[0], sizeof(data_in)); ASSERT_EQ(stack_size(stack), 1u); EXPECT_EQ(stack_pop(stack, nullptr, 0u), 0u); From 81c12087bfb12bf5277300bf060e4b6cbb60892f Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 26 Nov 2023 21:58:06 +0500 Subject: [PATCH 03/43] fix: remove capacity in stacks --- cstack.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/cstack.c b/cstack.c index 84189e2..3911eae 100644 --- a/cstack.c +++ b/cstack.c @@ -6,7 +6,6 @@ // *** LIBRARY SETTINGS *** #define STACK_TABLE_HANDLER 12u -#define STACK_MIN_CAPACITY 256u #define UNUSED(VAR) (void)(VAR) // ======================== @@ -23,7 +22,6 @@ typedef struct node typedef struct stack { _Bool isFree; - unsigned int capacity; unsigned int reserved; // Количество занятых байтов в стеке struct node* entry; } stack_t; @@ -52,7 +50,6 @@ hstack_t stack_new(void) } _stack->reserved = 0; - _stack->capacity = STACK_MIN_CAPACITY; _stack->isFree = 0; _stack->entry = NULL; From 8567d9e4a3dae6e19d5388d3ba67f7ef89800269 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 26 Nov 2023 22:04:21 +0500 Subject: [PATCH 04/43] fix: remove reserved and isFree from stack_t --- cstack.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/cstack.c b/cstack.c index 3911eae..c961bfc 100644 --- a/cstack.c +++ b/cstack.c @@ -21,8 +21,6 @@ typedef struct node #pragma pack(push, 1) typedef struct stack { - _Bool isFree; - unsigned int reserved; // Количество занятых байтов в стеке struct node* entry; } stack_t; #pragma pack(pop) @@ -48,9 +46,6 @@ hstack_t stack_new(void) if (_stack == NULL) { return -1; } - - _stack->reserved = 0; - _stack->isFree = 0; _stack->entry = NULL; g_table.stacks[g_table.count] = _stack; @@ -123,7 +118,6 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s ptr->prev = g_table.stacks[hstack]->entry; g_table.stacks[hstack]->entry = ptr; - g_table.stacks[hstack]->reserved += size + sizeof(node_t); } unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int size) @@ -144,7 +138,6 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev; g_table.stacks[hstack]->entry = _nextTopNode; - g_table.stacks[hstack]->reserved -= size + sizeof(node_t); return size; } From 1d29408d3dfd986babf8fb3bcfd44a54d13f9223 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 26 Nov 2023 23:15:08 +0500 Subject: [PATCH 05/43] fix: free memory from popped node & remove g_table count check --- cstack.c | 22 +++++++++++++++++----- test.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/cstack.c b/cstack.c index c961bfc..47e46af 100644 --- a/cstack.c +++ b/cstack.c @@ -55,12 +55,14 @@ hstack_t stack_new(void) void stack_free(const hstack_t hstack) { - if (g_table.stacks[hstack] == NULL || hstack >= STACK_TABLE_HANDLER) { + if (g_table.stacks[hstack] == NULL || + hstack >= STACK_TABLE_HANDLER) + { return; } stack_t* ptrStack = g_table.stacks[hstack]; - if (!ptrStack->entry) { + if (ptrStack->entry != NULL) { free(ptrStack->entry); } free(ptrStack); @@ -70,7 +72,9 @@ void stack_free(const hstack_t hstack) int stack_valid_handler(const hstack_t hstack) { - if (g_table.stacks[hstack] == NULL) { + if (g_table.stacks[hstack] == NULL || + hstack < 0 || + hstack >= STACK_TABLE_HANDLER) { return 1; } return 0; @@ -78,7 +82,9 @@ int stack_valid_handler(const hstack_t hstack) unsigned int stack_size(const hstack_t hstack) { - if (g_table.stacks[hstack] == NULL || hstack >= STACK_TABLE_HANDLER) { + if (g_table.stacks[hstack] == NULL || + hstack >= STACK_TABLE_HANDLER) + { return 0; } @@ -92,7 +98,9 @@ unsigned int stack_size(const hstack_t hstack) void stack_push(const hstack_t hstack, const void* data_in, const unsigned int size) { - if (g_table.stacks[hstack] == NULL || hstack >= STACK_TABLE_HANDLER) { + if (g_table.stacks[hstack] == NULL || + hstack >= STACK_TABLE_HANDLER) + { return; } @@ -137,6 +145,10 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int memcpy(data_out, g_table.stacks[hstack]->entry->data, size); node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev; + + free(g_table.stacks[hstack]->entry->data); + free(g_table.stacks[hstack]->entry); + g_table.stacks[hstack]->entry = _nextTopNode; return size; } diff --git a/test.cpp b/test.cpp index 809f3e4..aa28bd1 100644 --- a/test.cpp +++ b/test.cpp @@ -58,6 +58,38 @@ TEST(AllocationTests, Kostya3) { stack_free(0); } +TEST(AllocationTests, StressTest) { + const size_t count = 10; + hstack_t stacks[count] = { -1 }; + for (size_t i = 0; i < count; ++i) + { + stacks[i] = stack_new(); + EXPECT_EQ(stack_valid_handler(stacks[i]), 0); + EXPECT_EQ(stack_size(stacks[i]), 0u); + } + + for (int i = 1; i < 100; ++i) { + for (int j = 0; j < 10; ++j) { + int a = i + j; + stack_push(j, &a, sizeof(int)); + EXPECT_EQ(stack_size(stacks[j]), i); + } + } + + int data_out[10][100]; + for (int i = 0; i < 100; ++i) { + for (int j = 0; j < 10; ++j) { + stack_pop(j, &data_out[j][i], sizeof(int)); + } + } + + for (size_t i = 0; i < count; ++i) + { + stack_free(stacks[i]); + EXPECT_EQ(stack_valid_handler(stacks[i]), 1); + } +} + TEST(AllocationTests, SingleAllocation) { From 048941a984d797c161bc5615de9a9b8f91df0966 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:32:13 +0500 Subject: [PATCH 06/43] Create cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/cmake-single-platform.yml diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml new file mode 100644 index 0000000..941c412 --- /dev/null +++ b/.github/workflows/cmake-single-platform.yml @@ -0,0 +1,21 @@ +name: my-workflow-name + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Install gtest manually + run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a + - uses: actions/checkout@v1 + - name: configure + run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-Werror" .. + - name: make + run: cd build && make + - name: Run Test + run: /home/runner/work/github_actions_gtest_example/github_actions_gtest_example/build/test/github_actions_gtest_example.test From 6e5d2ae6ab9f2fac8a133048e761b4e0b6951aea Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:39:33 +0500 Subject: [PATCH 07/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 941c412..a89a78e 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -14,7 +14,7 @@ jobs: run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a - uses: actions/checkout@v1 - name: configure - run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-Werror" .. + run: mkdir build && cd build && cmake --build - name: make run: cd build && make - name: Run Test From 62bf86d262773c6f9e63e0fecac0d145097228c1 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:41:33 +0500 Subject: [PATCH 08/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index a89a78e..18427a1 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -14,7 +14,7 @@ jobs: run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a - uses: actions/checkout@v1 - name: configure - run: mkdir build && cd build && cmake --build + run: mkdir build && cd build && cmake .. && cmake --build - name: make run: cd build && make - name: Run Test From ac48875c82f84cc5745b9d888dbe483e26c95f08 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:47:21 +0500 Subject: [PATCH 09/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 18427a1..7479f47 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -11,10 +11,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Install gtest manually - run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a + run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgmock.a && && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgmock_main.a - uses: actions/checkout@v1 - name: configure - run: mkdir build && cd build && cmake .. && cmake --build + run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Werror" .. - name: make run: cd build && make - name: Run Test From b36ccad7f017ebed6b7dd0ce0c8f52756341215f Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:48:40 +0500 Subject: [PATCH 10/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 7479f47..5b56a53 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install gtest manually - run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgmock.a && && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgmock_main.a + run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a && sudo ln -s /usr/lib/libgmock.a /usr/local/lib/libgmock.a && && sudo ln -s /usr/lib/libgmock_main.a /usr/local/lib/libgmock_main.a - uses: actions/checkout@v1 - name: configure run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Werror" .. From 8214a999aad65595f5be7b8491c4d29d040c93e5 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:49:23 +0500 Subject: [PATCH 11/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 5b56a53..3af1632 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install gtest manually - run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a && sudo ln -s /usr/lib/libgmock.a /usr/local/lib/libgmock.a && && sudo ln -s /usr/lib/libgmock_main.a /usr/local/lib/libgmock_main.a + run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a && sudo ln -s /usr/lib/libgmock.a /usr/local/lib/libgmock.a && sudo ln -s /usr/lib/libgmock_main.a /usr/local/lib/libgmock_main.a - uses: actions/checkout@v1 - name: configure run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Werror" .. From ce8ba93a1fb0407c3153661570969d8a91cf8f4e Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Sun, 26 Nov 2023 23:56:03 +0500 Subject: [PATCH 12/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 3af1632..3c28767 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Install gtest manually - run: sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a && sudo ln -s /usr/lib/libgmock.a /usr/local/lib/libgmock.a && sudo ln -s /usr/lib/libgmock_main.a /usr/local/lib/libgmock_main.a + run: sudo apt-get install libgtest-dev && sudo apt-get install libgmock-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a && sudo ln -s /usr/lib/libgmock.a /usr/local/lib/libgmock.a && sudo ln -s /usr/lib/libgmock_main.a /usr/local/lib/libgmock_main.a - uses: actions/checkout@v1 - name: configure run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Werror" .. From 2c13d9ad8e598d3c7f8d87269640adfb8cad6804 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 26 Nov 2023 23:58:08 +0500 Subject: [PATCH 13/43] fix: make STACK_TABLE_HANDLER signed int --- cstack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cstack.c b/cstack.c index 47e46af..f6f6673 100644 --- a/cstack.c +++ b/cstack.c @@ -5,7 +5,7 @@ // *** LIBRARY SETTINGS *** -#define STACK_TABLE_HANDLER 12u +#define STACK_TABLE_HANDLER 12 #define UNUSED(VAR) (void)(VAR) // ======================== From 433534fb49001b665120707ef51e30dbdc0e17d8 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Mon, 27 Nov 2023 00:02:12 +0500 Subject: [PATCH 14/43] style: init g_table in 1 line --- cstack.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cstack.c b/cstack.c index f6f6673..93ae083 100644 --- a/cstack.c +++ b/cstack.c @@ -33,11 +33,7 @@ typedef struct stack_entries_table } stack_entries_table_t; #pragma pack(pop) -stack_entries_table_t g_table = -{ - 0, - NULL -}; +stack_entries_table_t g_table = { 0, NULL }; hstack_t stack_new(void) { From 5d74d99fdebcbfd644a36546838ee240ea629ed3 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Mon, 27 Nov 2023 00:09:38 +0500 Subject: [PATCH 15/43] add: c-compiler version into CMakeLists.txt --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a82ca2..dbecc2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ include(FetchContent) # build library add_library(cstack STATIC cstack.c) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 ${COMMON_FLAGS}") # build test if (WITH_TEST) From ec6a61c5f2d5de8477a10abbf5fd1f317b9929b9 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Mon, 27 Nov 2023 00:15:07 +0500 Subject: [PATCH 16/43] fix: gcc isn't compiled --- cstack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cstack.c b/cstack.c index 93ae083..d18a793 100644 --- a/cstack.c +++ b/cstack.c @@ -33,7 +33,7 @@ typedef struct stack_entries_table } stack_entries_table_t; #pragma pack(pop) -stack_entries_table_t g_table = { 0, NULL }; +stack_entries_table_t g_table = { {0}, NULL }; hstack_t stack_new(void) { From 4e22e4bb55dba671958ad5519275ef44756afecb Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:01:54 +0500 Subject: [PATCH 17/43] fix: gcc compile? --- cstack.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cstack.c b/cstack.c index d18a793..3d04133 100644 --- a/cstack.c +++ b/cstack.c @@ -1,6 +1,6 @@ #include "cstack.h" -// Реализация записи данных позаимствована отсюда +// Ðåàëèçàöèÿ Г§Г ГЇГЁГ±ГЁ äàííûõ ïîçàèìñòâîâàíà îòñþäà // https://constantsmatter.com/posts/generic-ds-c/ // *** LIBRARY SETTINGS *** @@ -29,11 +29,11 @@ typedef struct stack typedef struct stack_entries_table { int count; - stack_t* stacks[STACK_TABLE_HANDLER]; // Указывает на указатели входа в стеки + stack_t* stacks[STACK_TABLE_HANDLER]; // Óêàçûâàåò Г­Г  óêàçàòåëè âõîäà Гў Г±ГІГҐГЄГЁ } stack_entries_table_t; #pragma pack(pop) -stack_entries_table_t g_table = { {0}, NULL }; +stack_entries_table_t g_table = { .count = 0, .stacks = NULL }; hstack_t stack_new(void) { From 488b92d42c3dde00e428e3829df1aeadd97d1732 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:12:58 +0500 Subject: [PATCH 18/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 3c28767..bfb2f79 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -14,7 +14,7 @@ jobs: run: sudo apt-get install libgtest-dev && sudo apt-get install libgmock-dev && cd /usr/src/gtest && sudo cmake CMakeLists.txt && sudo make && sudo cp lib/*.a /usr/lib && sudo ln -s /usr/lib/libgtest.a /usr/local/lib/libgtest.a && sudo ln -s /usr/lib/libgtest_main.a /usr/local/lib/libgtest_main.a && sudo ln -s /usr/lib/libgmock.a /usr/local/lib/libgmock.a && sudo ln -s /usr/lib/libgmock_main.a /usr/local/lib/libgmock_main.a - uses: actions/checkout@v1 - name: configure - run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-Werror" .. + run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Debug .. - name: make run: cd build && make - name: Run Test From 4eadb0460b343095992d410f086e4ac54c56a312 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:18:19 +0500 Subject: [PATCH 19/43] fix: gcc, compile, please --- cstack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cstack.c b/cstack.c index 3d04133..2e53f71 100644 --- a/cstack.c +++ b/cstack.c @@ -28,12 +28,12 @@ typedef struct stack #pragma pack(push, 1) typedef struct stack_entries_table { - int count; stack_t* stacks[STACK_TABLE_HANDLER]; // Óêàçûâàåò Г­Г  óêàçàòåëè âõîäà Гў Г±ГІГҐГЄГЁ + int count; } stack_entries_table_t; #pragma pack(pop) -stack_entries_table_t g_table = { .count = 0, .stacks = NULL }; +stack_entries_table_t g_table = {.stacks = NULL, .count = 0 }; hstack_t stack_new(void) { From a7edeed680a05a4481dc134a406e70f04dcd6daa Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:24:41 +0500 Subject: [PATCH 20/43] fix: add -Wno-error=missing-braces (gcc bag) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dbecc2f..949a20a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ include(FetchContent) # build library add_library(cstack STATIC cstack.c) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 ${COMMON_FLAGS}") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wno-error=missing-braces ${COMMON_FLAGS}") # build test if (WITH_TEST) From a4e24efbf5b039b9b688e811a148a255faf3f948 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:28:12 +0500 Subject: [PATCH 21/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index bfb2f79..59402da 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -18,4 +18,4 @@ jobs: - name: make run: cd build && make - name: Run Test - run: /home/runner/work/github_actions_gtest_example/github_actions_gtest_example/build/test/github_actions_gtest_example.test + run: /home/runner/work/prosoft-c-stack/prosoft-c-stack/build/test/github_actions_gtest_example.test From 7c60054b685cd590ba27d0113cbcb958e23d2e29 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:33:10 +0500 Subject: [PATCH 22/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 59402da..4575686 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -18,4 +18,4 @@ jobs: - name: make run: cd build && make - name: Run Test - run: /home/runner/work/prosoft-c-stack/prosoft-c-stack/build/test/github_actions_gtest_example.test + run: /home/runner/work/prosoft-c-stack/prosoft-c-stack/build/test/cstack_test From 9a8146e57b8a4584df66b073efbc518e62562e1e Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:33:57 +0500 Subject: [PATCH 23/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 4575686..87549ab 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -18,4 +18,4 @@ jobs: - name: make run: cd build && make - name: Run Test - run: /home/runner/work/prosoft-c-stack/prosoft-c-stack/build/test/cstack_test + run: /home/runner/work/prosoft-c-stack/prosoft-c-stack/build/cstack_test From e24400b227b894ef771b822df12331aee954bc7b Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 14:34:53 +0500 Subject: [PATCH 24/43] Update cmake-single-platform.yml --- .github/workflows/cmake-single-platform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 87549ab..00f5589 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -1,4 +1,4 @@ -name: my-workflow-name +name: testing_library on: push: From 2af6ce0400ee18618f70351e54641a63eb4615e8 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 20:41:57 +0500 Subject: [PATCH 25/43] upd: comment PushBadArgs test --- test.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test.cpp b/test.cpp index aa28bd1..3d51cdb 100644 --- a/test.cpp +++ b/test.cpp @@ -133,18 +133,18 @@ struct ModifyTests : ::testing::Test hstack_t stack = -1; }; -TEST_F(ModifyTests, PushBadArgs) -{ - stack_push(stack, nullptr, 0u); - EXPECT_EQ(stack_size(stack), 0u); - - const int data_out = 1; - stack_push(stack, &data_out, 0u); - EXPECT_EQ(stack_size(stack), 0u); - - stack_push(stack, nullptr, sizeof(data_out)); - EXPECT_EQ(stack_size(stack), 0u); -} +//TEST_F(ModifyTests, PushBadArgs) +//{ +// stack_push(stack, nullptr, 0u); +// EXPECT_EQ(stack_size(stack), 0u); +// +// const int data_out = 1; +// stack_push(stack, &data_out, 0u); +// EXPECT_EQ(stack_size(stack), 0u); +// +// stack_push(stack, nullptr, sizeof(data_out)); +// EXPECT_EQ(stack_size(stack), 0u); +//} TEST_F(ModifyTests, PopBadArgs) { From 53c15d4995946f564d64f076fab54a7a94821d1e Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Mon, 27 Nov 2023 20:44:23 +0500 Subject: [PATCH 26/43] fix+upd: comment PopBadArgs test --- test.cpp | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/test.cpp b/test.cpp index 3d51cdb..a586fde 100644 --- a/test.cpp +++ b/test.cpp @@ -133,36 +133,36 @@ struct ModifyTests : ::testing::Test hstack_t stack = -1; }; -//TEST_F(ModifyTests, PushBadArgs) -//{ -// stack_push(stack, nullptr, 0u); -// EXPECT_EQ(stack_size(stack), 0u); -// -// const int data_out = 1; -// stack_push(stack, &data_out, 0u); -// EXPECT_EQ(stack_size(stack), 0u); -// -// stack_push(stack, nullptr, sizeof(data_out)); -// EXPECT_EQ(stack_size(stack), 0u); -//} - -TEST_F(ModifyTests, PopBadArgs) +TEST_F(ModifyTests, PushBadArgs) { - const size_t size = 5; - const int data_in[size] = {1}; - stack_push(stack, &data_in[0], sizeof(data_in)); - ASSERT_EQ(stack_size(stack), 1u); - - EXPECT_EQ(stack_pop(stack, nullptr, 0u), 0u); + stack_push(stack, nullptr, 0u); + EXPECT_EQ(stack_size(stack), 0u); - int data_out[size - 1] = {0}; - EXPECT_EQ(stack_pop(stack, data_out, sizeof(data_out)), 0u); - EXPECT_THAT(data_out, ::testing::Each(0)); + const int data_out = 1; + stack_push(stack, &data_out, 0u); + EXPECT_EQ(stack_size(stack), 0u); - EXPECT_EQ(stack_pop(stack, nullptr, sizeof(data_in)), 0u); - EXPECT_THAT(data_out, ::testing::Each(0)); + stack_push(stack, nullptr, sizeof(data_out)); + EXPECT_EQ(stack_size(stack), 0u); } +//TEST_F(ModifyTests, PopBadArgs) +//{ +// const size_t size = 5; +// const int data_in[size] = {1}; +// stack_push(stack, &data_in[0], sizeof(data_in)); +// ASSERT_EQ(stack_size(stack), 1u); +// +// EXPECT_EQ(stack_pop(stack, nullptr, 0u), 0u); +// +// int data_out[size - 1] = {0}; +// EXPECT_EQ(stack_pop(stack, data_out, sizeof(data_out)), 0u); +// EXPECT_THAT(data_out, ::testing::Each(0)); +// +// EXPECT_EQ(stack_pop(stack, nullptr, sizeof(data_in)), 0u); +// EXPECT_THAT(data_out, ::testing::Each(0)); +//} + TEST_F(ModifyTests, PopFromEmptyStack) { ASSERT_EQ(stack_size(stack), 0u); From dec995fbb3fbffd87a011320faf8fca22be1a52c Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Tue, 28 Nov 2023 12:33:25 +0500 Subject: [PATCH 27/43] fix: add size of element of node and check this in pop; uncomment PopBadArgs --- cstack.c | 8 +++++++- test.cpp | 32 ++++++++++++++++---------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/cstack.c b/cstack.c index 2e53f71..7581e88 100644 --- a/cstack.c +++ b/cstack.c @@ -15,6 +15,7 @@ typedef struct node { void* data; struct node* prev; + unsigned int size; } node_t; #pragma pack(pop) @@ -110,7 +111,7 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s return; } - + ptr->size = size; ptr->data = malloc(size); if (ptr->data == NULL) { free(ptr); @@ -138,10 +139,15 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int return 0; } + if (g_table.stacks[hstack]->entry->size != size){ + return 0; + } + memcpy(data_out, g_table.stacks[hstack]->entry->data, size); node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev; + free(g_table.stacks[hstack]->entry->size); free(g_table.stacks[hstack]->entry->data); free(g_table.stacks[hstack]->entry); diff --git a/test.cpp b/test.cpp index a586fde..aa28bd1 100644 --- a/test.cpp +++ b/test.cpp @@ -146,22 +146,22 @@ TEST_F(ModifyTests, PushBadArgs) EXPECT_EQ(stack_size(stack), 0u); } -//TEST_F(ModifyTests, PopBadArgs) -//{ -// const size_t size = 5; -// const int data_in[size] = {1}; -// stack_push(stack, &data_in[0], sizeof(data_in)); -// ASSERT_EQ(stack_size(stack), 1u); -// -// EXPECT_EQ(stack_pop(stack, nullptr, 0u), 0u); -// -// int data_out[size - 1] = {0}; -// EXPECT_EQ(stack_pop(stack, data_out, sizeof(data_out)), 0u); -// EXPECT_THAT(data_out, ::testing::Each(0)); -// -// EXPECT_EQ(stack_pop(stack, nullptr, sizeof(data_in)), 0u); -// EXPECT_THAT(data_out, ::testing::Each(0)); -//} +TEST_F(ModifyTests, PopBadArgs) +{ + const size_t size = 5; + const int data_in[size] = {1}; + stack_push(stack, &data_in[0], sizeof(data_in)); + ASSERT_EQ(stack_size(stack), 1u); + + EXPECT_EQ(stack_pop(stack, nullptr, 0u), 0u); + + int data_out[size - 1] = {0}; + EXPECT_EQ(stack_pop(stack, data_out, sizeof(data_out)), 0u); + EXPECT_THAT(data_out, ::testing::Each(0)); + + EXPECT_EQ(stack_pop(stack, nullptr, sizeof(data_in)), 0u); + EXPECT_THAT(data_out, ::testing::Each(0)); +} TEST_F(ModifyTests, PopFromEmptyStack) { From b0aafc79f534af900855ec23f1cd79c8325fd9c4 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Tue, 28 Nov 2023 12:42:41 +0500 Subject: [PATCH 28/43] fix+style: delete free(size) in node & put stack_valid_handler in funcs --- CMakeLists.txt | 2 +- cstack.c | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 949a20a..dbecc2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ include(FetchContent) # build library add_library(cstack STATIC cstack.c) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Wno-error=missing-braces ${COMMON_FLAGS}") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 ${COMMON_FLAGS}") # build test if (WITH_TEST) diff --git a/cstack.c b/cstack.c index 7581e88..d2c5ec8 100644 --- a/cstack.c +++ b/cstack.c @@ -52,8 +52,7 @@ hstack_t stack_new(void) void stack_free(const hstack_t hstack) { - if (g_table.stacks[hstack] == NULL || - hstack >= STACK_TABLE_HANDLER) + if (stack_valid_handler(hstack)) { return; } @@ -71,7 +70,8 @@ int stack_valid_handler(const hstack_t hstack) { if (g_table.stacks[hstack] == NULL || hstack < 0 || - hstack >= STACK_TABLE_HANDLER) { + hstack >= STACK_TABLE_HANDLER) + { return 1; } return 0; @@ -79,8 +79,7 @@ int stack_valid_handler(const hstack_t hstack) unsigned int stack_size(const hstack_t hstack) { - if (g_table.stacks[hstack] == NULL || - hstack >= STACK_TABLE_HANDLER) + if (stack_valid_handler(hstack)) { return 0; } @@ -95,8 +94,7 @@ unsigned int stack_size(const hstack_t hstack) void stack_push(const hstack_t hstack, const void* data_in, const unsigned int size) { - if (g_table.stacks[hstack] == NULL || - hstack >= STACK_TABLE_HANDLER) + if (stack_valid_handler(hstack)) { return; } @@ -127,7 +125,7 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int size) { - if (g_table.stacks[hstack] == NULL || hstack >= STACK_TABLE_HANDLER) { + if (stack_valid_handler(hstack)) { return 0; } @@ -147,7 +145,6 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev; - free(g_table.stacks[hstack]->entry->size); free(g_table.stacks[hstack]->entry->data); free(g_table.stacks[hstack]->entry); From 6187b685b8d432db2d72bc0a271c7c680fe30991 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Tue, 28 Nov 2023 12:45:15 +0500 Subject: [PATCH 29/43] upd: add in cmake -Wno-error=missing-braces --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dbecc2f..1d5a777 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ if (MSVC) target_compile_definitions(cstack_test PRIVATE _DISABLE_VECTOR_ANNOTATION) endif() else() - target_compile_options(cstack PRIVATE -Wall -Wextra -Wformat -Wformat-security -Werror) + target_compile_options(cstack PRIVATE -Wall -Wextra -Wformat -Wformat-security -Werror -Wno-error=missing-braces) set(SANITIZERS_FLAGS -fsanitize=undefined -fsanitize=address) if (WITH_TEST) target_compile_options(cstack_test PRIVATE ${SANITIZERS_FLAGS}) From f1150bbf10e14f3a4783974de244d6dd15381854 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Tue, 28 Nov 2023 13:37:56 +0500 Subject: [PATCH 30/43] fix: free nodes in stack by stack_free (leak memory) --- cstack.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cstack.c b/cstack.c index d2c5ec8..ef435b8 100644 --- a/cstack.c +++ b/cstack.c @@ -58,9 +58,21 @@ void stack_free(const hstack_t hstack) } stack_t* ptrStack = g_table.stacks[hstack]; + if (ptrStack->entry != NULL) { + for (int i = 0, s = stack_size(hstack); i < s; ++i) + { + node_t* _nextTopNode = ptrStack->entry->prev; + + free(ptrStack->entry->data); + free(ptrStack->entry); + + ptrStack->entry = _nextTopNode; + } + free(ptrStack->entry); } + free(ptrStack); g_table.stacks[hstack] = (stack_t*)NULL; --g_table.count; From ef810cc11efc5f1334b9f3c50d9704dee06853e2 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Thu, 30 Nov 2023 01:00:40 +0500 Subject: [PATCH 31/43] fix: stack_pop - change checking size of buffer from "strict equal" to "bigger or equal" --- cstack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cstack.c b/cstack.c index ef435b8..78d7029 100644 --- a/cstack.c +++ b/cstack.c @@ -149,7 +149,7 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int return 0; } - if (g_table.stacks[hstack]->entry->size != size){ + if (g_table.stacks[hstack]->entry->size > size){ return 0; } From 62553194c6285120783f1464ac7b0f2f5ab9035e Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Thu, 30 Nov 2023 15:19:37 +0500 Subject: [PATCH 32/43] style: add _ to internal var in func --- cstack.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/cstack.c b/cstack.c index 78d7029..fb31b2d 100644 --- a/cstack.c +++ b/cstack.c @@ -57,23 +57,23 @@ void stack_free(const hstack_t hstack) return; } - stack_t* ptrStack = g_table.stacks[hstack]; + stack_t* _ptrStack = g_table.stacks[hstack]; - if (ptrStack->entry != NULL) { - for (int i = 0, s = stack_size(hstack); i < s; ++i) + if (_ptrStack->entry != NULL) { + for (int _i = 0, _s = stack_size(hstack); _i < _s; ++_i) { - node_t* _nextTopNode = ptrStack->entry->prev; + node_t* _nextTopNode = _ptrStack->entry->prev; - free(ptrStack->entry->data); - free(ptrStack->entry); + free(_ptrStack->entry->data); + free(_ptrStack->entry); - ptrStack->entry = _nextTopNode; + _ptrStack->entry = _nextTopNode; } - free(ptrStack->entry); + free(_ptrStack->entry); } - free(ptrStack); + free(_ptrStack); g_table.stacks[hstack] = (stack_t*)NULL; --g_table.count; } @@ -115,24 +115,24 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s return; } - node_t* ptr = (node_t*)malloc(sizeof(node_t)); + node_t* _ptr = (node_t*)malloc(sizeof(node_t)); - if (ptr == NULL) { + if (_ptr == NULL) { return; } - ptr->size = size; - ptr->data = malloc(size); - if (ptr->data == NULL) { - free(ptr); + _ptr->size = size; + _ptr->data = malloc(size); + if (_ptr->data == NULL) { + free(_ptr); return; } - memcpy(ptr->data, data_in, size); + memcpy(_ptr->data, data_in, size); - ptr->prev = g_table.stacks[hstack]->entry; + _ptr->prev = g_table.stacks[hstack]->entry; - g_table.stacks[hstack]->entry = ptr; + g_table.stacks[hstack]->entry = _ptr; } unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int size) From 235d2afc903d62b7d35583bd5465211b5262a273 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Thu, 30 Nov 2023 22:19:18 +0500 Subject: [PATCH 33/43] upd: delete pack wrap from structs --- cstack.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cstack.c b/cstack.c index fb31b2d..06904b5 100644 --- a/cstack.c +++ b/cstack.c @@ -10,29 +10,23 @@ // ======================== -#pragma pack(push, 1) typedef struct node { void* data; struct node* prev; unsigned int size; } node_t; -#pragma pack(pop) -#pragma pack(push, 1) typedef struct stack { struct node* entry; } stack_t; -#pragma pack(pop) -#pragma pack(push, 1) typedef struct stack_entries_table { stack_t* stacks[STACK_TABLE_HANDLER]; // Óêàçûâàåò Г­Г  óêàçàòåëè âõîäà Гў Г±ГІГҐГЄГЁ int count; } stack_entries_table_t; -#pragma pack(pop) stack_entries_table_t g_table = {.stacks = NULL, .count = 0 }; From bc0f2032fe0b60080421961b30340efe9e8135cb Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Fri, 1 Dec 2023 12:13:36 +0500 Subject: [PATCH 34/43] style: add uniform placement of brackets and add some spaces --- cstack.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/cstack.c b/cstack.c index 06904b5..e2e5fa3 100644 --- a/cstack.c +++ b/cstack.c @@ -53,7 +53,8 @@ void stack_free(const hstack_t hstack) stack_t* _ptrStack = g_table.stacks[hstack]; - if (_ptrStack->entry != NULL) { + if (_ptrStack->entry != NULL) + { for (int _i = 0, _s = stack_size(hstack); _i < _s; ++_i) { node_t* _nextTopNode = _ptrStack->entry->prev; @@ -92,7 +93,8 @@ unsigned int stack_size(const hstack_t hstack) int _i = 0; - for (node_t* _node = g_table.stacks[hstack]->entry; !(_node == NULL); _node = _node->prev) { + for (node_t* _node = g_table.stacks[hstack]->entry; !(_node == NULL); _node = _node->prev) + { ++_i; } return _i; @@ -105,19 +107,23 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s return; } - if (data_in == NULL || size <= 0) { + if (data_in == NULL || size <= 0) + { return; } node_t* _ptr = (node_t*)malloc(sizeof(node_t)); - if (_ptr == NULL) { + if (_ptr == NULL) + { return; } _ptr->size = size; _ptr->data = malloc(size); - if (_ptr->data == NULL) { + + if (_ptr->data == NULL) + { free(_ptr); return; } @@ -131,19 +137,23 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int size) { - if (stack_valid_handler(hstack)) { + if (stack_valid_handler(hstack)) + { return 0; } - if (data_out == NULL || size <= 0) { + if (data_out == NULL || size <= 0) + { return 0; } - if (g_table.stacks[hstack]->entry == NULL) { + if (g_table.stacks[hstack]->entry == NULL) + { return 0; } - if (g_table.stacks[hstack]->entry->size > size){ + if (g_table.stacks[hstack]->entry->size > size) + { return 0; } From cfec9eec3457e1b5e25eabb2f2ca64bf4694e680 Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Fri, 1 Dec 2023 14:36:07 +0500 Subject: [PATCH 35/43] refactor+style: remove pointer creation in for; change the validation from if to if-else; remove some spaces --- cstack.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/cstack.c b/cstack.c index e2e5fa3..19c59ab 100644 --- a/cstack.c +++ b/cstack.c @@ -55,9 +55,10 @@ void stack_free(const hstack_t hstack) if (_ptrStack->entry != NULL) { + node_t* _nextTopNode = (node_t*)NULL; for (int _i = 0, _s = stack_size(hstack); _i < _s; ++_i) { - node_t* _nextTopNode = _ptrStack->entry->prev; + _nextTopNode = _ptrStack->entry->prev; free(_ptrStack->entry->data); free(_ptrStack->entry); @@ -93,7 +94,7 @@ unsigned int stack_size(const hstack_t hstack) int _i = 0; - for (node_t* _node = g_table.stacks[hstack]->entry; !(_node == NULL); _node = _node->prev) + for (node_t* _node = g_table.stacks[hstack]->entry, _null_ptr = (node_t*)NULL; _node != _null_ptr; _node = _node->prev) { ++_i; } @@ -106,8 +107,7 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s { return; } - - if (data_in == NULL || size <= 0) + else if (data_in == NULL || size <= 0) { return; } @@ -129,9 +129,7 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s } memcpy(_ptr->data, data_in, size); - _ptr->prev = g_table.stacks[hstack]->entry; - g_table.stacks[hstack]->entry = _ptr; } @@ -141,18 +139,15 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int { return 0; } - - if (data_out == NULL || size <= 0) + else if (data_out == NULL || size <= 0) { return 0; } - - if (g_table.stacks[hstack]->entry == NULL) + else if (g_table.stacks[hstack]->entry == NULL) { return 0; } - - if (g_table.stacks[hstack]->entry->size > size) + else if (g_table.stacks[hstack]->entry->size > size) { return 0; } From 5e5c8b27b6034368363923ed2752d5c3ebdd64ff Mon Sep 17 00:00:00 2001 From: Konstantin Makarov <78808066+Mako-D@users.noreply.github.com> Date: Fri, 1 Dec 2023 14:38:18 +0500 Subject: [PATCH 36/43] fix (stack_size): doesn't create NULL in for --- cstack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cstack.c b/cstack.c index 19c59ab..39a4b86 100644 --- a/cstack.c +++ b/cstack.c @@ -94,7 +94,7 @@ unsigned int stack_size(const hstack_t hstack) int _i = 0; - for (node_t* _node = g_table.stacks[hstack]->entry, _null_ptr = (node_t*)NULL; _node != _null_ptr; _node = _node->prev) + for (node_t* _node = g_table.stacks[hstack]->entry; _node != (node_t*)NULL; _node = _node->prev) { ++_i; } From 16e9b6f310534f0ad640ffb2fa96614350f5c787 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sat, 2 Dec 2023 15:47:29 +0500 Subject: [PATCH 37/43] style: remove 'if-else' in validity check to one 'if' --- cstack.c | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/cstack.c b/cstack.c index 39a4b86..7a1b956 100644 --- a/cstack.c +++ b/cstack.c @@ -76,9 +76,11 @@ void stack_free(const hstack_t hstack) int stack_valid_handler(const hstack_t hstack) { - if (g_table.stacks[hstack] == NULL || - hstack < 0 || - hstack >= STACK_TABLE_HANDLER) + if ((g_table.stacks[hstack] == NULL) || + + (hstack < 0) || + + (hstack >= STACK_TABLE_HANDLER)) { return 1; } @@ -103,11 +105,9 @@ unsigned int stack_size(const hstack_t hstack) void stack_push(const hstack_t hstack, const void* data_in, const unsigned int size) { - if (stack_valid_handler(hstack)) - { - return; - } - else if (data_in == NULL || size <= 0) + if ((stack_valid_handler(hstack)) || + + (data_in == NULL || size <= 0)) { return; } @@ -135,19 +135,13 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int size) { - if (stack_valid_handler(hstack)) - { - return 0; - } - else if (data_out == NULL || size <= 0) - { - return 0; - } - else if (g_table.stacks[hstack]->entry == NULL) - { - return 0; - } - else if (g_table.stacks[hstack]->entry->size > size) + if ((stack_valid_handler(hstack)) || + + (data_out == NULL || size <= 0) || + + (g_table.stacks[hstack]->entry == NULL) || + + (g_table.stacks[hstack]->entry->size > size)) { return 0; } From 5fed38ca315e909da6106b064d5f8be994b300ff Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 3 Dec 2023 18:20:48 +0500 Subject: [PATCH 38/43] solve: review --- CMakeLists.txt | 2 -- cstack.c | 35 +++++++++++++++++++++-------------- cstack.h | 4 ---- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d5a777..04761a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,8 +9,6 @@ include(FetchContent) # build library add_library(cstack STATIC cstack.c) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 ${COMMON_FLAGS}") - # build test if (WITH_TEST) enable_testing() diff --git a/cstack.c b/cstack.c index 7a1b956..dd45d77 100644 --- a/cstack.c +++ b/cstack.c @@ -1,7 +1,8 @@ #include "cstack.h" +#include +#include +#include -// Ðåàëèçàöèÿ Г§Г ГЇГЁГ±ГЁ äàííûõ ïîçàèìñòâîâàíà îòñþäà -// https://constantsmatter.com/posts/generic-ds-c/ // *** LIBRARY SETTINGS *** @@ -24,7 +25,7 @@ typedef struct stack typedef struct stack_entries_table { - stack_t* stacks[STACK_TABLE_HANDLER]; // Óêàçûâàåò Г­Г  óêàçàòåëè âõîäà Гў Г±ГІГҐГЄГЁ + stack_t* stacks[STACK_TABLE_HANDLER]; int count; } stack_entries_table_t; @@ -32,15 +33,21 @@ stack_entries_table_t g_table = {.stacks = NULL, .count = 0 }; hstack_t stack_new(void) { + if(g_table.count == STACK_TABLE_HANDLER - 1) + { + return -1; + } + stack_t* _stack = (stack_t*)malloc(sizeof(stack_t)); - if (_stack == NULL) { + if (_stack == NULL) + { return -1; } - _stack->entry = NULL; + _stack->entry = NULL; g_table.stacks[g_table.count] = _stack; - + return g_table.count++; } @@ -76,11 +83,11 @@ void stack_free(const hstack_t hstack) int stack_valid_handler(const hstack_t hstack) { - if ((g_table.stacks[hstack] == NULL) || - - (hstack < 0) || + if ((hstack < 0) || - (hstack >= STACK_TABLE_HANDLER)) + (hstack >= STACK_TABLE_HANDLER) || + + (g_table.stacks[hstack] == NULL)) { return 1; } @@ -107,7 +114,7 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s { if ((stack_valid_handler(hstack)) || - (data_in == NULL || size <= 0)) + (data_in == NULL || size == 0)) { return; } @@ -128,7 +135,7 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s return; } - memcpy(_ptr->data, data_in, size); + memcpy_s(_ptr->data, sizeof _ptr->data, data_in, size); _ptr->prev = g_table.stacks[hstack]->entry; g_table.stacks[hstack]->entry = _ptr; } @@ -137,7 +144,7 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int { if ((stack_valid_handler(hstack)) || - (data_out == NULL || size <= 0) || + (data_out == NULL || size == 0) || (g_table.stacks[hstack]->entry == NULL) || @@ -146,7 +153,7 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int return 0; } - memcpy(data_out, g_table.stacks[hstack]->entry->data, size); + memcpy_s(data_out, size, g_table.stacks[hstack]->entry->data, sizeof g_table.stacks[hstack]->entry->data); node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev; diff --git a/cstack.h b/cstack.h index 5fe6a5f..09cabb4 100644 --- a/cstack.h +++ b/cstack.h @@ -1,10 +1,6 @@ #ifndef CSTACK_H #define CSTACK_H -#include -#include -#include - typedef int hstack_t; hstack_t stack_new(void); From b86982c0035287b7b99b854934e8c282be5884ae Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 3 Dec 2023 18:23:08 +0500 Subject: [PATCH 39/43] fix: change gcc standard to c11 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 04761a3..04a80c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,7 @@ if (MSVC) target_compile_definitions(cstack_test PRIVATE _DISABLE_VECTOR_ANNOTATION) endif() else() - target_compile_options(cstack PRIVATE -Wall -Wextra -Wformat -Wformat-security -Werror -Wno-error=missing-braces) + target_compile_options(cstack PRIVATE -std=c11 -Wall -Wextra -Wformat -Wformat-security -Werror -Wno-error=missing-braces) set(SANITIZERS_FLAGS -fsanitize=undefined -fsanitize=address) if (WITH_TEST) target_compile_options(cstack_test PRIVATE ${SANITIZERS_FLAGS}) From 8676232cbd95b0d38aa0e479b721ac4c65faad87 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 3 Dec 2023 22:06:28 +0500 Subject: [PATCH 40/43] style: correct test's names and correct stack_free(0) to stack_free(stack) --- CMakeLists.txt | 31 ++++++++++++++----------------- cstack.c | 10 ++++++++-- test.cpp | 28 ++++++++++++++-------------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 04a80c6..c3695e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,20 @@ cmake_minimum_required(VERSION 3.20) project(cstack) + + enable_testing() option(WITH_TEST "Build test (GTest library required)" ON) include(FetchContent) +set(CMAKE_C_STANDARD_REQUIRED ON) + # build library add_library(cstack STATIC cstack.c) +target_compile_features(cstack PUBLIC c_std_11) + # build test if (WITH_TEST) enable_testing() @@ -30,21 +36,12 @@ if (WITH_TEST) endif() # compiler-specific project settings -if (MSVC) - set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") - set(MSVC_FLAGS /Wall /WX) - target_compile_options(cstack PRIVATE ${MSVC_FLAGS}) - target_link_options(cstack PRIVATE ${MSVC_FLAGS}) - if (WITH_TEST) - target_compile_options(cstack_test PRIVATE /fsanitize=address) - target_compile_definitions(cstack_test PRIVATE _DISABLE_VECTOR_ANNOTATION) - endif() -else() - target_compile_options(cstack PRIVATE -std=c11 -Wall -Wextra -Wformat -Wformat-security -Werror -Wno-error=missing-braces) - set(SANITIZERS_FLAGS -fsanitize=undefined -fsanitize=address) - if (WITH_TEST) - target_compile_options(cstack_test PRIVATE ${SANITIZERS_FLAGS}) - target_link_options(cstack_test PRIVATE ${SANITIZERS_FLAGS}) - endif() -endif() +target_compile_options(cstack PRIVATE -Wall -Wextra -Wformat -Wformat-security -Werror -Wno-error=missing-braces -Wno-error=implicit-function-declaration) + +set(SANITIZERS_FLAGS -fsanitize=undefined -fsanitize=address) + +if (WITH_TEST) + target_compile_options(cstack_test PRIVATE ${SANITIZERS_FLAGS}) + target_link_options(cstack_test PRIVATE ${SANITIZERS_FLAGS}) +endif() \ No newline at end of file diff --git a/cstack.c b/cstack.c index dd45d77..337eb36 100644 --- a/cstack.c +++ b/cstack.c @@ -11,23 +11,29 @@ // ======================== +#pragma pack(1) typedef struct node { void* data; struct node* prev; unsigned int size; } node_t; +#pragma pack() +#pragma pack(1) typedef struct stack { struct node* entry; } stack_t; +#pragma pack() +#pragma pack(1) typedef struct stack_entries_table { stack_t* stacks[STACK_TABLE_HANDLER]; int count; } stack_entries_table_t; +#pragma pack() stack_entries_table_t g_table = {.stacks = NULL, .count = 0 }; @@ -135,7 +141,7 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s return; } - memcpy_s(_ptr->data, sizeof _ptr->data, data_in, size); + memcpy_s(_ptr->data, _ptr->size, data_in, size); _ptr->prev = g_table.stacks[hstack]->entry; g_table.stacks[hstack]->entry = _ptr; } @@ -153,7 +159,7 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int return 0; } - memcpy_s(data_out, size, g_table.stacks[hstack]->entry->data, sizeof g_table.stacks[hstack]->entry->data); + memcpy_s(data_out, size, g_table.stacks[hstack]->entry->data, g_table.stacks[hstack]->entry->size); node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev; diff --git a/test.cpp b/test.cpp index aa28bd1..15b497c 100644 --- a/test.cpp +++ b/test.cpp @@ -18,17 +18,17 @@ TEST(AllAPITest, BadStackHandler) } -TEST(AllocationTests, Kostya1) { +TEST(StandardUsage, OneStack_OneElem_OneType) { const hstack_t stack = stack_new(); const int data_in = 1; stack_push(stack, &data_in, sizeof(data_in)); int data_out; EXPECT_EQ(stack_pop(stack, &data_out, sizeof(data_out)), sizeof(data_out)); EXPECT_EQ(data_out, 1); - stack_free(0); + stack_free(stack); } -TEST(AllocationTests, Kostya2) { +TEST(StandardUsage, OneStack_TwoElem_OneType) { const hstack_t stack = stack_new(); const int data_in1 = 1; const int data_in2 = 2; @@ -39,10 +39,10 @@ TEST(AllocationTests, Kostya2) { EXPECT_EQ(data_out, 2); EXPECT_EQ(stack_pop(stack, &data_out, sizeof(data_out)), sizeof(data_out)); EXPECT_EQ(data_out, 1); - stack_free(0); + stack_free(stack); } -TEST(AllocationTests, Kostya3) { +TEST(StandardUsage, OneStack_TwoElem_TwoType) { const hstack_t stack = stack_new(); const int data_in1 = 1; const double data_in2 = 2.2; @@ -55,10 +55,10 @@ TEST(AllocationTests, Kostya3) { EXPECT_EQ(data_out2, 2.2); EXPECT_EQ(stack_pop(stack, &data_out1, sizeof(data_out1)), sizeof(data_out1)); EXPECT_EQ(data_out1, 1); - stack_free(0); + stack_free(stack); } -TEST(AllocationTests, StressTest) { +TEST(StandardUsage, StressTest) { const size_t count = 10; hstack_t stacks[count] = { -1 }; for (size_t i = 0; i < count; ++i) @@ -104,7 +104,7 @@ TEST(AllocationTests, SingleAllocation) TEST(AllocationTests, SeveralAllocations) { const size_t count = 10; - hstack_t stacks[count] = {-1}; + hstack_t stacks[count] = { -1 }; for (size_t i = 0; i < count; ++i) { stacks[i] = stack_new(); @@ -149,13 +149,13 @@ TEST_F(ModifyTests, PushBadArgs) TEST_F(ModifyTests, PopBadArgs) { const size_t size = 5; - const int data_in[size] = {1}; + const int data_in[size] = { 1 }; stack_push(stack, &data_in[0], sizeof(data_in)); ASSERT_EQ(stack_size(stack), 1u); EXPECT_EQ(stack_pop(stack, nullptr, 0u), 0u); - int data_out[size - 1] = {0}; + int data_out[size - 1] = { 0 }; EXPECT_EQ(stack_pop(stack, data_out, sizeof(data_out)), 0u); EXPECT_THAT(data_out, ::testing::Each(0)); @@ -172,8 +172,8 @@ TEST_F(ModifyTests, PopFromEmptyStack) TEST_F(ModifyTests, SinglePushPop) { - const int data_in[3] = {0, 1, 2}; - int data_out[3] = {2, 1, 0}; + const int data_in[3] = { 0, 1, 2 }; + int data_out[3] = { 2, 1, 0 }; stack_push(stack, data_in, sizeof(data_in)); EXPECT_EQ(stack_size(stack), 1u); EXPECT_EQ(stack_pop(stack, data_out, sizeof(data_out)), sizeof(data_out)); @@ -184,8 +184,8 @@ TEST_F(ModifyTests, SinglePushPop) TEST_F(ModifyTests, SeveralPushPop) { const size_t size = 3; - const int data_in[size] = {0, 1, 2}; - int data_out[size] = {0, 1, 2}; + const int data_in[size] = { 0, 1, 2 }; + int data_out[size] = { 0, 1, 2 }; for (size_t i = 0; i < size; ++i) { stack_push(stack, &data_in[i], sizeof(data_in[i])); From 5761143984f57f17571adf3190a56f6dd42773a5 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 3 Dec 2023 22:18:26 +0500 Subject: [PATCH 41/43] fix --- cstack.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cstack.c b/cstack.c index 337eb36..a9185bd 100644 --- a/cstack.c +++ b/cstack.c @@ -1,4 +1,7 @@ #include "cstack.h" + +#define __STDC_WANT_LIB_EXT1__ 1 + #include #include #include @@ -158,7 +161,7 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int { return 0; } - + memcpy_s(data_out, size, g_table.stacks[hstack]->entry->data, g_table.stacks[hstack]->entry->size); node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev; From 9808d0524eb2c264a7ee6eefeaec19fdd026b6c3 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 3 Dec 2023 22:20:17 +0500 Subject: [PATCH 42/43] fix --- cstack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cstack.c b/cstack.c index a9185bd..f23f5e0 100644 --- a/cstack.c +++ b/cstack.c @@ -1,6 +1,6 @@ #include "cstack.h" -#define __STDC_WANT_LIB_EXT1__ 1 +#define __STDC_LIB_EXT1__ 1 #include #include From 7124f478f0434c71d79083d3d45d11ae5ab46373 Mon Sep 17 00:00:00 2001 From: Makarov Konstantin Date: Sun, 3 Dec 2023 22:29:29 +0500 Subject: [PATCH 43/43] fix:: add macros "if" for memcpy and memcpy_s --- cstack.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/cstack.c b/cstack.c index f23f5e0..cd9d7b9 100644 --- a/cstack.c +++ b/cstack.c @@ -1,7 +1,5 @@ #include "cstack.h" -#define __STDC_LIB_EXT1__ 1 - #include #include #include @@ -144,7 +142,12 @@ void stack_push(const hstack_t hstack, const void* data_in, const unsigned int s return; } - memcpy_s(_ptr->data, _ptr->size, data_in, size); + #ifdef _MSC_VER + memcpy_s(_ptr->data, _ptr->size, data_in, size); + #else + memcpy(_ptr->data, data_in, size); + #endif + _ptr->prev = g_table.stacks[hstack]->entry; g_table.stacks[hstack]->entry = _ptr; } @@ -161,8 +164,12 @@ unsigned int stack_pop(const hstack_t hstack, void* data_out, const unsigned int { return 0; } - - memcpy_s(data_out, size, g_table.stacks[hstack]->entry->data, g_table.stacks[hstack]->entry->size); + + #ifdef _MSC_VER + memcpy_s(data_out, size, g_table.stacks[hstack]->entry->data, g_table.stacks[hstack]->entry->size); + #else + memcpy(data_out, g_table.stacks[hstack]->entry->data, size); + #endif node_t* _nextTopNode = g_table.stacks[hstack]->entry->prev;