From f4eeabb8eb7e706747191f66ecc7373cc698e759 Mon Sep 17 00:00:00 2001 From: SPetrenko17 Date: Thu, 10 Oct 2019 16:20:09 +0300 Subject: [PATCH 1/8] Work had been done --- .travis.yml | 31 ++++++++++++++ Resource.h | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.c | 18 +++++++++ 3 files changed, 162 insertions(+) create mode 100644 .travis.yml create mode 100644 Resource.h create mode 100644 main.c diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c63b3e7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,31 @@ +language: c + +before_install: + - sudo apt update + - sudo apt install cmake + +before_script: + - pip3 install --user cpplint + + +script: + - cppcheck main.c + - cppcheck Resource.h + - cpplint main.c + - cpplint Resource.h + - g++ -g -Wall -Wextra main.c -o main + - mkdir build + - cd build + - cmake .. + - cmake --build . + +after_script: + - make clean + +addons: + apt: + packages: + - "python3" + - "python3-pip" + - "cppcheck" + update: true diff --git a/Resource.h b/Resource.h new file mode 100644 index 0000000..195ccf4 --- /dev/null +++ b/Resource.h @@ -0,0 +1,113 @@ +/* + * "Copyright 2019 Sergei Petrenko" + */ +#ifndef RESOURCE_H_ +#define RESOURCE_H_ + +#include +#include +#include +#include + +typedef struct Resource Resource; + +struct Resource { + char* name; + char* callnumber; + char* measure; + char* category; + int count; +}; +void resource_init(Resource* resource, char* name, char* callnumber, + char* measure, char* category, int count) { + resource->name = name; + resource->callnumber = callnumber; + resource->measure = measure; + resource->category = category; + resource->count = count; +} + +int compare(const void *resource1, const void *resource2) { + Resource *res1 = (Resource *)resource1; // NOLINT + Resource *res2 = (Resource *)resource2; // NOLINT + int result_comp = strcmp(res1->category, res2->category); + if (result_comp == 0) { + result_comp = strcmp(res2->measure, res1->measure); + if (result_comp == 0) { + return res1->count > res2->count; + } else { + return result_comp; + } + } else { + return result_comp; + } +} + +void my_swap(void* v1, void* v2, int size) { + char *buffer[size]; + memcpy(buffer, v1, size); + memcpy(v1, v2, size); + memcpy(v2, buffer, size); +} + +void my_quicksort(void* v, size_t size, int left, int right, + int (*comp)(const void*, const void*)) { + void *vt, *v3; + size_t i, last, mid = (left + right) / 2; + if (left >= right) + return; + void* vl = (char*)(v + (left * size)); // NOLINT + void* vr = (char*)(v + (mid * size)); // NOLINT + my_swap(vl, vr, size); + last = left; + for (i = left + 1; i <= right; i++) { + vt = (char*)(v + (i * size)); // NOLINT + if ((*comp)(vl, vt) > 0) { + ++last; + v3 = (char*)(v + (last * size)); // NOLINT + my_swap(vt, v3, size); + } + } + v3 = (char*)(v + (last * size)); // NOLINT + my_swap(vl, v3, size); + my_quicksort(v, size, left, last - 1, comp); + my_quicksort(v, size, last + 1, right, comp); +} + +void print_grouped_resources(Resource *resources, int size) { //NOLINT + my_quicksort(resources, sizeof(Resource), 0, size-1, compare); // NOLINT + for (size_t i = 0; i < size; ++i) { + printf("%s %s %s %d %s %s", resources[i].category, resources[i].name, + resources[i].callnumber, resources[i].count, + resources[i].measure, "\n"); + } +} +int get_measure_statistics(Resource* resources, size_t size, + char* measure, char* category) { + int result = 0; + for (size_t i = 0; i < size; i++) { + if ( strcmp(resources[i].measure, measure) == 0 + && strcmp(resources[i].category, category) == 0 ) { + result+=resources[i].count; + } + } + return result; +} +void add_some_resources(Resource* resources) { + resource_init(&resources[0] , "Coal", "CE01", "kg" + , "Energy", 600); + resource_init(&resources[1] , "Oil", "O11S", + "l", "Energy", 100); + resource_init(&resources[2] , "Silver", "Slv01", + "kg", "Metal", 400); + resource_init(&resources[3] , "Аcid", "AC02E", + "l", "Liquid", 300); + resource_init(&resources[4] , "Gold", "Gld01", + "kg", "Metal", 500); + resource_init(&resources[5] , "Antifreeze", "AF01W", + "l", "Liquid", 200); + resource_init(&resources[6], "Bla", "Bla", + "Bla", "Bla", 100000); +} + +#endif // RESOURCE_H_" \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..62a00d4 --- /dev/null +++ b/main.c @@ -0,0 +1,18 @@ +/* + * "Copyright 2019 Sergei Petrenko" + */ +#include +#include "Resource.h" +int main() { + size_t size = 7; + Resource *resources = (Resource*)malloc( // NOLINT + sizeof(struct Resource)*size); // NOLINT + add_some_resources(resources); + print_grouped_resources(&*resources, size); + printf("%d %s", get_measure_statistics(resources, size, "l", + "Liquid") , "l of Liquid\n"); + printf("%d %s", get_measure_statistics(resources, size, + "kg", "Metal"), "kg of metal]\n"); + free(resources); + return 0; +} \ No newline at end of file From af9ffcd13cbd80d40345e4403264bc8bc5c148c7 Mon Sep 17 00:00:00 2001 From: SPetrenko17 Date: Thu, 10 Oct 2019 16:24:24 +0300 Subject: [PATCH 2/8] Small changes in main --- main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index 62a00d4..48aeee8 100644 --- a/main.c +++ b/main.c @@ -10,9 +10,9 @@ int main() { add_some_resources(resources); print_grouped_resources(&*resources, size); printf("%d %s", get_measure_statistics(resources, size, "l", - "Liquid") , "l of Liquid\n"); + "Liquid") , "l of liquid\n"); printf("%d %s", get_measure_statistics(resources, size, "kg", "Metal"), "kg of metal]\n"); free(resources); return 0; -} \ No newline at end of file +} From 6f05478e8148dbc0379e36ae1dd629297f8307c0 Mon Sep 17 00:00:00 2001 From: SPetrenko17 Date: Thu, 10 Oct 2019 16:28:25 +0300 Subject: [PATCH 3/8] Small changes in main --- Resource.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resource.h b/Resource.h index 195ccf4..3df268c 100644 --- a/Resource.h +++ b/Resource.h @@ -110,4 +110,5 @@ void add_some_resources(Resource* resources) { "Bla", "Bla", 100000); } -#endif // RESOURCE_H_" \ No newline at end of file +#endif // RESOURCE_H_" + From 370af042346e7bf93f90596845c0fe291bf47641 Mon Sep 17 00:00:00 2001 From: SPetrenko17 Date: Thu, 10 Oct 2019 16:35:24 +0300 Subject: [PATCH 4/8] cmake file was added --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..607148d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.12) +project(HomeworkC C) + +set(CMAKE_C_STANDARD 99) + +add_executable(first_homerok_c main.c) \ No newline at end of file From 1d746b7790eebd71045a366ef428d1cad3271bc1 Mon Sep 17 00:00:00 2001 From: SPetrenko17 Date: Thu, 10 Oct 2019 23:46:18 +0300 Subject: [PATCH 5/8] add valgrind to travis.yml --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index c63b3e7..ecd43de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ language: c before_install: - sudo apt update - sudo apt install cmake + - sudo apt-get install valgrind before_script: - pip3 install --user cpplint @@ -17,6 +18,7 @@ script: - mkdir build - cd build - cmake .. + - valgrind --tool=memcheck --leak-check=full --leak-resolution=med --track-origins=yes ./tests.out - cmake --build . after_script: From 0396a9b0afcf37f8f2eeb69efd573065496c3c7c Mon Sep 17 00:00:00 2001 From: SPetrenko17 Date: Thu, 10 Oct 2019 23:50:30 +0300 Subject: [PATCH 6/8] little fixes in travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ecd43de..089fe48 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ script: - mkdir build - cd build - cmake .. - - valgrind --tool=memcheck --leak-check=full --leak-resolution=med --track-origins=yes ./tests.out + - valgrind --tool=memcheck --leak-check=full - cmake --build . after_script: From 8fb82a6fb8eda90e8ab9baa652b1cbe9049a91d5 Mon Sep 17 00:00:00 2001 From: SPetrenko17 Date: Thu, 10 Oct 2019 23:54:53 +0300 Subject: [PATCH 7/8] test valgrind in script --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 089fe48..ec900f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ script: - mkdir build - cd build - cmake .. - - valgrind --tool=memcheck --leak-check=full + - valgrind - cmake --build . after_script: From 63f5f85bfb852eb453b793aa147ae74a42f5129a Mon Sep 17 00:00:00 2001 From: SPetrenko17 Date: Thu, 10 Oct 2019 23:59:30 +0300 Subject: [PATCH 8/8] test without valgrind --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ec900f9..a4503b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,6 @@ script: - mkdir build - cd build - cmake .. - - valgrind - cmake --build . after_script: