From 4efb80654e567a1b3a88a59019c89c8160523f64 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Wed, 10 Mar 2021 22:25:16 +0300 Subject: [PATCH 01/56] fill repo correctly --- .DS_Store | Bin 0 -> 6148 bytes project | 1 + 2 files changed, 1 insertion(+) create mode 100644 .DS_Store create mode 160000 project diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fb83f1068fa378af6a10f14e2ebf05d64696ffa7 GIT binary patch literal 6148 zcmeHKOHRWu5S@WaL}Jq=OJAWkFjY7~FM!%25NebNm3^+mH8=|50BqQ?;62ZP5}E}I zgb^Js&>^v#9M?`dazg>vTMWjL_DwPT0^rY#?oo7HTIj&?Q``z_owP`03{lzKn z{X{yslU8nJu>YnTZ1;;t)7JHR*RJ7Fy*$4@J-j`hALeP=?Kix-8?rT8ZLn~t!9Xw& z3hP4JDXCS8b%)s1OvgqCj&em5*jf(_J-x?KvzltAfM4iptF`>OmfVQy&)_R zwNRjis+SmQ;h0bEmmPaU3m5g`Lw)6s;zi5q$e)V4Xf}*K7zhT&3>@2V&inrYzszKj zKMsjeFc1vhQ~sy& Date: Wed, 10 Mar 2021 22:31:02 +0300 Subject: [PATCH 02/56] ver.2 --- project | 1 - project/CMakeLists.txt | 10 ++ project/Makefile | 228 +++++++++++++++++++++++++++++++++++++++++ project/db.txt | 4 + project/find.txt | 1 + project/include/cars.h | 42 ++++++++ project/main | Bin 0 -> 51896 bytes project/project.cbp | 82 +++++++++++++++ project/src/cars.c | 150 +++++++++++++++++++++++++++ project/src/main.c | 63 ++++++++++++ 10 files changed, 580 insertions(+), 1 deletion(-) delete mode 160000 project create mode 100644 project/CMakeLists.txt create mode 100644 project/Makefile create mode 100644 project/db.txt create mode 100644 project/find.txt create mode 100644 project/include/cars.h create mode 100755 project/main create mode 100644 project/project.cbp create mode 100644 project/src/cars.c create mode 100644 project/src/main.c diff --git a/project b/project deleted file mode 160000 index 2738329..0000000 --- a/project +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 27383293768f0304c7c35496acb5f2fe5834c90b diff --git a/project/CMakeLists.txt b/project/CMakeLists.txt new file mode 100644 index 0000000..aea2a2f --- /dev/null +++ b/project/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.17) +project(project C) + +set(CMAKE_C_STANDARD 99) + +file(GLOB sources + "${PROJECT_SOURCE_DIR}/include/*.h" + "${PROJECT_SOURCE_DIR}/src/*.c") + +add_executable(main ${sources}) diff --git a/project/Makefile b/project/Makefile new file mode 100644 index 0000000..a80cf6f --- /dev/null +++ b/project/Makefile @@ -0,0 +1,228 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.17 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Disable VCS-based implicit rules. +% : %,v + + +# Disable VCS-based implicit rules. +% : RCS/% + + +# Disable VCS-based implicit rules. +% : RCS/%,v + + +# Disable VCS-based implicit rules. +% : SCCS/s.% + + +# Disable VCS-based implicit rules. +% : s.% + + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake + +# The command to remove a file. +RM = /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/boriskozuro/Desktop/tp_c_2021/project + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/boriskozuro/Desktop/tp_c_2021/project + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /Users/boriskozuro/Desktop/tp_c_2021/project/CMakeFiles /Users/boriskozuro/Desktop/tp_c_2021/project/CMakeFiles/progress.marks + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/boriskozuro/Desktop/tp_c_2021/project/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named main + +# Build rule for target. +main: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 main +.PHONY : main + +# fast build rule for target. +main/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build +.PHONY : main/fast + +src/cars.o: src/cars.c.o + +.PHONY : src/cars.o + +# target to build an object file +src/cars.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/cars.c.o +.PHONY : src/cars.c.o + +src/cars.i: src/cars.c.i + +.PHONY : src/cars.i + +# target to preprocess a source file +src/cars.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/cars.c.i +.PHONY : src/cars.c.i + +src/cars.s: src/cars.c.s + +.PHONY : src/cars.s + +# target to generate assembly for a file +src/cars.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/cars.c.s +.PHONY : src/cars.c.s + +src/main.o: src/main.c.o + +.PHONY : src/main.o + +# target to build an object file +src/main.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/main.c.o +.PHONY : src/main.c.o + +src/main.i: src/main.c.i + +.PHONY : src/main.i + +# target to preprocess a source file +src/main.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/main.c.i +.PHONY : src/main.c.i + +src/main.s: src/main.c.s + +.PHONY : src/main.s + +# target to generate assembly for a file +src/main.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/main.c.s +.PHONY : src/main.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... main" + @echo "... src/cars.o" + @echo "... src/cars.i" + @echo "... src/cars.s" + @echo "... src/main.o" + @echo "... src/main.i" + @echo "... src/main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/project/db.txt b/project/db.txt new file mode 100644 index 0000000..678a588 --- /dev/null +++ b/project/db.txt @@ -0,0 +1,4 @@ +150 200 2 Renault_Logan Jeep +100 100 2 Toyota_Camry Sedan +100 100 1 Toyota_Camry Sedan +100 120 2 Renault_Sanderas Sedan \ No newline at end of file diff --git a/project/find.txt b/project/find.txt new file mode 100644 index 0000000..7e2ab0a --- /dev/null +++ b/project/find.txt @@ -0,0 +1 @@ +100 100 1 Toyota_Camry Sedan \ No newline at end of file diff --git a/project/include/cars.h b/project/include/cars.h new file mode 100644 index 0000000..0cb60f8 --- /dev/null +++ b/project/include/cars.h @@ -0,0 +1,42 @@ +// Copyright 2021 + +#ifndef PROJECT_CARS_H // NOLINT +#define PROJECT_CARS_H // NOLINT + +// define exceptions +#define NULLPTR_EX 1 +#define INCORRECT_ENTRY 2 +#define ALLOCATE_ERROR 3 +#define OUTPUT_ERROR 4 +// define finish read signal +#define EOF_REACHED -1 + +#include +#include + +#define SIZE_BUF 128 + +typedef struct { + float engine_power; + float maximum_velocity; + float fuel_consumption; + char* body_type; + char* model_name; +} car; + + +// open file +int open_car_database(FILE** db_ptr, const char* basename); +int read_car_instance(FILE* db_ptr, car *car_read); +int print_car_instance(const car* car_print); +float comparison(const car* car_1, const car* car_2); +int free_car(car* car_1); +int copy_car(car* car_destination, car* src); + +int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]); +int min_of_3(int i, int i1, int i2); +int car_nullptr(car* car_1); +float string_distance(const char* a, const char* b); + + +#endif // PROJECT_CARS_H // NOLINT diff --git a/project/main b/project/main new file mode 100755 index 0000000000000000000000000000000000000000..0082da5d91521e43e3c9901a681c018fe830430f GIT binary patch literal 51896 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 + + + + + diff --git a/project/src/cars.c b/project/src/cars.c new file mode 100644 index 0000000..87e6874 --- /dev/null +++ b/project/src/cars.c @@ -0,0 +1,150 @@ +// Copyright 2021 + +#include "../include/cars.h" +#include + +// open database file. check if not null. +int open_car_database(FILE** db_ptr, const char* basename) { + *db_ptr = fopen(basename, "r"); + if (db_ptr == NULL) { + printf("Could not open file %s\n", basename); + return NULLPTR_EX; + } + return 0; +} + +int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { + *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); //NOLINT + if (*string_in_car != NULL) { + if (snprintf(*string_in_car, SIZE_BUF, "%s", buffer_value) < 0) { + free(*string_in_car); + return INCORRECT_ENTRY; + } + return 0; + } + return ALLOCATE_ERROR; +} + +// read next car instance from base. +int read_car_instance(FILE* db_ptr, car *car_read) { + if (feof(db_ptr)) { + return EOF_REACHED; + } + if (db_ptr != NULL && car_read != NULL) { + char read_buffer[5][SIZE_BUF]; + if (fscanf(db_ptr, "%127s%127s%127s%127s%127s", read_buffer[0], + read_buffer[1], read_buffer[2], read_buffer[3], + read_buffer[4]) !=5 ) { + return INCORRECT_ENTRY; + } + if (strtof(read_buffer[0], NULL) > 0 && strtof(read_buffer[1], NULL) > 0 + && strtof(read_buffer[2], NULL) > 0) { + car_read->engine_power = strtof(read_buffer[0], NULL); + car_read->maximum_velocity = strtof(read_buffer[1], NULL); + car_read->fuel_consumption = strtof(read_buffer[2], NULL); + } + + if (allocate_string(&car_read->model_name, read_buffer[3]) != 0 + || allocate_string(&car_read->body_type, read_buffer[4]) != 0) + return ALLOCATE_ERROR; + return 0; + } + return NULLPTR_EX; +} + +// output car instance +int print_car_instance(const car* car_print) { + if (printf ("EP:%f V:%f FC%f Model:%s BT:%s \n", car_print->engine_power, + car_print->maximum_velocity, car_print->fuel_consumption, + car_print->model_name, car_print->body_type) > 0) + return 0; + return OUTPUT_ERROR; +} + +// float comparison in division. the closer they are, +// the more return approaches 0 +float distance(float a, float b) { + if (a > b) + return b/a; + else + return a/b; +} + +// levenshtein distance in c algorithm +float string_distance(const char* a, const char* b) { + size_t x, y, len_a, len_b; + len_a = strlen(a); + len_b = strlen(b); + int matrix[len_b + 1][len_a + 1]; + // matrix initializer + for (x = 0; x <= len_b; x++) { + for (y = 0; y <= len_a; y++) { + matrix[x][y] = 0; + } + } + matrix[0][0] = 0; + for (x = 1; x <= len_b; x++) + matrix[x][0] = matrix[x-1][0]+1; + for (y = 1; y <= len_a; y++) + matrix[0][y] = matrix[0][y]+1; + for (x = 1; x <= len_b; x++) + for (y = 1; y <= len_a; y++) + matrix[x][y] = min_of_3(matrix[x - 1][y] + 1, matrix[x][y - 1] + 1, + matrix[x - 1][y - 1] + + (a[y - 1] == b[x - 1] ? 0 : 1)); + return 1-((float)matrix[len_b][len_a])/len_a; //NOLINT +} + +// min_of_3 of 3 for levenshtein +int min_of_3(int i, int i1, int i2) { + if (i < i1) { + if (i < i2) { + return i; + } else { + return i2; + } + } + if (i2 < i1) { + return i2; + } + return i1; +} + +// comparison of 2 cars. returns 5 if completely equal +float comparison(const car* car_1, const car* car_2) { + float equality = 0; + equality += distance(car_1->maximum_velocity, car_2->maximum_velocity); + equality += distance(car_1->engine_power, car_2->engine_power); + equality += distance(car_1->fuel_consumption, car_2->fuel_consumption); + equality += string_distance(car_1->model_name, car_2->model_name); + equality += string_distance(car_1->body_type, car_2->body_type); + return equality; +} + +// free car strings +int free_car(car* car_1) { + if (car_1->body_type != NULL ) + free(car_1->body_type); + if (car_1->model_name != NULL ) + free(car_1->model_name); + return 0; +} + +// copy existing car instance +int copy_car(car* dest, car* src) { + free_car(dest); + if (dest == NULL) + return ALLOCATE_ERROR; + dest->fuel_consumption = src->fuel_consumption; + dest->engine_power = src->engine_power; + dest->maximum_velocity = src->maximum_velocity; + car_nullptr(dest); + allocate_string(&dest->model_name, src->model_name); + allocate_string(&dest->body_type, src->body_type); + return 0; +} +int car_nullptr(car* car_1) { + car_1->body_type = NULL; + car_1->model_name = NULL; + return 0; +} diff --git a/project/src/main.c b/project/src/main.c new file mode 100644 index 0000000..da18220 --- /dev/null +++ b/project/src/main.c @@ -0,0 +1,63 @@ +// Copyright 2021 +#include +#include "../include/cars.h" +#define DBNAME "db.txt" +#define SEARCH_NAME "find.txt" + +int main() { + car* input_car = malloc(sizeof(car)); + car* comparison_car = malloc(sizeof(car)); + car* found_car = malloc(sizeof(car)); + if (input_car == NULL || comparison_car == NULL || found_car == NULL) { + free(input_car); + free(comparison_car); + free(found_car); + return ALLOCATE_ERROR; + } + car_nullptr(input_car); + car_nullptr(comparison_car); + car_nullptr(found_car); + FILE* db = NULL, * search = NULL; + int return_code = 0; + return_code = open_car_database(&db, DBNAME) + + open_car_database(&search, SEARCH_NAME); + if (return_code != 0) { + fclose(db); + fclose(search); + return return_code; + } + float max_equality = 0; + if (read_car_instance(search, input_car) == 0) { + while (return_code == 0) { + return_code = read_car_instance(db, comparison_car); + if (return_code <= 0) { + if (max_equality < comparison(input_car, comparison_car)) { + max_equality = comparison(input_car, comparison_car); + if (copy_car(found_car, comparison_car) == 0) { + if (max_equality == 5) { + break; + } + } else { + // break of alloc error + break; + } + } + } + free_car(comparison_car); + } + } + if (return_code <= 0) { + print_car_instance(found_car); + return_code = 0; + } + free_car(input_car); + free_car(comparison_car); + free_car(found_car); + free(input_car); + free(comparison_car); + free(found_car); + fclose(db); + fclose(search); + + return return_code; +} From 16088c6cb0457ab4b7f028f52367b832b441e7d1 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Wed, 10 Mar 2021 23:34:19 +0300 Subject: [PATCH 03/56] added simple gtest. plan on adding more. switching to travis --- .DS_Store | Bin 6148 -> 6148 bytes .travis.yml | 0 project/.DS_Store | Bin 0 -> 6148 bytes project/CMakeLists.txt | 19 ++++++-- project/CMakeLists.txt.in | 15 +++++++ project/Makefile | 45 ++++++++++--------- project/main | Bin 51896 -> 0 bytes project/project.cbp | 82 ----------------------------------- project/src/main.c | 9 ++-- project/tests/CMakeLists.txt | 19 ++++++++ project/tests/main.cpp | 10 +++++ project/tests/tests.cpp | 16 +++++++ 12 files changed, 104 insertions(+), 111 deletions(-) create mode 100644 .travis.yml create mode 100644 project/.DS_Store create mode 100644 project/CMakeLists.txt.in delete mode 100755 project/main delete mode 100644 project/project.cbp create mode 100644 project/tests/CMakeLists.txt create mode 100644 project/tests/main.cpp create mode 100644 project/tests/tests.cpp diff --git a/.DS_Store b/.DS_Store index fb83f1068fa378af6a10f14e2ebf05d64696ffa7..72e605973b8b735f6a443296b8acf387ed762359 100644 GIT binary patch delta 344 zcmZoMXfc=|#>B)qu~2NHo}wrl0|Nsi1A_nqLn=cuLrGG3aY0hf=7o&Q8S6n(>%}Xf; z8x#zY;o#up;EWfLsIE4)FwjvjF*B~!QK+^w0t+I7 z3j~ZnZ-N0ol!j5WCi5^(mPYewS#VKaPJUiGP!S_AIMP@)vvcrs0K*N)`OZ9g1?m;qUdSjPYW delta 87 zcmZoMXfc=|#>B`mu~2NHo}wrV0|Nsi1A_nqLn=cuLrG4$VQ_N(#KPr_ER#PoP2RkQ oIhtkj24-HS&Fmcf96)WG7czfmp3E;|$pO>|(#fH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0Pw8o>sdnd+~aA zXFqD2MpMbMa9%c>C@^k4g`t`@L){Dm0+OjI#H?aZB!VYiXEIaKdZ?Od;fb1#I(CCf z9o*l!_rBeyCowHE{Ud*zJGu9sbMN`Ozx(N#x5|ZI{o>a*2oYE#gs4MqLO#_X#JC87 z65_qcCbDJqc74it*m&qcYF(ZJ%h^>qva8Um8z6p}y{chFSXMNb&n8m) zbi3c)W^FH_`-%4^zirDZqz)xgF)NW8N<+|ZZ&KTHr<{1d4X=G#Cnu$y?yfyu*7gT? z?N+LtYMcVKOum}dFJ+p0TEmvLFI_{8_|@%^tW2FsUvqN3t#ujH6qkdn?07mxd~t!7 zsZ&*MT<(}HD;cqJM-C3AlU635{f+hpl)9kRN;cety(-qZ3~I}YMe>nagFn83k>%@y zc(1*hrlM;5y=UjHPaEAk-H9vv#tEL%>6=tdxKno1dPKgFm@@VVsz%h32Tf^9S$2sf z)GbgXd|Hq%Qi1|MA}kc5nUOrA=rHA*(SWs=&>XmRL4M>h3~c zbuEG3fbo-^`E4jXiTrLsral^T;J&pu-U78)5YO%-xqSR!+XHQgD=`Qmqz@yL{U+c; zx*yRz;l+s&U<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>{%;8MnfAY$W0ymwJ-lez1;;E7J7(#g zALAQk=Y1&5Vi@fKb8L7~1jj!Jqh=9OrTf2&&MD!nLp5VuqtA*L=-Y14DGsn(_ z`p>Rr-}xteMQk>ZjyXLqOnb(erWWn0Xe^pzTSV{}eMjB#x=DO-OHVQEoEagNnd$3D zJ*9?SDuhR%JGLZ(CHk&dOFJ<%A{P2YdEs|Z=(yY%>9gl*j6-d~+mE3^h@lA?@95Rxe%-WR+)Gtaa?XF?OKS3cEC}tH@g%w^E!30#n3O^1WegP@ zDT4b6ai#H0&5UVJo1@bsFk#v+o1-t&m)WNMiaGkq2&kQQdFN=EzP9cu-O^7$*)R4& zxyOFZv`?6123o~&qI&G{PE=6oDVC&A@dP#W*tgz^+1ew+ZSaOG5$c1Rjxs!!UZSv^ zZpZ~c`@>+{bnpw`L0GD1?FJ}!9V~^W7dF;YGoj}e@_{{|x zXTi)nQ;MN6m(A;_!n5Y}Y14kwwEIre+7Ev7qFK821i3fI-h?G%(zGk49X{!7A>EIh zGi}%nqcuE*DL4tmQ|62@2L*C70n2mdHlrLoK0qxqMn(1%jS5<4gU9LD6OcIxPY|4* zuY<7(Gcb*|%1r%eRal*AwozFq(X^M7y+QDxBaTK4owiJcoDx0xE}%k2yGR+zDU#Wf#rtZ zFy}x1H63kD4UfM|&Mtvbok_D)e-y#YUJ2f{cFMFD&5Mrx%dwvYy6mN$HdGlw=B@x};IRFKSLFx*5MkJ4JjW;tgT z8)ju3G_XZ;D+HRyA4lZsG=jL~%u;;m5u8T#_;pY4=GuWk=aD_UWEZa5eTzk7X&cUh z(t7xp^kT4tbB<^m$H4|kE)w|xMM`NUA)65hgs(yZXHWmx;O)ZmUci-GSPXu)OoO_N z=y3!!b=HGW2cHx9Z-RBNaoH^4{YK}G6#{1Qus$|3EzU!$bvKc^ zS2e{I@138Zy zeq6TKcZyhN;eBUWvg=A^Cf~GfQ(`n~0nu_7mfoVH@er)(WLJi6IhUc83a$K>E z7o0xBWE;xOGe^-w zE0=6wRTr=hnvE&v@HKf}g{S2EZ?969{Z7B^YE~DsGI;Bgw-s3-TAVj zF$<@hXCzJkV8Jqc&KZCktSrpz1&97E0U9%V!7(KbbU&sDpgZZ@0lL_C-tMEL2>WfI z|LpbFuXYJ>y>(KSe<{o7Wcf8&o|5JBvi!O%zah&hS$1AC~vNyG-*^7wK45PnZB2{^`h#cjF{p{5i<#?q%0 zpx?J|0YSO{6V#+=+IDO4OWzi0L5NJf2yAR5djT@Zi4kA~7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1l~aiynw$MKz|V6jIL*O z{kpC%>H4R-UexukbX~9i|L*H_-J7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1m3X-G=E4uO2IXET9%c|N1_L; z=>7xNzCt7$6Q9Y7iO$%OWDGrpL2EFPip9}H@;RkJ!nynbD;CKfN~F-0YgCp}nQS7J zAEJJ0ZSvV4iX@WM-h%d_XfmCP6Bi;bo*p841JUVBTpHa-Og1iswh*0*Mp9C&6WqZ_ zGMSE&k_k>ZCaxD;E}u;*8+#R(m*(+D4=m9jZn6&Ux8jH6(Lz3M?T<%jcwY{XS1TIH zVpRFaU<9%KML@cUKneyEseR(PKo;UsDv<(isc2mMO+fly-uR6`ETQ|q6Hv-lwdHi+ zpm-?|6>kJ+bfhSb*3|*tHKII-Vls-N5<@YcpyG2VrVa>Emq=OZA?t2&ArJxV&(^IG zi&-?M#m@qWJ5@*~Gx@A|s!r4$%tW$@TskG*4rGo<562;0$-&ZO0mUK}Q-@H@AA;lZ z;J{R1qG2S^TfSkSf-hDEF!N+8eDo*(LuYey~6A<5O-Z?-L zU_~2>&JIQY9Q2(Yp8D@Z9zdo<{4Nv^t*`jcA!ZP29e^3+fIQ^=HvCw(tZ`n{V} z-#Va7`YuoMq(4FEBN0#fUY_*lH>i2r& z$-kE;{VA>gNv-elu6}uqGC(}(dwJ5&Y*qeywZ6-{`U5`yUY_(TTK{3K@A9sG#i#G( zNq_QQ<$p-)yS%IK9WTZ2u0pS%e(qzpMNh;`cvDK|IcfEmv{AP4NxMU{CoKr zHR|MF|Hol3=60ff8vJVOe_s2)r2V_R>;G}IQ*!-#d9QyG3kI61vhR_6Z9n|3=H2mO z*+RZHf1R3l@%w$vyX$d}=H2;uO!IEMG*+_buAh|V-Tgi4%Ip1dLi6r^JEeJd{eBlb z%;7(ke&pl-(Z~P7$7|)Pexov0<=6T6cl-GF`}hy}_}}yKcl-ElK7PB8-+_2Pg=``d z)}Kc1K@KDDLVggL*7|3VA41-Vyc_wq)e8x0l{?MyUtjW$a<2(1ny%gwp!GFTyQSpS zE3Xb*wYYAqgYNZXt-LDL{VVNPFGg$SU8(O;j}yED@e_v(T4=L^|% zdv`o{AfL{(=QCE++O%;~M|&ol{#-noZ_j0;?E?3Dt}Xi8DQ*u(4#amPlJQ(Sf!-EN zWTi1>t1T^7!+ymyuLArkZxqig_+KcVx%RG->T|`jUJzOJ - - - - - diff --git a/project/src/main.c b/project/src/main.c index da18220..b9fbd8d 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -4,7 +4,10 @@ #define DBNAME "db.txt" #define SEARCH_NAME "find.txt" -int main() { +int main(int argc, char *argv[]) { + if (argc != 3) { + return 1; + } car* input_car = malloc(sizeof(car)); car* comparison_car = malloc(sizeof(car)); car* found_car = malloc(sizeof(car)); @@ -19,8 +22,8 @@ int main() { car_nullptr(found_car); FILE* db = NULL, * search = NULL; int return_code = 0; - return_code = open_car_database(&db, DBNAME) - + open_car_database(&search, SEARCH_NAME); + return_code = open_car_database(&db, argv[1]) + + open_car_database(&search, argv[2]); if (return_code != 0) { fclose(db); fclose(search); diff --git a/project/tests/CMakeLists.txt b/project/tests/CMakeLists.txt new file mode 100644 index 0000000..6d07273 --- /dev/null +++ b/project/tests/CMakeLists.txt @@ -0,0 +1,19 @@ + +include_directories("${PROJECT_SOURCE_DIR}/include") + +file(GLOB sources "${PROJECT_SOURCE_DIR}/src/*.c") +list(REMOVE_ITEM sources "${PROJECT_SOURCE_DIR}/src/main.c") + +file(GLOB tests "${PROJECT_SOURCE_DIR}/tests/*.cpp") +list(REMOVE_ITEM tests "${PROJECT_SOURCE_DIR}/tests/main.cpp") + +foreach(file ${tests}) + set(name) + get_filename_component(name ${file} NAME_WE) + add_executable("${name}_tests" + ${sources} + ${file} + "${PROJECT_SOURCE_DIR}/tests/main.cpp") + target_link_libraries("${name}_tests" gtest_main) + add_test(NAME ${name} COMMAND "${name}_tests") +endforeach() \ No newline at end of file diff --git a/project/tests/main.cpp b/project/tests/main.cpp new file mode 100644 index 0000000..8755ef2 --- /dev/null +++ b/project/tests/main.cpp @@ -0,0 +1,10 @@ +// +// Created by Борис Кожуро on 10.03.2021. +// + +#include "gtest/gtest.h" + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/project/tests/tests.cpp b/project/tests/tests.cpp new file mode 100644 index 0000000..4856480 --- /dev/null +++ b/project/tests/tests.cpp @@ -0,0 +1,16 @@ +// +// Created by Борис Кожуро on 10.03.2021. +// + +#include "gtest/gtest.h" + +extern "C" { +#include "cars.h" +} + +TEST(min, ok) { +ASSERT_EQ(min_of_3(1,2,3), 1); +} + + + From d38a676102183e33fdde3fb5689ea53a2abd7337 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Wed, 10 Mar 2021 23:39:11 +0300 Subject: [PATCH 04/56] create a correct travis iml --- .travis.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.travis.yml b/.travis.yml index e69de29..d5924ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -0,0 +1,20 @@ +dist: focal +language: c + +os: linux + +compiler: gcc + +install: + - sudo apt-get install valgrind + - sudo apt-get install clang + - sudo apt-get install cppcheck + +script: + - ./run.sh + - cd project/ + - mkdir build + - cd build + - cmake .. + - make clean && make + - valgrind --tool=memcheck --leak-check=full ./test.out ../db.txt ../search.txt From bbc719c6ffd6bbe6a129ccc0c4b59010a4c789e1 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Wed, 10 Mar 2021 23:43:45 +0300 Subject: [PATCH 05/56] Update .travis.yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d5924ea..416c205 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,6 @@ install: - sudo apt-get install cppcheck script: - - ./run.sh - cd project/ - mkdir build - cd build From 80ac8208073fb32c1b67e40a88e898d6fcf68516 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Wed, 10 Mar 2021 23:47:56 +0300 Subject: [PATCH 06/56] Update README.md --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index c246e5e..9ae5ed8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ # cpp_2021 +[![Build Status](https://travis-ci.com/BorisKoz/cpp_2021.svg?branch=master)](https://travis-ci.com/BorisKoz/cpp_2021) + + + +# Вариант #4 +Создать структуру для хранения характеристик автомобилей: мощности двигателя, скорости, расхода топлива, формы кузова и модели. Составить с ее использованием программу поиска модели автомобиля, характеристики которой наиболее удовлетворяют запросу. + +# Требования к оформлению: +Программа должна быть реализована на языке C и работать для произвольных наборов входных данных (в том числе и ошибочных), вводимых пользователем с клавиатуры. Должна быть выполнена грамотная декомпозиция на функции и файлы. +Помимо самой программы необходимо: +– разработать набор юнит-тестов, проверяющих корректную работу реализованных функций. Обеспечить максимальное покрытие исходного кода тестами; +– оформить задачу в виде Merge Request отдельной ветки в основную ветку проекта. +Внимание: в основной ветке проекта никакого кода быть не должно! +– развернуть CI, в рамках которого автоматизировать сборку проекта, прохождение юнит-тестов под valgrind, генерацию отчёта о покрытии кода тестами, линтера и статического анализатора исходного кода; +– после прохождения всех проверок необходимо отправить код на ревью своему преподавателю; +– ревью - процесс итерационный. До наступления дедлайна можно проходить несколько итераций, улучшая свою оценку. Решения после дедлайна не принимаются; From 5b79a2fa605ff9d6ad843a32460c7311af573bbf Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Wed, 10 Mar 2021 23:48:45 +0300 Subject: [PATCH 07/56] Update .travis.yml --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 416c205..a81dfd9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,8 @@ install: - sudo apt-get install valgrind - sudo apt-get install clang - sudo apt-get install cppcheck + - apt remove cmake + - pip install cmake --upgrade script: - cd project/ From 2336041a4a4f2984ed148731bdf266527640019d Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Wed, 10 Mar 2021 23:57:12 +0300 Subject: [PATCH 08/56] cmake v lower --- project/CMakeLists.txt | 2 +- project/CMakeLists.txt.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/project/CMakeLists.txt b/project/CMakeLists.txt index 90274fe..ca359fb 100644 --- a/project/CMakeLists.txt +++ b/project/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.17) +cmake_minimum_required(VERSION 3.15) project(tests) configure_file(CMakeLists.txt.in diff --git a/project/CMakeLists.txt.in b/project/CMakeLists.txt.in index 78abc3a..0feb5f3 100644 --- a/project/CMakeLists.txt.in +++ b/project/CMakeLists.txt.in @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.17) +cmake_minimum_required(VERSION 3.15) project(googletest-download NONE) From 2d62b8367d58254f842b96711b48c302abc2cb11 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Wed, 10 Mar 2021 23:57:42 +0300 Subject: [PATCH 09/56] Update .travis.yml --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a81dfd9..416c205 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,6 @@ install: - sudo apt-get install valgrind - sudo apt-get install clang - sudo apt-get install cppcheck - - apt remove cmake - - pip install cmake --upgrade script: - cd project/ From d74186f4e906b51d025bafe409c11318cf616dff Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 00:07:31 +0300 Subject: [PATCH 10/56] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9ae5ed8..6f64ab8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # cpp_2021 -[![Build Status](https://travis-ci.com/BorisKoz/cpp_2021.svg?branch=master)](https://travis-ci.com/BorisKoz/cpp_2021) +[![Build Status](https://travis-ci.com/BorisKoz/cpp_2021.svg?branch=HW-1)](https://travis-ci.com/BorisKoz/cpp_2021) From 678ab3bd1cba9e732107a78f1192150b2d4d2b53 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 00:08:45 +0300 Subject: [PATCH 11/56] Update .travis.yml --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 416c205..f99c216 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,4 +16,7 @@ script: - cd build - cmake .. - make clean && make - - valgrind --tool=memcheck --leak-check=full ./test.out ../db.txt ../search.txt + - cd .. + - ls + - cd build + - ./test.out ../db.txt ../search.txt From 7c26f21263ab40042ecb8aa58e7b90e754aeda8d Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 00:19:15 +0300 Subject: [PATCH 12/56] Update .travis.yml --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f99c216..5437355 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ script: - cmake .. - make clean && make - cd .. - - ls + - cp db.txt /build + - cp search.txt / build - cd build - - ./test.out ../db.txt ../search.txt + - ./test.out db.txt search.txt From 209750d9fbc67a253b3536edf36aea39a4f54c0c Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 00:22:28 +0300 Subject: [PATCH 13/56] Update .travis.yml --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5437355..0fcb10d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,3 +21,7 @@ script: - cp search.txt / build - cd build - ./test.out db.txt search.txt + + +after_success: + - bash <(curl -s https://codecov.io/bash) From 714735240f9228821869c39558790cd00401f244 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 00:23:43 +0300 Subject: [PATCH 14/56] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6f64ab8..67ae891 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Build Status](https://travis-ci.com/BorisKoz/cpp_2021.svg?branch=HW-1)](https://travis-ci.com/BorisKoz/cpp_2021) +[![codecov](https://codecov.io/gh/BorisKoz/cpp_2021/branch/master/graph/badge.svg?token=QT0UXBZB7L)](https://codecov.io/gh/BorisKoz/cpp_2021) # Вариант #4 From 2e7c0f222498e16191b8df6efb48666a5956d630 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 00:40:10 +0300 Subject: [PATCH 15/56] Update .travis.yml --- .travis.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0fcb10d..ddd4001 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,11 +16,7 @@ script: - cd build - cmake .. - make clean && make - - cd .. - - cp db.txt /build - - cp search.txt / build - - cd build - - ./test.out db.txt search.txt + - valgrind --leak-check=full ./test.out ../db.txt ../search.txt after_success: From 65654fd784aee5d7736168089c506b1b15d60d81 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 00:50:25 +0300 Subject: [PATCH 16/56] resolving the segfault --- project/src/main.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/project/src/main.c b/project/src/main.c index b9fbd8d..98bf277 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -22,17 +22,18 @@ int main(int argc, char *argv[]) { car_nullptr(found_car); FILE* db = NULL, * search = NULL; int return_code = 0; - return_code = open_car_database(&db, argv[1]) - + open_car_database(&search, argv[2]); - if (return_code != 0) { - fclose(db); - fclose(search); - return return_code; + if (open_car_database(&db, argv[1]) != 0) { + return ALLOCATE_ERROR; + } + if (open_car_database(&search, argv[2]) != 0) { + return ALLOCATE_ERROR; } float max_equality = 0; if (read_car_instance(search, input_car) == 0) { + print_car_instance(input_car); while (return_code == 0) { return_code = read_car_instance(db, comparison_car); + print_car_instance(comparison_car); if (return_code <= 0) { if (max_equality < comparison(input_car, comparison_car)) { max_equality = comparison(input_car, comparison_car); From 97cf7dec144b653bf4e21069b865e633da443725 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 01:35:51 +0300 Subject: [PATCH 17/56] fixed stupid mistake of wrong names --- project/include/cars.h | 2 +- project/src/cars.c | 11 ++++++----- project/src/main.c | 4 +--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/project/include/cars.h b/project/include/cars.h index 0cb60f8..9a6dd71 100644 --- a/project/include/cars.h +++ b/project/include/cars.h @@ -14,7 +14,7 @@ #include #include -#define SIZE_BUF 128 +#define SIZE_BUF 40 typedef struct { float engine_power; diff --git a/project/src/cars.c b/project/src/cars.c index 87e6874..ff221c5 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -5,8 +5,9 @@ // open database file. check if not null. int open_car_database(FILE** db_ptr, const char* basename) { + *db_ptr = malloc(sizeof(FILE*)); *db_ptr = fopen(basename, "r"); - if (db_ptr == NULL) { + if (*db_ptr == NULL) { printf("Could not open file %s\n", basename); return NULLPTR_EX; } @@ -27,12 +28,9 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { // read next car instance from base. int read_car_instance(FILE* db_ptr, car *car_read) { - if (feof(db_ptr)) { - return EOF_REACHED; - } if (db_ptr != NULL && car_read != NULL) { char read_buffer[5][SIZE_BUF]; - if (fscanf(db_ptr, "%127s%127s%127s%127s%127s", read_buffer[0], + if (fscanf(db_ptr, "%35s%35s%35s%35s%35s", read_buffer[0], read_buffer[1], read_buffer[2], read_buffer[3], read_buffer[4]) !=5 ) { return INCORRECT_ENTRY; @@ -47,6 +45,9 @@ int read_car_instance(FILE* db_ptr, car *car_read) { if (allocate_string(&car_read->model_name, read_buffer[3]) != 0 || allocate_string(&car_read->body_type, read_buffer[4]) != 0) return ALLOCATE_ERROR; + if (feof(db_ptr)) { + return EOF_REACHED; + } return 0; } return NULLPTR_EX; diff --git a/project/src/main.c b/project/src/main.c index 98bf277..32616af 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -29,11 +29,9 @@ int main(int argc, char *argv[]) { return ALLOCATE_ERROR; } float max_equality = 0; - if (read_car_instance(search, input_car) == 0) { - print_car_instance(input_car); + if (read_car_instance(search, input_car) <= 0) { while (return_code == 0) { return_code = read_car_instance(db, comparison_car); - print_car_instance(comparison_car); if (return_code <= 0) { if (max_equality < comparison(input_car, comparison_car)) { max_equality = comparison(input_car, comparison_car); From 759d5387231f6e6b8c5e76237f95919dd7bb05ea Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 01:36:34 +0300 Subject: [PATCH 18/56] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ddd4001..c349d48 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ script: - cd build - cmake .. - make clean && make - - valgrind --leak-check=full ./test.out ../db.txt ../search.txt + - valgrind --leak-check=full ./test.out ../db.txt ../find.txt after_success: From 3d01538d005f7448450b6ddad055bf3a98d58636 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 01:43:18 +0300 Subject: [PATCH 19/56] fixed mleaks --- project/src/cars.c | 1 - 1 file changed, 1 deletion(-) diff --git a/project/src/cars.c b/project/src/cars.c index ff221c5..6c3ff38 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -5,7 +5,6 @@ // open database file. check if not null. int open_car_database(FILE** db_ptr, const char* basename) { - *db_ptr = malloc(sizeof(FILE*)); *db_ptr = fopen(basename, "r"); if (*db_ptr == NULL) { printf("Could not open file %s\n", basename); From 3ce10589ce69b7e9647c4ade4664bacda88d2b66 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 01:57:46 +0300 Subject: [PATCH 20/56] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c349d48..5fd9680 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,4 +20,4 @@ script: after_success: - - bash <(curl -s https://codecov.io/bash) + - codecov -t d142d667-d5d9-4692-b75e-f29f29622e4d -X gcov From 1262ffd60cf64f943b706ceb31e0a752b05d9d29 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 02:02:14 +0300 Subject: [PATCH 21/56] Update .travis.yml --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5fd9680..73098e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,8 +16,11 @@ script: - cd build - cmake .. - make clean && make + - cppcheck ../include/*.h ../src/*.c - valgrind --leak-check=full ./test.out ../db.txt ../find.txt + - ./tests/tests_tests + after_success: - - codecov -t d142d667-d5d9-4692-b75e-f29f29622e4d -X gcov + - bash <(curl -s https://codecov.io/bash) From 0106eb1f1b58c7716634358797ecc4bbf10f1caa Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 02:05:36 +0300 Subject: [PATCH 22/56] Update .travis.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 73098e7..65b13d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ script: - cmake .. - make clean && make - cppcheck ../include/*.h ../src/*.c + - cpplint ../include/*.h ../src/*.c - valgrind --leak-check=full ./test.out ../db.txt ../find.txt - ./tests/tests_tests From 537e61eabf685071abbc54c7c483763e439c4529 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 02:14:08 +0300 Subject: [PATCH 23/56] added flags for codecov --- project/tests/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/project/tests/CMakeLists.txt b/project/tests/CMakeLists.txt index 6d07273..147be82 100644 --- a/project/tests/CMakeLists.txt +++ b/project/tests/CMakeLists.txt @@ -1,6 +1,9 @@ include_directories("${PROJECT_SOURCE_DIR}/include") +set(CMAKE_C_FLAGS "-pedantic -fprofile-arcs -ftest-coverage") +set(CMAKE_CXX_FLAGS "-pedantic -fprofile-arcs -ftest-coverage") + file(GLOB sources "${PROJECT_SOURCE_DIR}/src/*.c") list(REMOVE_ITEM sources "${PROJECT_SOURCE_DIR}/src/main.c") From d9f08b2cf2b2a17e6c8a465a3986c19448edc3dc Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 02:15:37 +0300 Subject: [PATCH 24/56] Update .travis.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 65b13d4..11bcb1e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ install: - sudo apt-get install valgrind - sudo apt-get install clang - sudo apt-get install cppcheck + - sudo pip install cpplint script: - cd project/ From 472b34665010d7c2cf38df38ab3adc4895317d84 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 02:19:52 +0300 Subject: [PATCH 25/56] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67ae891..0652c85 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Build Status](https://travis-ci.com/BorisKoz/cpp_2021.svg?branch=HW-1)](https://travis-ci.com/BorisKoz/cpp_2021) -[![codecov](https://codecov.io/gh/BorisKoz/cpp_2021/branch/master/graph/badge.svg?token=QT0UXBZB7L)](https://codecov.io/gh/BorisKoz/cpp_2021) +[![codecov](https://codecov.io/gh/BorisKoz/cpp_2021/branch/HW-1/graph/badge.svg?token=QT0UXBZB7L)](https://codecov.io/gh/BorisKoz/cpp_2021) # Вариант #4 From 7bc2cdee06cc37b24edb5b5bba45a483ec7eae27 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 08:21:18 +0300 Subject: [PATCH 26/56] changed test names & structure --- .DS_Store | Bin 6148 -> 6148 bytes .gitignore | 1 + .travis.yml | 2 +- project/CMakeLists.txt | 2 +- project/src/cars.c | 14 +++++++++----- project/tests/cars.cpp | 22 ++++++++++++++++++++++ project/tests/main.cpp | 2 +- project/tests/tests.cpp | 16 ---------------- 8 files changed, 35 insertions(+), 24 deletions(-) create mode 100644 project/tests/cars.cpp delete mode 100644 project/tests/tests.cpp diff --git a/.DS_Store b/.DS_Store index 72e605973b8b735f6a443296b8acf387ed762359..bb18fb50d66d0f05e385af4e41f30734b8e816be 100644 GIT binary patch delta 21 ccmZoMXffEZmWji}z*0xS#Mor>RwjQ@07zQ~A^-pY delta 21 ccmZoMXffEZmWjjI!azsC#LRf}RwjQ@07zN}A^-pY diff --git a/.gitignore b/.gitignore index 054c7d1..fe3df23 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ project/build/ CMakeFiles/ CMakeCache.txt cmake-build-debug/ +cmake-build-debug-coverage/ *.cmake diff --git a/.travis.yml b/.travis.yml index 11bcb1e..651f8b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - cppcheck ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c - valgrind --leak-check=full ./test.out ../db.txt ../find.txt - - ./tests/tests_tests + - ./tests/cars_tests diff --git a/project/CMakeLists.txt b/project/CMakeLists.txt index ca359fb..5645120 100644 --- a/project/CMakeLists.txt +++ b/project/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.15) -project(tests) +project(cars) configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt) diff --git a/project/src/cars.c b/project/src/cars.c index 6c3ff38..4bae065 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -123,11 +123,14 @@ float comparison(const car* car_1, const car* car_2) { // free car strings int free_car(car* car_1) { - if (car_1->body_type != NULL ) - free(car_1->body_type); - if (car_1->model_name != NULL ) - free(car_1->model_name); - return 0; + if (car_1 != NULL) { + if (car_1->body_type != NULL) + free(car_1->body_type); + if (car_1->model_name != NULL) + free(car_1->model_name); + return 0; + } + return NULLPTR_EX; } // copy existing car instance @@ -143,6 +146,7 @@ int copy_car(car* dest, car* src) { allocate_string(&dest->body_type, src->body_type); return 0; } + int car_nullptr(car* car_1) { car_1->body_type = NULL; car_1->model_name = NULL; diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp new file mode 100644 index 0000000..d320b23 --- /dev/null +++ b/project/tests/cars.cpp @@ -0,0 +1,22 @@ +// +// Created by Борис Кожуро on 10.03.2021. +// + +#include "gtest/gtest.h" + +extern "C" { +#include "cars.h" +} + +TEST(min, ok) { + ASSERT_EQ(min_of_3(1,2,3), 1); + ASSERT_EQ(min_of_3(1,3,2), 1); + ASSERT_EQ(min_of_3(2,1,3), 1); + ASSERT_EQ(min_of_3(3,1,2), 1); + ASSERT_EQ(min_of_3(2,3,1), 1); + ASSERT_EQ(min_of_3(3,2,1), 1); +} + + + + diff --git a/project/tests/main.cpp b/project/tests/main.cpp index 8755ef2..d84202a 100644 --- a/project/tests/main.cpp +++ b/project/tests/main.cpp @@ -7,4 +7,4 @@ int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); -} \ No newline at end of file +} diff --git a/project/tests/tests.cpp b/project/tests/tests.cpp deleted file mode 100644 index 4856480..0000000 --- a/project/tests/tests.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// -// Created by Борис Кожуро on 10.03.2021. -// - -#include "gtest/gtest.h" - -extern "C" { -#include "cars.h" -} - -TEST(min, ok) { -ASSERT_EQ(min_of_3(1,2,3), 1); -} - - - From be813e823fd3af2d5dd7c65fc203df19d6370518 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 10:59:47 +0300 Subject: [PATCH 27/56] added 97% codecov --- .DS_Store | Bin 6148 -> 6148 bytes .gitignore | 5 +- project/include/cars.h | 1 + project/src/cars.c | 32 ++++++---- project/tests/1.txt | 1 + project/tests/2.txt | 2 + project/tests/3.txt | 2 + project/tests/cars.cpp | 139 ++++++++++++++++++++++++++++++++++++++--- project/tests/main.cpp | 4 +- 9 files changed, 158 insertions(+), 28 deletions(-) create mode 100644 project/tests/1.txt create mode 100644 project/tests/2.txt create mode 100644 project/tests/3.txt diff --git a/.DS_Store b/.DS_Store index bb18fb50d66d0f05e385af4e41f30734b8e816be..72e605973b8b735f6a443296b8acf387ed762359 100644 GIT binary patch delta 21 ccmZoMXffEZmWjjI!azsC#LRf}RwjQ@07zN}A^-pY delta 21 ccmZoMXffEZmWji}z*0xS#Mor>RwjQ@07zQ~A^-pY diff --git a/.gitignore b/.gitignore index fe3df23..512b5f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,9 @@ - -# CMake project/build/ CMakeFiles/ CMakeCache.txt cmake-build-debug/ cmake-build-debug-coverage/ *.cmake - - .idea/ +.DS_Store diff --git a/project/include/cars.h b/project/include/cars.h index 9a6dd71..5aec426 100644 --- a/project/include/cars.h +++ b/project/include/cars.h @@ -37,6 +37,7 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]); int min_of_3(int i, int i1, int i2); int car_nullptr(car* car_1); float string_distance(const char* a, const char* b); +float distance_fl(float a, float b); #endif // PROJECT_CARS_H // NOLINT diff --git a/project/src/cars.c b/project/src/cars.c index 4bae065..e9aeb7a 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -14,21 +14,27 @@ int open_car_database(FILE** db_ptr, const char* basename) { } int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { + if (string_in_car == NULL) { + return NULLPTR_EX; + } + if (buffer_value[0] == '\0'){ + return INCORRECT_ENTRY; + } *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); //NOLINT if (*string_in_car != NULL) { - if (snprintf(*string_in_car, SIZE_BUF, "%s", buffer_value) < 0) { - free(*string_in_car); - return INCORRECT_ENTRY; - } + // was a check on <0 here, but is eliminated due to constraints: + // SIZE_BUF always fits, and char* has no way of encoding error + snprintf(*string_in_car, SIZE_BUF, "%s", buffer_value); return 0; } + // not reached by codecov cuz it allocs return ALLOCATE_ERROR; } // read next car instance from base. int read_car_instance(FILE* db_ptr, car *car_read) { if (db_ptr != NULL && car_read != NULL) { - char read_buffer[5][SIZE_BUF]; + char read_buffer[5][SIZE_BUF]= {"","","","",""}; if (fscanf(db_ptr, "%35s%35s%35s%35s%35s", read_buffer[0], read_buffer[1], read_buffer[2], read_buffer[3], read_buffer[4]) !=5 ) { @@ -39,10 +45,13 @@ int read_car_instance(FILE* db_ptr, car *car_read) { car_read->engine_power = strtof(read_buffer[0], NULL); car_read->maximum_velocity = strtof(read_buffer[1], NULL); car_read->fuel_consumption = strtof(read_buffer[2], NULL); + } else { + return INCORRECT_ENTRY; } if (allocate_string(&car_read->model_name, read_buffer[3]) != 0 || allocate_string(&car_read->body_type, read_buffer[4]) != 0) + // not reaching cuz it allocates return ALLOCATE_ERROR; if (feof(db_ptr)) { return EOF_REACHED; @@ -58,12 +67,13 @@ int print_car_instance(const car* car_print) { car_print->maximum_velocity, car_print->fuel_consumption, car_print->model_name, car_print->body_type) > 0) return 0; + // not reached by codecov cuz it prints return OUTPUT_ERROR; } // float comparison in division. the closer they are, // the more return approaches 0 -float distance(float a, float b) { +float distance_fl(float a, float b) { if (a > b) return b/a; else @@ -113,9 +123,9 @@ int min_of_3(int i, int i1, int i2) { // comparison of 2 cars. returns 5 if completely equal float comparison(const car* car_1, const car* car_2) { float equality = 0; - equality += distance(car_1->maximum_velocity, car_2->maximum_velocity); - equality += distance(car_1->engine_power, car_2->engine_power); - equality += distance(car_1->fuel_consumption, car_2->fuel_consumption); + equality += distance_fl(car_1->maximum_velocity, car_2->maximum_velocity); + equality += distance_fl(car_1->engine_power, car_2->engine_power); + equality += distance_fl(car_1->fuel_consumption, car_2->fuel_consumption); equality += string_distance(car_1->model_name, car_2->model_name); equality += string_distance(car_1->body_type, car_2->body_type); return equality; @@ -135,9 +145,9 @@ int free_car(car* car_1) { // copy existing car instance int copy_car(car* dest, car* src) { - free_car(dest); if (dest == NULL) - return ALLOCATE_ERROR; + return NULLPTR_EX; + free_car(dest); dest->fuel_consumption = src->fuel_consumption; dest->engine_power = src->engine_power; dest->maximum_velocity = src->maximum_velocity; diff --git a/project/tests/1.txt b/project/tests/1.txt new file mode 100644 index 0000000..4cc3520 --- /dev/null +++ b/project/tests/1.txt @@ -0,0 +1 @@ +1 10 a Toyota Sedan \ No newline at end of file diff --git a/project/tests/2.txt b/project/tests/2.txt new file mode 100644 index 0000000..d5b108b --- /dev/null +++ b/project/tests/2.txt @@ -0,0 +1,2 @@ +1 10 1 Toyota Sedan +1 10 a Toyota \ No newline at end of file diff --git a/project/tests/3.txt b/project/tests/3.txt new file mode 100644 index 0000000..34c8d05 --- /dev/null +++ b/project/tests/3.txt @@ -0,0 +1,2 @@ +1 10 1 Toyota +1 10 1 Toyota Sedan \ No newline at end of file diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index d320b23..1136ed8 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -1,22 +1,141 @@ -// -// Created by Борис Кожуро on 10.03.2021. -// +// Copyright 2021 #include "gtest/gtest.h" extern "C" { -#include "cars.h" +#include "./cars.h" } +// tests for in-program logic TEST(min, ok) { - ASSERT_EQ(min_of_3(1,2,3), 1); - ASSERT_EQ(min_of_3(1,3,2), 1); - ASSERT_EQ(min_of_3(2,1,3), 1); - ASSERT_EQ(min_of_3(3,1,2), 1); - ASSERT_EQ(min_of_3(2,3,1), 1); - ASSERT_EQ(min_of_3(3,2,1), 1); + ASSERT_EQ(min_of_3(1, 2, 3), 1); + ASSERT_EQ(min_of_3(1, 3, 2), 1); + ASSERT_EQ(min_of_3(2, 1, 3), 1); + ASSERT_EQ(min_of_3(3, 1, 2), 1); + ASSERT_EQ(min_of_3(2, 3, 1), 1); + ASSERT_EQ(min_of_3(3, 2, 1), 1); +} +TEST(Levenstein, ok) { + EXPECT_EQ(string_distance("Toyota", "Toyota"), 1); + EXPECT_EQ(string_distance("Toyota", "Toy"), 0.5); + EXPECT_EQ(string_distance("Toyota", "Renaul"), 0); +} +TEST(distance, ok) { + EXPECT_EQ(distance_fl(1, 2), 0.5); + EXPECT_EQ(distance_fl(4, 1), 0.25); +} + + +// tests for memory functions +TEST(allocate_string, ok) { + char buffer[SIZE_BUF] = "test_string"; + char **allocated_string = nullptr; + EXPECT_EQ(allocate_string(allocated_string, buffer), NULLPTR_EX); + allocated_string = (char**) malloc(sizeof(char*)); // NOLINT + EXPECT_EQ(allocate_string(allocated_string, buffer), 0); + free(*allocated_string); + char buffer2[SIZE_BUF] = ""; + EXPECT_EQ(allocate_string(allocated_string, buffer2), INCORRECT_ENTRY); +} + +TEST(open_car_database, ok) { + FILE* pointer; + EXPECT_EQ(open_car_database(&pointer, "../../db.txt"), 0); + fclose(pointer); + EXPECT_EQ(open_car_database(&pointer, "search.txt"), NULLPTR_EX); +} + +TEST(free_car, ok) { + car* pointer = NULL; + car car_a = {100, 100, 1, NULL, NULL}; + car_a.model_name = (char*)malloc(sizeof(char) * 10); // NOLINT + car_a.body_type = (char*)malloc(sizeof(char) * 10); // NOLINT + EXPECT_EQ(free_car(pointer), NULLPTR_EX); + EXPECT_EQ(free_car(&car_a), 0); +} + +// as car_nullptr is only called on need of null allocation +// or on already nulled strings it has no memleak +TEST(car_nullptr, ok) { + car car_a = {100, 100, 1, nullptr, nullptr}; + EXPECT_EQ(car_nullptr(&car_a), 0); +} + +TEST(copy_car, not_ok) { + car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + car* newcar = nullptr; + EXPECT_EQ(copy_car(newcar, &car_a), NULLPTR_EX); } +TEST(copy_car, ok) { + car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + car newcar = {200, 0, 2, nullptr, nullptr}; + newcar.body_type = (char*)malloc(sizeof(char) * 10); // NOLINT + EXPECT_EQ(copy_car(&newcar, &car_a), 0); + ASSERT_EQ(newcar.fuel_consumption, car_a.fuel_consumption); + ASSERT_EQ(newcar.fuel_consumption, car_a.fuel_consumption); + ASSERT_EQ(newcar.fuel_consumption, car_a.fuel_consumption); + ASSERT_STREQ(newcar.body_type, car_a.body_type); + ASSERT_STREQ(newcar.model_name, car_a.model_name); +} + +TEST(comparison, ok) { + car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + car car_b = {100, 0, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + car car_c = {100, 0, 0, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + car car_d = {0, 0, 0, (char*)"Renaul", (char*)"Coupe"}; // NOLINT + EXPECT_EQ(comparison(&car_a, &car_a), 5); + EXPECT_EQ(comparison(&car_a, &car_b), 4); + EXPECT_EQ(comparison(&car_a, &car_c), 3); + EXPECT_EQ(comparison(&car_a, &car_d), 0); +} + +TEST(print_car_instance, ok) { + car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + ASSERT_EQ(print_car_instance(&car_a), 0); +} + +TEST(read_car_instance, ok) { + FILE* file = nullptr; + car car_1 = {100,100,0 ,NULL, NULL}; + ASSERT_EQ(read_car_instance(file, &car_1), NULLPTR_EX); + open_car_database(&file, "../../find.txt"); + ASSERT_EQ(read_car_instance(file, &car_1), EOF_REACHED); + fclose(file); + open_car_database(&file, "../../db.txt"); + ASSERT_EQ(read_car_instance(file, &car_1), 0); + fclose(file); +} + +TEST(read_car_instance, not_ok_1) { + FILE* file = nullptr; + car car_1 = {100,100,0 ,NULL, NULL}; + open_car_database(&file, "../../tests/1.txt"); + ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); + fclose(file); +} + +TEST(read_car_instance, not_ok_2) { + FILE* file = nullptr; + car car_1 = {100,100,0 ,NULL, NULL}; + open_car_database(&file, "../../tests/2.txt"); + read_car_instance(file, &car_1); + ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); + fclose(file); + open_car_database(&file, "../../tests/3.txt"); + read_car_instance(file, &car_1); + ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); + fclose(file); +} + +TEST(read_car_instance, not_ok_3) { + FILE* file = nullptr; + car car_1 = {100,100,0 ,NULL, NULL}; + open_car_database(&file, "../../tests/3.txt"); + read_car_instance(file, &car_1); + ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); + fclose(file); +} diff --git a/project/tests/main.cpp b/project/tests/main.cpp index d84202a..7b0b7e1 100644 --- a/project/tests/main.cpp +++ b/project/tests/main.cpp @@ -1,6 +1,4 @@ -// -// Created by Борис Кожуро on 10.03.2021. -// +// Copyright 2021 #include "gtest/gtest.h" From 57ede38794e19f8a7b9efdfb5a88ec009854be88 Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 11:06:14 +0300 Subject: [PATCH 28/56] corrected tests execute dir --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 651f8b8..ad9ca57 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,8 @@ script: - cppcheck ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c - valgrind --leak-check=full ./test.out ../db.txt ../find.txt - - ./tests/cars_tests + - cd tests + - ./cars_tests From 5e88e41fcced9039defeeebf171bfd71026d4eaf Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 11:12:56 +0300 Subject: [PATCH 29/56] corrected cpplint --- project/src/cars.c | 4 ++-- project/tests/cars.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/project/src/cars.c b/project/src/cars.c index e9aeb7a..c0e5e39 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -17,7 +17,7 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { if (string_in_car == NULL) { return NULLPTR_EX; } - if (buffer_value[0] == '\0'){ + if (buffer_value[0] == '\0') { return INCORRECT_ENTRY; } *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); //NOLINT @@ -34,7 +34,7 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { // read next car instance from base. int read_car_instance(FILE* db_ptr, car *car_read) { if (db_ptr != NULL && car_read != NULL) { - char read_buffer[5][SIZE_BUF]= {"","","","",""}; + char read_buffer[5][SIZE_BUF]= {"", "", "", "", ""}; if (fscanf(db_ptr, "%35s%35s%35s%35s%35s", read_buffer[0], read_buffer[1], read_buffer[2], read_buffer[3], read_buffer[4]) !=5 ) { diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index 1136ed8..8c4d507 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -97,7 +97,7 @@ TEST(print_car_instance, ok) { TEST(read_car_instance, ok) { FILE* file = nullptr; - car car_1 = {100,100,0 ,NULL, NULL}; + car car_1 = {100, 100, 0, NULL, NULL}; ASSERT_EQ(read_car_instance(file, &car_1), NULLPTR_EX); open_car_database(&file, "../../find.txt"); ASSERT_EQ(read_car_instance(file, &car_1), EOF_REACHED); @@ -109,7 +109,7 @@ TEST(read_car_instance, ok) { TEST(read_car_instance, not_ok_1) { FILE* file = nullptr; - car car_1 = {100,100,0 ,NULL, NULL}; + car car_1 = {100, 100, 0, NULL, NULL}; open_car_database(&file, "../../tests/1.txt"); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); fclose(file); @@ -117,7 +117,7 @@ TEST(read_car_instance, not_ok_1) { TEST(read_car_instance, not_ok_2) { FILE* file = nullptr; - car car_1 = {100,100,0 ,NULL, NULL}; + car car_1 = {100, 100, 0, NULL, NULL}; open_car_database(&file, "../../tests/2.txt"); read_car_instance(file, &car_1); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); @@ -130,7 +130,7 @@ TEST(read_car_instance, not_ok_2) { TEST(read_car_instance, not_ok_3) { FILE* file = nullptr; - car car_1 = {100,100,0 ,NULL, NULL}; + car car_1 = {100, 100, 0, NULL, NULL}; open_car_database(&file, "../../tests/3.txt"); read_car_instance(file, &car_1); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); From add27d5515913d4d4b9829d0d858a429487deaf9 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 11:14:06 +0300 Subject: [PATCH 30/56] added tests cpplint --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ad9ca57..5eed0d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ script: - cmake .. - make clean && make - cppcheck ../include/*.h ../src/*.c - - cpplint ../include/*.h ../src/*.c + - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - valgrind --leak-check=full ./test.out ../db.txt ../find.txt - cd tests - ./cars_tests From 8ea7abb3fe088000b2f2178743a02814251222d3 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 13:18:30 +0300 Subject: [PATCH 31/56] added terminal input. running tests on valgrind on remote to check ir --- .travis.yml | 4 +- project/find.txt | 2 +- project/include/cars.h | 1 + project/src/cars.c | 10 ++-- project/src/main.c | 118 +++++++++++++++++++++++++---------------- project/tests/cars.cpp | 2 + 6 files changed, 85 insertions(+), 52 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5eed0d0..c0980eb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,9 +19,9 @@ script: - make clean && make - cppcheck ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - valgrind --leak-check=full ./test.out ../db.txt ../find.txt + - valgrind --leak-check=full ./test.out ../db.txt ../find.txt < ../find.txt - cd tests - - ./cars_tests + - valgrind --leak-check=full ./cars_tests diff --git a/project/find.txt b/project/find.txt index 7e2ab0a..bea7afc 100644 --- a/project/find.txt +++ b/project/find.txt @@ -1 +1 @@ -100 100 1 Toyota_Camry Sedan \ No newline at end of file +100 100 1 Toyota Sedan \ No newline at end of file diff --git a/project/include/cars.h b/project/include/cars.h index 5aec426..61a3a0c 100644 --- a/project/include/cars.h +++ b/project/include/cars.h @@ -40,4 +40,5 @@ float string_distance(const char* a, const char* b); float distance_fl(float a, float b); + #endif // PROJECT_CARS_H // NOLINT diff --git a/project/src/cars.c b/project/src/cars.c index c0e5e39..e5b0564 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -5,7 +5,7 @@ // open database file. check if not null. int open_car_database(FILE** db_ptr, const char* basename) { - *db_ptr = fopen(basename, "r"); + *db_ptr = fopen(basename, "r+"); if (*db_ptr == NULL) { printf("Could not open file %s\n", basename); return NULLPTR_EX; @@ -135,9 +135,11 @@ float comparison(const car* car_1, const car* car_2) { int free_car(car* car_1) { if (car_1 != NULL) { if (car_1->body_type != NULL) - free(car_1->body_type); + if (strlen(car_1->body_type)!=0) + free(car_1->body_type); if (car_1->model_name != NULL) - free(car_1->model_name); + if (strlen(car_1->model_name)!=0) + free(car_1->model_name); return 0; } return NULLPTR_EX; @@ -162,3 +164,5 @@ int car_nullptr(car* car_1) { car_1->model_name = NULL; return 0; } + + diff --git a/project/src/main.c b/project/src/main.c index 32616af..8fb90fc 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -1,65 +1,91 @@ // Copyright 2021 #include +#include #include "../include/cars.h" -#define DBNAME "db.txt" -#define SEARCH_NAME "find.txt" int main(int argc, char *argv[]) { if (argc != 3) { - return 1; + return INCORRECT_ENTRY; } - car* input_car = malloc(sizeof(car)); - car* comparison_car = malloc(sizeof(car)); - car* found_car = malloc(sizeof(car)); - if (input_car == NULL || comparison_car == NULL || found_car == NULL) { - free(input_car); - free(comparison_car); - free(found_car); - return ALLOCATE_ERROR; - } - car_nullptr(input_car); - car_nullptr(comparison_car); - car_nullptr(found_car); + car* input_car = (car*)malloc(sizeof(car)); //NOLINT + car* comparison_car = (car*)malloc(sizeof(car)); //NOLINT + car* found_car = (car*)malloc(sizeof(car)); //NOLINT FILE* db = NULL, * search = NULL; int return_code = 0; - if (open_car_database(&db, argv[1]) != 0) { - return ALLOCATE_ERROR; - } - if (open_car_database(&search, argv[2]) != 0) { - return ALLOCATE_ERROR; - } - float max_equality = 0; - if (read_car_instance(search, input_car) <= 0) { - while (return_code == 0) { - return_code = read_car_instance(db, comparison_car); - if (return_code <= 0) { - if (max_equality < comparison(input_car, comparison_car)) { - max_equality = comparison(input_car, comparison_car); - if (copy_car(found_car, comparison_car) == 0) { - if (max_equality == 5) { + while (true) { + + // Allocation fault check + if (input_car == NULL || comparison_car == NULL || found_car == NULL) { + return_code = ALLOCATE_ERROR; + } + if (return_code !=0) + break; + car_nullptr(input_car); + car_nullptr(comparison_car); + car_nullptr(found_car); + + // open fault check + if (open_car_database(&db, argv[1]) != 0 || + open_car_database(&search, argv[2]) != 0) { + return_code = ALLOCATE_ERROR; + } + if (return_code !=0) + break; + + // write to file for search + char read_buffer[SIZE_BUF]; + for (int i=0; i<5; i++) { + if (scanf( "%35s", read_buffer) !=1 ) { + return_code = INCORRECT_ENTRY; + } else { + fputs(read_buffer, search); + if (i<4) + fputs(" ", search); + } + } + rewind(search); + if (return_code !=0) + break; + // search itself + float max_equality = 0; + if (read_car_instance(search, input_car) <= 0) { + while (return_code == 0) { + return_code = read_car_instance(db, comparison_car); + if (return_code <= 0) { + if (max_equality < comparison(input_car, comparison_car)) { + max_equality = comparison(input_car, comparison_car); + if (copy_car(found_car, comparison_car) == 0) { + if (max_equality == 5) { + break; + } + } else { + // break of alloc error break; } - } else { - // break of alloc error - break; } } + free_car(comparison_car); + car_nullptr(comparison_car); } - free_car(comparison_car); } + if (return_code <= 0) { + print_car_instance(found_car); + return_code = 0; + } + break; } - if (return_code <= 0) { - print_car_instance(found_car); - return_code = 0; - } - free_car(input_car); - free_car(comparison_car); free_car(found_car); - free(input_car); - free(comparison_car); - free(found_car); - fclose(db); - fclose(search); - + free_car(comparison_car); + free_car(input_car); + if (input_car != NULL) + free(input_car); + if (comparison_car != NULL) + free(comparison_car); + if (found_car != NULL) + free(found_car); + if (db != NULL) + fclose(db); + if (search != NULL) + fclose(search); return return_code; } diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index 8c4d507..8f1d81c 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -54,6 +54,8 @@ TEST(free_car, ok) { EXPECT_EQ(free_car(&car_a), 0); } + + // as car_nullptr is only called on need of null allocation // or on already nulled strings it has no memleak TEST(car_nullptr, ok) { From aacd6dfb2f6ed24ecfac61213e4649de8455d839 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 13:30:21 +0300 Subject: [PATCH 32/56] valgrind test look src --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c0980eb..bb3495a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ dist: focal + language: c os: linux @@ -21,7 +22,7 @@ script: - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - valgrind --leak-check=full ./test.out ../db.txt ../find.txt < ../find.txt - cd tests - - valgrind --leak-check=full ./cars_tests + - valgrind --leak-check=full --track-origins=yes ./cars_tests From b4eabcb37bbab968a9907cb11139f7c05daa86d1 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 13:50:58 +0300 Subject: [PATCH 33/56] valgrind test 2 look src --- project/src/cars.c | 7 +++++-- project/src/main.c | 9 +++------ project/tests/cars.cpp | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/project/src/cars.c b/project/src/cars.c index e5b0564..496ec22 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -20,6 +20,9 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { if (buffer_value[0] == '\0') { return INCORRECT_ENTRY; } + if (*string_in_car != NULL) + if (strlen(*string_in_car) != 0) + free (*string_in_car); *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); //NOLINT if (*string_in_car != NULL) { // was a check on <0 here, but is eliminated due to constraints: @@ -135,10 +138,10 @@ float comparison(const car* car_1, const car* car_2) { int free_car(car* car_1) { if (car_1 != NULL) { if (car_1->body_type != NULL) - if (strlen(car_1->body_type)!=0) + if (strlen(car_1->body_type) != 0) free(car_1->body_type); if (car_1->model_name != NULL) - if (strlen(car_1->model_name)!=0) + if (strlen(car_1->model_name) != 0) free(car_1->model_name); return 0; } diff --git a/project/src/main.c b/project/src/main.c index 8fb90fc..f2fdd85 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -13,7 +13,6 @@ int main(int argc, char *argv[]) { FILE* db = NULL, * search = NULL; int return_code = 0; while (true) { - // Allocation fault check if (input_car == NULL || comparison_car == NULL || found_car == NULL) { return_code = ALLOCATE_ERROR; @@ -34,12 +33,12 @@ int main(int argc, char *argv[]) { // write to file for search char read_buffer[SIZE_BUF]; - for (int i=0; i<5; i++) { - if (scanf( "%35s", read_buffer) !=1 ) { + for (int i = 0; i < 5; i++) { + if (scanf("%35s", read_buffer) != 1 ) { return_code = INCORRECT_ENTRY; } else { fputs(read_buffer, search); - if (i<4) + if (i < 4) fputs(" ", search); } } @@ -64,8 +63,6 @@ int main(int argc, char *argv[]) { } } } - free_car(comparison_car); - car_nullptr(comparison_car); } } if (return_code <= 0) { diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index 8f1d81c..f39155c 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -32,6 +32,7 @@ TEST(allocate_string, ok) { char **allocated_string = nullptr; EXPECT_EQ(allocate_string(allocated_string, buffer), NULLPTR_EX); allocated_string = (char**) malloc(sizeof(char*)); // NOLINT + *allocated_string= nullptr; EXPECT_EQ(allocate_string(allocated_string, buffer), 0); free(*allocated_string); char buffer2[SIZE_BUF] = ""; @@ -114,6 +115,7 @@ TEST(read_car_instance, not_ok_1) { car car_1 = {100, 100, 0, NULL, NULL}; open_car_database(&file, "../../tests/1.txt"); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); + free_car(&car_1); fclose(file); } @@ -124,10 +126,7 @@ TEST(read_car_instance, not_ok_2) { read_car_instance(file, &car_1); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); fclose(file); - open_car_database(&file, "../../tests/3.txt"); - read_car_instance(file, &car_1); - ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); - fclose(file); + free_car(&car_1); } TEST(read_car_instance, not_ok_3) { @@ -137,6 +136,7 @@ TEST(read_car_instance, not_ok_3) { read_car_instance(file, &car_1); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); fclose(file); + free_car(&car_1); } From 84b021280ada5277d44177c5b7f12b0ee7614496 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 14:12:23 +0300 Subject: [PATCH 34/56] seems like no leaks --- project/src/cars.c | 3 ++- project/src/main.c | 2 +- project/tests/cars.cpp | 7 +++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/project/src/cars.c b/project/src/cars.c index 496ec22..b136ceb 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -22,7 +22,7 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { } if (*string_in_car != NULL) if (strlen(*string_in_car) != 0) - free (*string_in_car); + free(*string_in_car); *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); //NOLINT if (*string_in_car != NULL) { // was a check on <0 here, but is eliminated due to constraints: @@ -162,6 +162,7 @@ int copy_car(car* dest, car* src) { return 0; } + int car_nullptr(car* car_1) { car_1->body_type = NULL; car_1->model_name = NULL; diff --git a/project/src/main.c b/project/src/main.c index f2fdd85..233c916 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -34,7 +34,7 @@ int main(int argc, char *argv[]) { // write to file for search char read_buffer[SIZE_BUF]; for (int i = 0; i < 5; i++) { - if (scanf("%35s", read_buffer) != 1 ) { + if (scanf("%35s", read_buffer) != 1) { return_code = INCORRECT_ENTRY; } else { fputs(read_buffer, search); diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index f39155c..e3be595 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -32,11 +32,12 @@ TEST(allocate_string, ok) { char **allocated_string = nullptr; EXPECT_EQ(allocate_string(allocated_string, buffer), NULLPTR_EX); allocated_string = (char**) malloc(sizeof(char*)); // NOLINT - *allocated_string= nullptr; + *allocated_string = nullptr; EXPECT_EQ(allocate_string(allocated_string, buffer), 0); free(*allocated_string); char buffer2[SIZE_BUF] = ""; EXPECT_EQ(allocate_string(allocated_string, buffer2), INCORRECT_ENTRY); + free(*allocated_string); } TEST(open_car_database, ok) { @@ -73,13 +74,13 @@ TEST(copy_car, not_ok) { TEST(copy_car, ok) { car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT car newcar = {200, 0, 2, nullptr, nullptr}; - newcar.body_type = (char*)malloc(sizeof(char) * 10); // NOLINT EXPECT_EQ(copy_car(&newcar, &car_a), 0); ASSERT_EQ(newcar.fuel_consumption, car_a.fuel_consumption); ASSERT_EQ(newcar.fuel_consumption, car_a.fuel_consumption); ASSERT_EQ(newcar.fuel_consumption, car_a.fuel_consumption); ASSERT_STREQ(newcar.body_type, car_a.body_type); ASSERT_STREQ(newcar.model_name, car_a.model_name); + free_car(&newcar); } TEST(comparison, ok) { @@ -108,6 +109,7 @@ TEST(read_car_instance, ok) { open_car_database(&file, "../../db.txt"); ASSERT_EQ(read_car_instance(file, &car_1), 0); fclose(file); + free_car(&car_1); } TEST(read_car_instance, not_ok_1) { @@ -117,6 +119,7 @@ TEST(read_car_instance, not_ok_1) { ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); free_car(&car_1); fclose(file); + free_car(&car_1); } TEST(read_car_instance, not_ok_2) { From 54caede3e5a1008fe83c20999d4651f737b0d0e7 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 14:25:53 +0300 Subject: [PATCH 35/56] next try --- project/tests/cars.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index e3be595..f21e920 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -37,7 +37,7 @@ TEST(allocate_string, ok) { free(*allocated_string); char buffer2[SIZE_BUF] = ""; EXPECT_EQ(allocate_string(allocated_string, buffer2), INCORRECT_ENTRY); - free(*allocated_string); + free (allocated_string); } TEST(open_car_database, ok) { @@ -50,8 +50,9 @@ TEST(open_car_database, ok) { TEST(free_car, ok) { car* pointer = NULL; car car_a = {100, 100, 1, NULL, NULL}; - car_a.model_name = (char*)malloc(sizeof(char) * 10); // NOLINT - car_a.body_type = (char*)malloc(sizeof(char) * 10); // NOLINT + char buffer[SIZE_BUF] = "test_string"; + allocate_string(&car_a.body_type, buffer); + allocate_string(&car_a.model_name, buffer); EXPECT_EQ(free_car(pointer), NULLPTR_EX); EXPECT_EQ(free_car(&car_a), 0); } From cfffa665338fa2919c9729e8edadf31b6ea0c9c5 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 14:38:29 +0300 Subject: [PATCH 36/56] fixed cpplint --- project/tests/cars.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index f21e920..5c6aeb8 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -37,7 +37,7 @@ TEST(allocate_string, ok) { free(*allocated_string); char buffer2[SIZE_BUF] = ""; EXPECT_EQ(allocate_string(allocated_string, buffer2), INCORRECT_ENTRY); - free (allocated_string); + free(allocated_string); } TEST(open_car_database, ok) { From 72828b771dfa54c563a112d12f1959f8f4921837 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 16:17:41 +0300 Subject: [PATCH 37/56] search is now in another func, with gtest. added cppcheck tags --- .travis.yml | 2 +- CPPLINT.cfg | 4 +++ project/include/cars.h | 7 ++-- project/src/cars.c | 74 +++++++++++++++++++++++++++++++++++------- project/src/main.c | 43 +++++++----------------- project/tests/4.txt | 2 ++ project/tests/5.txt | 1 + project/tests/cars.cpp | 58 ++++++++++++++++++++++++++++----- 8 files changed, 137 insertions(+), 54 deletions(-) create mode 100644 CPPLINT.cfg create mode 100644 project/tests/4.txt create mode 100644 project/tests/5.txt diff --git a/.travis.yml b/.travis.yml index bb3495a..b4146cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ script: - cd build - cmake .. - make clean && make - - cppcheck ../include/*.h ../src/*.c + - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - valgrind --leak-check=full ./test.out ../db.txt ../find.txt < ../find.txt - cd tests diff --git a/CPPLINT.cfg b/CPPLINT.cfg new file mode 100644 index 0000000..55446fa --- /dev/null +++ b/CPPLINT.cfg @@ -0,0 +1,4 @@ +filter=-legal/copyright +filter=-build/include_subdir +filter=-build/include +filter=-readability/casting \ No newline at end of file diff --git a/project/include/cars.h b/project/include/cars.h index 61a3a0c..d46b5ca 100644 --- a/project/include/cars.h +++ b/project/include/cars.h @@ -14,7 +14,9 @@ #include #include +// define buffer size #define SIZE_BUF 40 +#define SCAN_FORMAT "%39s" typedef struct { float engine_power; @@ -31,14 +33,15 @@ int read_car_instance(FILE* db_ptr, car *car_read); int print_car_instance(const car* car_print); float comparison(const car* car_1, const car* car_2); int free_car(car* car_1); -int copy_car(car* car_destination, car* src); +int copy_car(car* dest, car* src); +int search_in_base(car* input_car, car* found_car, FILE* db); int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]); int min_of_3(int i, int i1, int i2); int car_nullptr(car* car_1); float string_distance(const char* a, const char* b); float distance_fl(float a, float b); - +int error_out(int err_code); #endif // PROJECT_CARS_H // NOLINT diff --git a/project/src/cars.c b/project/src/cars.c index b136ceb..d3187f4 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -23,7 +23,7 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { if (*string_in_car != NULL) if (strlen(*string_in_car) != 0) free(*string_in_car); - *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); //NOLINT + *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); if (*string_in_car != NULL) { // was a check on <0 here, but is eliminated due to constraints: // SIZE_BUF always fits, and char* has no way of encoding error @@ -38,10 +38,10 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { int read_car_instance(FILE* db_ptr, car *car_read) { if (db_ptr != NULL && car_read != NULL) { char read_buffer[5][SIZE_BUF]= {"", "", "", "", ""}; - if (fscanf(db_ptr, "%35s%35s%35s%35s%35s", read_buffer[0], - read_buffer[1], read_buffer[2], read_buffer[3], - read_buffer[4]) !=5 ) { - return INCORRECT_ENTRY; + for (int i = 0; i < 5; i++) { + if (fscanf(db_ptr, SCAN_FORMAT, read_buffer[i]) != 1) { + return INCORRECT_ENTRY; + } } if (strtof(read_buffer[0], NULL) > 0 && strtof(read_buffer[1], NULL) > 0 && strtof(read_buffer[2], NULL) > 0) { @@ -105,7 +105,7 @@ float string_distance(const char* a, const char* b) { matrix[x][y] = min_of_3(matrix[x - 1][y] + 1, matrix[x][y - 1] + 1, matrix[x - 1][y - 1] + (a[y - 1] == b[x - 1] ? 0 : 1)); - return 1-((float)matrix[len_b][len_a])/len_a; //NOLINT + return 1-((float)matrix[len_b][len_a])/len_a; } // min_of_3 of 3 for levenshtein @@ -138,11 +138,17 @@ float comparison(const car* car_1, const car* car_2) { int free_car(car* car_1) { if (car_1 != NULL) { if (car_1->body_type != NULL) - if (strlen(car_1->body_type) != 0) + if (strlen(car_1->body_type) != 0) { free(car_1->body_type); + car_1->body_type = NULL; + } + if (car_1->model_name != NULL) - if (strlen(car_1->model_name) != 0) + if (strlen(car_1->model_name) != 0) { free(car_1->model_name); + car_1->model_name = NULL; + } + return 0; } return NULLPTR_EX; @@ -156,9 +162,9 @@ int copy_car(car* dest, car* src) { dest->fuel_consumption = src->fuel_consumption; dest->engine_power = src->engine_power; dest->maximum_velocity = src->maximum_velocity; - car_nullptr(dest); - allocate_string(&dest->model_name, src->model_name); - allocate_string(&dest->body_type, src->body_type); + if (allocate_string(&dest->model_name, src->model_name) + || allocate_string(&dest->body_type, src->body_type)) + return ALLOCATE_ERROR; return 0; } @@ -169,4 +175,50 @@ int car_nullptr(car* car_1) { return 0; } +int error_out(int err_code) { + switch (err_code) { + case 1: + printf("%s", "NULL POINTER!"); + return 1; + case 2: + printf("%s", "INCORRECT INPUT"); + return 2; + case 3: + printf("%s", "ALLOCATION FAULT"); + return 3; + case 4: + printf("%s", "INCORRECT OUTPUT"); + return 4; + } + return 0; +} + +int search_in_base(car* input_car, car* found_car, FILE* db) { + int return_code = 0; + car* comparison_car = (car*)malloc(sizeof(car)); + if (comparison_car == NULL) { + return ALLOCATE_ERROR; + } + car_nullptr(comparison_car); + float max_equality; + while (return_code == 0) { + return_code = read_car_instance(db, comparison_car); + if (return_code <= 0) { + if (max_equality < comparison(input_car, comparison_car)) { + max_equality = comparison(input_car, comparison_car); + if (copy_car(found_car, comparison_car) == 0) { + if (max_equality == 5) { + break; + } + } else { + return_code = ALLOCATE_ERROR; + break; + } + } + } + } + free_car(comparison_car); + free(comparison_car); + return return_code; +} diff --git a/project/src/main.c b/project/src/main.c index 233c916..5313ff1 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -7,21 +7,17 @@ int main(int argc, char *argv[]) { if (argc != 3) { return INCORRECT_ENTRY; } - car* input_car = (car*)malloc(sizeof(car)); //NOLINT - car* comparison_car = (car*)malloc(sizeof(car)); //NOLINT - car* found_car = (car*)malloc(sizeof(car)); //NOLINT + car* input_car = (car*)malloc(sizeof(car)); + car* found_car = (car*)malloc(sizeof(car)); FILE* db = NULL, * search = NULL; int return_code = 0; while (true) { - // Allocation fault check - if (input_car == NULL || comparison_car == NULL || found_car == NULL) { + // проверка аллокации + if (input_car == NULL || found_car == NULL) { return_code = ALLOCATE_ERROR; } if (return_code !=0) break; - car_nullptr(input_car); - car_nullptr(comparison_car); - car_nullptr(found_car); // open fault check if (open_car_database(&db, argv[1]) != 0 || @@ -34,7 +30,7 @@ int main(int argc, char *argv[]) { // write to file for search char read_buffer[SIZE_BUF]; for (int i = 0; i < 5; i++) { - if (scanf("%35s", read_buffer) != 1) { + if (scanf(SCAN_FORMAT , read_buffer) != 1) { return_code = INCORRECT_ENTRY; } else { fputs(read_buffer, search); @@ -45,39 +41,24 @@ int main(int argc, char *argv[]) { rewind(search); if (return_code !=0) break; + // search itself - float max_equality = 0; - if (read_car_instance(search, input_car) <= 0) { - while (return_code == 0) { - return_code = read_car_instance(db, comparison_car); - if (return_code <= 0) { - if (max_equality < comparison(input_car, comparison_car)) { - max_equality = comparison(input_car, comparison_car); - if (copy_car(found_car, comparison_car) == 0) { - if (max_equality == 5) { - break; - } - } else { - // break of alloc error - break; - } - } - } - } - } + return_code = read_car_instance(search, input_car); + if (return_code != 0) + break; + return_code = search_in_base(input_car,found_car,db); if (return_code <= 0) { print_car_instance(found_car); return_code = 0; } break; } + // free all the memory + error_out(return_code); free_car(found_car); - free_car(comparison_car); free_car(input_car); if (input_car != NULL) free(input_car); - if (comparison_car != NULL) - free(comparison_car); if (found_car != NULL) free(found_car); if (db != NULL) diff --git a/project/tests/4.txt b/project/tests/4.txt new file mode 100644 index 0000000..fad55b7 --- /dev/null +++ b/project/tests/4.txt @@ -0,0 +1,2 @@ +100 200 2 Renault_Logan Jeep +150 200 2 Renault_Logan Jeep \ No newline at end of file diff --git a/project/tests/5.txt b/project/tests/5.txt new file mode 100644 index 0000000..8c6400f --- /dev/null +++ b/project/tests/5.txt @@ -0,0 +1 @@ +150 200 2 Renault_Logan Jeeps \ No newline at end of file diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index 5c6aeb8..50a80da 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -31,7 +31,7 @@ TEST(allocate_string, ok) { char buffer[SIZE_BUF] = "test_string"; char **allocated_string = nullptr; EXPECT_EQ(allocate_string(allocated_string, buffer), NULLPTR_EX); - allocated_string = (char**) malloc(sizeof(char*)); // NOLINT + allocated_string = (char**) malloc(sizeof(char*)); *allocated_string = nullptr; EXPECT_EQ(allocate_string(allocated_string, buffer), 0); free(*allocated_string); @@ -67,13 +67,13 @@ TEST(car_nullptr, ok) { } TEST(copy_car, not_ok) { - car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; car* newcar = nullptr; EXPECT_EQ(copy_car(newcar, &car_a), NULLPTR_EX); } TEST(copy_car, ok) { - car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; car newcar = {200, 0, 2, nullptr, nullptr}; EXPECT_EQ(copy_car(&newcar, &car_a), 0); ASSERT_EQ(newcar.fuel_consumption, car_a.fuel_consumption); @@ -85,10 +85,10 @@ TEST(copy_car, ok) { } TEST(comparison, ok) { - car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT - car car_b = {100, 0, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT - car car_c = {100, 0, 0, (char*)"Toyota", (char*)"Sedan"}; // NOLINT - car car_d = {0, 0, 0, (char*)"Renaul", (char*)"Coupe"}; // NOLINT + car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; + car car_b = {100, 0, 1, (char*)"Toyota", (char*)"Sedan"}; + car car_c = {100, 0, 0, (char*)"Toyota", (char*)"Sedan"}; + car car_d = {0, 0, 0, (char*)"Renaul", (char*)"Coupe"}; EXPECT_EQ(comparison(&car_a, &car_a), 5); EXPECT_EQ(comparison(&car_a, &car_b), 4); EXPECT_EQ(comparison(&car_a, &car_c), 3); @@ -96,7 +96,7 @@ TEST(comparison, ok) { } TEST(print_car_instance, ok) { - car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; // NOLINT + car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; ASSERT_EQ(print_car_instance(&car_a), 0); } @@ -104,7 +104,7 @@ TEST(read_car_instance, ok) { FILE* file = nullptr; car car_1 = {100, 100, 0, NULL, NULL}; ASSERT_EQ(read_car_instance(file, &car_1), NULLPTR_EX); - open_car_database(&file, "../../find.txt"); + open_car_database(&file, "../../tests/5.txt"); ASSERT_EQ(read_car_instance(file, &car_1), EOF_REACHED); fclose(file); open_car_database(&file, "../../db.txt"); @@ -143,5 +143,45 @@ TEST(read_car_instance, not_ok_3) { free_car(&car_1); } +TEST(errprint, ok) { + ASSERT_EQ(error_out(1), 1); + ASSERT_EQ(error_out(2), 2); + ASSERT_EQ(error_out(3), 3); + ASSERT_EQ(error_out(4), 4); + ASSERT_EQ(error_out(-1), 0); +} + +TEST(search_test, ok) { + car* input_car = (car*)malloc(sizeof(car)); + car* found_car = (car*)malloc(sizeof(car)); + car_nullptr(input_car); + car_nullptr(found_car); + FILE* input = fopen("../../tests/4.txt", "r"); + FILE* db = fopen("../../db.txt", "r"); + read_car_instance(input, input_car); + search_in_base(input_car, found_car, db); + ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); + ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); + ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); + ASSERT_STREQ(found_car->body_type, input_car->body_type); + ASSERT_STREQ(found_car->model_name, input_car->model_name); + free_car(input_car); + fclose(db); + db = fopen("../../db.txt", "r"); + read_car_instance(input, input_car); + search_in_base(input_car, found_car, db); + ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); + ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); + ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); + ASSERT_STREQ(found_car->body_type, input_car->body_type); + ASSERT_STREQ(found_car->model_name, input_car->model_name); + free_car(input_car); + free_car(found_car); + free(input_car); + free(found_car); + fclose(input); + fclose(db); +} + From 2a8e204bc9ca14285f99b89cd0c94ceef50860c9 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 16:19:16 +0300 Subject: [PATCH 38/56] static complete --- project/src/cars.c | 8 ++++---- project/src/main.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/project/src/cars.c b/project/src/cars.c index d3187f4..69cd9d8 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -137,18 +137,18 @@ float comparison(const car* car_1, const car* car_2) { // free car strings int free_car(car* car_1) { if (car_1 != NULL) { - if (car_1->body_type != NULL) + if (car_1->body_type != NULL) { if (strlen(car_1->body_type) != 0) { free(car_1->body_type); car_1->body_type = NULL; } - - if (car_1->model_name != NULL) + } + if (car_1->model_name != NULL) { if (strlen(car_1->model_name) != 0) { free(car_1->model_name); car_1->model_name = NULL; } - + } return 0; } return NULLPTR_EX; diff --git a/project/src/main.c b/project/src/main.c index 5313ff1..e9e8cc0 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -46,7 +46,7 @@ int main(int argc, char *argv[]) { return_code = read_car_instance(search, input_car); if (return_code != 0) break; - return_code = search_in_base(input_car,found_car,db); + return_code = search_in_base(input_car, found_car, db); if (return_code <= 0) { print_car_instance(found_car); return_code = 0; From bd2c90bcd118726c31961ddffd916bb9c37bd763 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 16:27:46 +0300 Subject: [PATCH 39/56] valgrind is fun --- project/src/cars.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/project/src/cars.c b/project/src/cars.c index 69cd9d8..e1eb599 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -14,15 +14,14 @@ int open_car_database(FILE** db_ptr, const char* basename) { } int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { - if (string_in_car == NULL) { + if (!string_in_car) { return NULLPTR_EX; } if (buffer_value[0] == '\0') { return INCORRECT_ENTRY; } - if (*string_in_car != NULL) - if (strlen(*string_in_car) != 0) - free(*string_in_car); + if (*string_in_car) + free(*string_in_car); *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); if (*string_in_car != NULL) { // was a check on <0 here, but is eliminated due to constraints: @@ -137,17 +136,13 @@ float comparison(const car* car_1, const car* car_2) { // free car strings int free_car(car* car_1) { if (car_1 != NULL) { - if (car_1->body_type != NULL) { - if (strlen(car_1->body_type) != 0) { - free(car_1->body_type); - car_1->body_type = NULL; - } + if (car_1->body_type) { + free(car_1->body_type); + car_1->body_type = NULL; } - if (car_1->model_name != NULL) { - if (strlen(car_1->model_name) != 0) { - free(car_1->model_name); - car_1->model_name = NULL; - } + if (car_1->model_name) { + free(car_1->model_name); + car_1->model_name = NULL; } return 0; } From 2fb0d496fe8bf77a43c3b2902f33a9159b67e2cd Mon Sep 17 00:00:00 2001 From: BorisKoz <55689768+BorisKoz@users.noreply.github.com> Date: Thu, 11 Mar 2021 16:32:54 +0300 Subject: [PATCH 40/56] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b4146cb..ab64e50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - valgrind --leak-check=full ./test.out ../db.txt ../find.txt < ../find.txt + - valgrind --leak-check=full --track-origins=yes ./test.out ../db.txt ../find.txt < ../find.txt - cd tests - valgrind --leak-check=full --track-origins=yes ./cars_tests From 381fbc5573b06ccb298f3578ac1c4e5fd795d680 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 16:41:05 +0300 Subject: [PATCH 41/56] valgrind is so FUN --- project/src/cars.c | 2 +- project/src/main.c | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/project/src/cars.c b/project/src/cars.c index e1eb599..2aaee0b 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -23,7 +23,7 @@ int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { if (*string_in_car) free(*string_in_car); *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); - if (*string_in_car != NULL) { + if (*string_in_car) { // was a check on <0 here, but is eliminated due to constraints: // SIZE_BUF always fits, and char* has no way of encoding error snprintf(*string_in_car, SIZE_BUF, "%s", buffer_value); diff --git a/project/src/main.c b/project/src/main.c index e9e8cc0..03c3856 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -9,6 +9,7 @@ int main(int argc, char *argv[]) { } car* input_car = (car*)malloc(sizeof(car)); car* found_car = (car*)malloc(sizeof(car)); + FILE* db = NULL, * search = NULL; int return_code = 0; while (true) { @@ -18,7 +19,8 @@ int main(int argc, char *argv[]) { } if (return_code !=0) break; - + car_nullptr(input_car); + car_nullptr(found_car); // open fault check if (open_car_database(&db, argv[1]) != 0 || open_car_database(&search, argv[2]) != 0) { @@ -57,13 +59,13 @@ int main(int argc, char *argv[]) { error_out(return_code); free_car(found_car); free_car(input_car); - if (input_car != NULL) + if (input_car ) free(input_car); - if (found_car != NULL) + if (found_car) free(found_car); - if (db != NULL) + if (db) fclose(db); - if (search != NULL) + if (search ) fclose(search); return return_code; } From 3f4db2a167fbf99f8a9bab2ce5e9e2267cac1e73 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 16:54:28 +0300 Subject: [PATCH 42/56] found uninitialised float --- .travis.yml.swp | Bin 0 -> 12288 bytes project/find.txt | 2 +- project/src/cars.c | 2 +- project/src/main.c | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 .travis.yml.swp diff --git a/.travis.yml.swp b/.travis.yml.swp new file mode 100644 index 0000000000000000000000000000000000000000..c08152309d3fa888ee1b6adbee1ed0af32994c0b GIT binary patch literal 12288 zcmeI2J#Q2-5QZIU2ncG>5Tu9?t@m;?(UNN-8jyl$5+s_#=k?v0-K;I!drBxm1HT|Z z%MYQ07HWim7ATRRMKE4&#X%ra=pv1!SL?B7#xu`ub2<+?8`sugnRgkE6O4U3ef`d} z_q%N45@Q47v@guP+L^ff&#@-tsxd`!)0t#7#_-ZeQSR~InMs&lRlW$uror}QzuW09 zr93z>!Qk!9y`g(@(E<@50tX;ahhefjzka#9)QM5&7S6({lj{daK(0i92oM1xKm>>Y z5g-CYfCwCR0>RF)``E;hX(MN*&$&OIQE$S8OCF%w0DQX9G8+8Shp}HtQ&7;20 zGxizv8ubu$1N8~dd4qa_dW?F6+C@D;#Tss*Xb=G+Km>>Y5g-CYfCvx)B0vNV4*|fD zz(Dvhtels%Dwa~Nh~q}LOL zrmDoCR6Wr&UW#f|i;?OzY5sn|G~=cy6i8%O!QvuBt39gO;k-3-7}UDV+pr?n?za`h zXq~yMWJsBpPTPR532-Ff>)e3V7VtHMSRpnPyPw?_HY6hzW?h<2_w|W=?&r{c9c+3q kRwT`))unP7jHG1D_zbX=dW*3ZS_ZhDYacQgHh1)Y06CZvxBvhE literal 0 HcmV?d00001 diff --git a/project/find.txt b/project/find.txt index bea7afc..8d1a19e 100644 --- a/project/find.txt +++ b/project/find.txt @@ -1 +1 @@ -100 100 1 Toyota Sedan \ No newline at end of file +100 100 1 Toyota Sedanva \ No newline at end of file diff --git a/project/src/cars.c b/project/src/cars.c index 2aaee0b..34f783f 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -195,7 +195,7 @@ int search_in_base(car* input_car, car* found_car, FILE* db) { return ALLOCATE_ERROR; } car_nullptr(comparison_car); - float max_equality; + float max_equality = 0; while (return_code == 0) { return_code = read_car_instance(db, comparison_car); if (return_code <= 0) { diff --git a/project/src/main.c b/project/src/main.c index 03c3856..3c58ed7 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) { free(found_car); if (db) fclose(db); - if (search ) + if (search) fclose(search); return return_code; } From fa5ee891e7af626e4473b2b4fc6973eb8365d79a Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 16:55:38 +0300 Subject: [PATCH 43/56] found uninitialised float --- .travis.yml | 2 +- .travis.yml.swp | Bin 12288 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 .travis.yml.swp diff --git a/.travis.yml b/.travis.yml index ab64e50..3114871 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - valgrind --leak-check=full --track-origins=yes ./test.out ../db.txt ../find.txt < ../find.txt +zsh:1: command not found: q - cd tests - valgrind --leak-check=full --track-origins=yes ./cars_tests diff --git a/.travis.yml.swp b/.travis.yml.swp deleted file mode 100644 index c08152309d3fa888ee1b6adbee1ed0af32994c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2J#Q2-5QZIU2ncG>5Tu9?t@m;?(UNN-8jyl$5+s_#=k?v0-K;I!drBxm1HT|Z z%MYQ07HWim7ATRRMKE4&#X%ra=pv1!SL?B7#xu`ub2<+?8`sugnRgkE6O4U3ef`d} z_q%N45@Q47v@guP+L^ff&#@-tsxd`!)0t#7#_-ZeQSR~InMs&lRlW$uror}QzuW09 zr93z>!Qk!9y`g(@(E<@50tX;ahhefjzka#9)QM5&7S6({lj{daK(0i92oM1xKm>>Y z5g-CYfCwCR0>RF)``E;hX(MN*&$&OIQE$S8OCF%w0DQX9G8+8Shp}HtQ&7;20 zGxizv8ubu$1N8~dd4qa_dW?F6+C@D;#Tss*Xb=G+Km>>Y5g-CYfCvx)B0vNV4*|fD zz(Dvhtels%Dwa~Nh~q}LOL zrmDoCR6Wr&UW#f|i;?OzY5sn|G~=cy6i8%O!QvuBt39gO;k-3-7}UDV+pr?n?za`h zXq~yMWJsBpPTPR532-Ff>)e3V7VtHMSRpnPyPw?_HY6hzW?h<2_w|W=?&r{c9c+3q kRwT`))unP7jHG1D_zbX=dW*3ZS_ZhDYacQgHh1)Y06CZvxBvhE From 4bf2d118a8b108ade95ac9770db3dda2abe5292f Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 16:58:54 +0300 Subject: [PATCH 44/56] vagrind for the win --- project/src/cars.c | 1 + 1 file changed, 1 insertion(+) diff --git a/project/src/cars.c b/project/src/cars.c index 34f783f..60ff986 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -217,3 +217,4 @@ int search_in_base(car* input_car, car* found_car, FILE* db) { return return_code; } + From 6ec3e6dd96b343c1cce38db3e3a129d968e2898c Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 17:01:44 +0300 Subject: [PATCH 45/56] fixed travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3114871..c28ea8b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp -zsh:1: command not found: q + - valgrind --leak-check=full --track-origin=yes ./test.out ../db.txt ../find.txt < ../find.txt - cd tests - valgrind --leak-check=full --track-origins=yes ./cars_tests From 46109a81e95d462ad51f83629349f7f61af8801e Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 17:06:13 +0300 Subject: [PATCH 46/56] fixed travis again --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c28ea8b..ab64e50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - valgrind --leak-check=full --track-origin=yes ./test.out ../db.txt ../find.txt < ../find.txt + - valgrind --leak-check=full --track-origins=yes ./test.out ../db.txt ../find.txt < ../find.txt - cd tests - valgrind --leak-check=full --track-origins=yes ./cars_tests From 3673d777b3ce92adf71a11a5b6663d15d0b7379d Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 17:13:25 +0300 Subject: [PATCH 47/56] until I understand how to < with valgr in is 255, so removed --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ab64e50..b93b766 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - valgrind --leak-check=full --track-origins=yes ./test.out ../db.txt ../find.txt < ../find.txt + - ./test.out ../db.txt ../find.txt < ../find.txt - cd tests - valgrind --leak-check=full --track-origins=yes ./cars_tests From da8519b703b496c595a1f17bf5b7b61fcef43f90 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Thu, 11 Mar 2021 17:24:00 +0300 Subject: [PATCH 48/56] 255 was because of code error, lol. remade --- .travis.yml | 2 +- project/find.txt | 2 +- project/src/main.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b93b766..ab64e50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - ./test.out ../db.txt ../find.txt < ../find.txt + - valgrind --leak-check=full --track-origins=yes ./test.out ../db.txt ../find.txt < ../find.txt - cd tests - valgrind --leak-check=full --track-origins=yes ./cars_tests diff --git a/project/find.txt b/project/find.txt index 8d1a19e..bea7afc 100644 --- a/project/find.txt +++ b/project/find.txt @@ -1 +1 @@ -100 100 1 Toyota Sedanva \ No newline at end of file +100 100 1 Toyota Sedan \ No newline at end of file diff --git a/project/src/main.c b/project/src/main.c index 3c58ed7..3f0ffe4 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -46,7 +46,7 @@ int main(int argc, char *argv[]) { // search itself return_code = read_car_instance(search, input_car); - if (return_code != 0) + if (return_code > 0) break; return_code = search_in_base(input_car, found_car, db); if (return_code <= 0) { From 474e7e9f16ab7c194864808483a9bac9759823c1 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Tue, 16 Mar 2021 19:54:38 +0300 Subject: [PATCH 49/56] fixed almost all. to travis --- .codecov.yml | 5 ++ project/CMakeLists.txt | 7 +- project/find.txt | 2 +- project/include/cars.h | 11 ++-- project/src/cars.c | 141 +++++++++++++++++------------------------ project/src/main.c | 53 ++++++++-------- project/tests/cars.cpp | 85 ++++++++++++++----------- 7 files changed, 146 insertions(+), 158 deletions(-) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000..926aa8c --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,5 @@ +coverage: + status: + patch: + default: + target:80% diff --git a/project/CMakeLists.txt b/project/CMakeLists.txt index 5645120..f1877d3 100644 --- a/project/CMakeLists.txt +++ b/project/CMakeLists.txt @@ -16,8 +16,11 @@ add_subdirectory(tests) include_directories("${PROJECT_SOURCE_DIR}/include") + file(GLOB sources "${PROJECT_SOURCE_DIR}/include/*.h" - "${PROJECT_SOURCE_DIR}/src/*.c") + "${PROJECT_SOURCE_DIR}/src/cars.c" + "${PROJECT_SOURCE_DIR}/src/main.c") -add_executable(test.out ${sources}) \ No newline at end of file +add_executable(test.out ${sources}) +add_executable(main.out ${sources}) \ No newline at end of file diff --git a/project/find.txt b/project/find.txt index bea7afc..7e2ab0a 100644 --- a/project/find.txt +++ b/project/find.txt @@ -1 +1 @@ -100 100 1 Toyota Sedan \ No newline at end of file +100 100 1 Toyota_Camry Sedan \ No newline at end of file diff --git a/project/include/cars.h b/project/include/cars.h index d46b5ca..09c5604 100644 --- a/project/include/cars.h +++ b/project/include/cars.h @@ -1,5 +1,8 @@ // Copyright 2021 +#include +#include + #ifndef PROJECT_CARS_H // NOLINT #define PROJECT_CARS_H // NOLINT @@ -9,10 +12,8 @@ #define ALLOCATE_ERROR 3 #define OUTPUT_ERROR 4 // define finish read signal -#define EOF_REACHED -1 - -#include -#include +#define EOF_REACHED (-1) +#define PARAM_NUMBER 5 // define buffer size #define SIZE_BUF 40 @@ -36,9 +37,7 @@ int free_car(car* car_1); int copy_car(car* dest, car* src); int search_in_base(car* input_car, car* found_car, FILE* db); -int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]); int min_of_3(int i, int i1, int i2); -int car_nullptr(car* car_1); float string_distance(const char* a, const char* b); float distance_fl(float a, float b); int error_out(int err_code); diff --git a/project/src/cars.c b/project/src/cars.c index 60ff986..3ebc00c 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -5,34 +5,17 @@ // open database file. check if not null. int open_car_database(FILE** db_ptr, const char* basename) { + if (!db_ptr) { + return NULLPTR_EX; + } *db_ptr = fopen(basename, "r+"); if (*db_ptr == NULL) { - printf("Could not open file %s\n", basename); + fprintf(stderr, "Could not open file %s\n", basename); return NULLPTR_EX; } return 0; } -int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { - if (!string_in_car) { - return NULLPTR_EX; - } - if (buffer_value[0] == '\0') { - return INCORRECT_ENTRY; - } - if (*string_in_car) - free(*string_in_car); - *string_in_car = (char*)malloc((strlen(buffer_value) + 1) * sizeof(char)); - if (*string_in_car) { - // was a check on <0 here, but is eliminated due to constraints: - // SIZE_BUF always fits, and char* has no way of encoding error - snprintf(*string_in_car, SIZE_BUF, "%s", buffer_value); - return 0; - } - // not reached by codecov cuz it allocs - return ALLOCATE_ERROR; -} - // read next car instance from base. int read_car_instance(FILE* db_ptr, car *car_read) { if (db_ptr != NULL && car_read != NULL) { @@ -42,19 +25,22 @@ int read_car_instance(FILE* db_ptr, car *car_read) { return INCORRECT_ENTRY; } } - if (strtof(read_buffer[0], NULL) > 0 && strtof(read_buffer[1], NULL) > 0 - && strtof(read_buffer[2], NULL) > 0) { - car_read->engine_power = strtof(read_buffer[0], NULL); - car_read->maximum_velocity = strtof(read_buffer[1], NULL); - car_read->fuel_consumption = strtof(read_buffer[2], NULL); - } else { + car_read->engine_power = strtof(read_buffer[0], NULL); + car_read->maximum_velocity = strtof(read_buffer[1], NULL); + car_read->fuel_consumption = strtof(read_buffer[2], NULL); + if (car_read->engine_power <= 0 || car_read->maximum_velocity <= 0 + || car_read->fuel_consumption <= 0) { return INCORRECT_ENTRY; } - - if (allocate_string(&car_read->model_name, read_buffer[3]) != 0 - || allocate_string(&car_read->body_type, read_buffer[4]) != 0) - // not reaching cuz it allocates + car_read->model_name = strdup(read_buffer[3]); + if (!car_read->model_name) { + return ALLOCATE_ERROR; + } + car_read->body_type = strdup(read_buffer[4]); + if (!car_read->body_type) { + free(car_read->model_name); return ALLOCATE_ERROR; + } if (feof(db_ptr)) { return EOF_REACHED; } @@ -74,26 +60,17 @@ int print_car_instance(const car* car_print) { } // float comparison in division. the closer they are, -// the more return approaches 0 +// the more return approaches 1 float distance_fl(float a, float b) { - if (a > b) - return b/a; - else - return a/b; + return (a > b ? b / a : a / b); } // levenshtein distance in c algorithm float string_distance(const char* a, const char* b) { - size_t x, y, len_a, len_b; - len_a = strlen(a); - len_b = strlen(b); - int matrix[len_b + 1][len_a + 1]; + size_t x = 0, y = 0, len_a = strlen(a), len_b = strlen(b); + int matrix[SIZE_BUF + 1][SIZE_BUF + 1]; // matrix initializer - for (x = 0; x <= len_b; x++) { - for (y = 0; y <= len_a; y++) { - matrix[x][y] = 0; - } - } + memset(matrix, 0, sizeof(matrix)); matrix[0][0] = 0; for (x = 1; x <= len_b; x++) matrix[x][0] = matrix[x-1][0]+1; @@ -108,18 +85,11 @@ float string_distance(const char* a, const char* b) { } // min_of_3 of 3 for levenshtein +int min(int a, int b) { + return (a < b ? a : b); +} int min_of_3(int i, int i1, int i2) { - if (i < i1) { - if (i < i2) { - return i; - } else { - return i2; - } - } - if (i2 < i1) { - return i2; - } - return i1; + return min(i, min(i1, i2)); } // comparison of 2 cars. returns 5 if completely equal @@ -151,68 +121,71 @@ int free_car(car* car_1) { // copy existing car instance int copy_car(car* dest, car* src) { - if (dest == NULL) + if (!dest || !src) { return NULLPTR_EX; + } free_car(dest); dest->fuel_consumption = src->fuel_consumption; dest->engine_power = src->engine_power; dest->maximum_velocity = src->maximum_velocity; - if (allocate_string(&dest->model_name, src->model_name) - || allocate_string(&dest->body_type, src->body_type)) + dest->model_name = strdup(src->model_name); + if (!dest->model_name) { + return ALLOCATE_ERROR; + } + dest->body_type = strdup(src->body_type); + if (!dest->body_type) { + free(dest->model_name); return ALLOCATE_ERROR; + } return 0; } -int car_nullptr(car* car_1) { - car_1->body_type = NULL; - car_1->model_name = NULL; - return 0; -} - int error_out(int err_code) { switch (err_code) { case 1: - printf("%s", "NULL POINTER!"); + fprintf(stderr, "%s", "NULL POINTER!"); return 1; case 2: - printf("%s", "INCORRECT INPUT"); + fprintf(stderr, "%s", "INCORRECT INPUT"); return 2; case 3: - printf("%s", "ALLOCATION FAULT"); + fprintf(stderr, "%s", "ALLOCATION FAULT"); return 3; case 4: - printf("%s", "INCORRECT OUTPUT"); + fprintf(stderr, "%s", "INCORRECT OUTPUT"); return 4; + default: + return 0; } - return 0; } int search_in_base(car* input_car, car* found_car, FILE* db) { int return_code = 0; - car* comparison_car = (car*)malloc(sizeof(car)); + car* comparison_car = (car*)calloc(1, sizeof(car)); if (comparison_car == NULL) { return ALLOCATE_ERROR; } - car_nullptr(comparison_car); float max_equality = 0; while (return_code == 0) { return_code = read_car_instance(db, comparison_car); - if (return_code <= 0) { - if (max_equality < comparison(input_car, comparison_car)) { - max_equality = comparison(input_car, comparison_car); - if (copy_car(found_car, comparison_car) == 0) { - if (max_equality == 5) { - break; - } - } else { - return_code = ALLOCATE_ERROR; - break; - } + if (return_code > 0) { + return ALLOCATE_ERROR; + } + float current_equality = comparison(input_car, comparison_car); + if (max_equality < current_equality) { + max_equality = current_equality; + if (copy_car(found_car, comparison_car) != 0) { + return_code = ALLOCATE_ERROR; + free_car(comparison_car); + break; } } + if (max_equality == 5) { + break; + } + free_car(comparison_car); } - free_car(comparison_car); free(comparison_car); return return_code; } diff --git a/project/src/main.c b/project/src/main.c index 3f0ffe4..e3f9838 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -3,46 +3,45 @@ #include #include "../include/cars.h" + + int main(int argc, char *argv[]) { if (argc != 3) { return INCORRECT_ENTRY; } - car* input_car = (car*)malloc(sizeof(car)); - car* found_car = (car*)malloc(sizeof(car)); - + car* input_car = (car*)calloc(1, sizeof(car)); + if (!input_car) { + return ALLOCATE_ERROR; + } + car* found_car = (car*)calloc(1, sizeof(car)); + if (!found_car) { + free(input_car); + return ALLOCATE_ERROR; + } FILE* db = NULL, * search = NULL; int return_code = 0; - while (true) { - // проверка аллокации - if (input_car == NULL || found_car == NULL) { - return_code = ALLOCATE_ERROR; - } - if (return_code !=0) - break; - car_nullptr(input_car); - car_nullptr(found_car); + while(true) { // open fault check if (open_car_database(&db, argv[1]) != 0 || open_car_database(&search, argv[2]) != 0) { - return_code = ALLOCATE_ERROR; - } - if (return_code !=0) + error_out(ALLOCATE_ERROR); break; + } // write to file for search - char read_buffer[SIZE_BUF]; - for (int i = 0; i < 5; i++) { + char read_buffer[SIZE_BUF] = {}; + for (int i = 0; i < PARAM_NUMBER; i++) { if (scanf(SCAN_FORMAT , read_buffer) != 1) { - return_code = INCORRECT_ENTRY; + error_out(INCORRECT_ENTRY); + break; } else { fputs(read_buffer, search); - if (i < 4) + if (i < PARAM_NUMBER - 1) { fputs(" ", search); + } } } rewind(search); - if (return_code !=0) - break; // search itself return_code = read_car_instance(search, input_car); @@ -59,13 +58,13 @@ int main(int argc, char *argv[]) { error_out(return_code); free_car(found_car); free_car(input_car); - if (input_car ) - free(input_car); - if (found_car) - free(found_car); - if (db) + free(input_car); + free(found_car); + if (db) { fclose(db); - if (search) + } + if (search) { fclose(search); + } return return_code; } diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index 50a80da..7706ddf 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -1,11 +1,13 @@ // Copyright 2021 - #include "gtest/gtest.h" extern "C" { #include "./cars.h" } +#define TEST_TXT "./test.txt" +#define TEST_DB_TXT "./test_db.txt" + // tests for in-program logic TEST(min, ok) { ASSERT_EQ(min_of_3(1, 2, 3), 1); @@ -27,45 +29,29 @@ TEST(distance, ok) { // tests for memory functions -TEST(allocate_string, ok) { - char buffer[SIZE_BUF] = "test_string"; - char **allocated_string = nullptr; - EXPECT_EQ(allocate_string(allocated_string, buffer), NULLPTR_EX); - allocated_string = (char**) malloc(sizeof(char*)); - *allocated_string = nullptr; - EXPECT_EQ(allocate_string(allocated_string, buffer), 0); - free(*allocated_string); - char buffer2[SIZE_BUF] = ""; - EXPECT_EQ(allocate_string(allocated_string, buffer2), INCORRECT_ENTRY); - free(allocated_string); -} TEST(open_car_database, ok) { FILE* pointer; - EXPECT_EQ(open_car_database(&pointer, "../../db.txt"), 0); + pointer = fopen(TEST_TXT, "a"); + fclose(pointer); + EXPECT_EQ(open_car_database(&pointer, TEST_TXT), 0); fclose(pointer); EXPECT_EQ(open_car_database(&pointer, "search.txt"), NULLPTR_EX); + remove(TEST_TXT); } TEST(free_car, ok) { car* pointer = NULL; car car_a = {100, 100, 1, NULL, NULL}; char buffer[SIZE_BUF] = "test_string"; - allocate_string(&car_a.body_type, buffer); - allocate_string(&car_a.model_name, buffer); + car_a.body_type = strdup(buffer); + car_a.model_name = strdup(buffer); EXPECT_EQ(free_car(pointer), NULLPTR_EX); EXPECT_EQ(free_car(&car_a), 0); } -// as car_nullptr is only called on need of null allocation -// or on already nulled strings it has no memleak -TEST(car_nullptr, ok) { - car car_a = {100, 100, 1, nullptr, nullptr}; - EXPECT_EQ(car_nullptr(&car_a), 0); -} - TEST(copy_car, not_ok) { car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; car* newcar = nullptr; @@ -101,22 +87,31 @@ TEST(print_car_instance, ok) { } TEST(read_car_instance, ok) { - FILE* file = nullptr; + FILE* file = fopen(TEST_TXT, "a"); + fputs("150 200 2 Renault_Logan Jeeps", file); + fclose(file); + file = nullptr; car car_1 = {100, 100, 0, NULL, NULL}; ASSERT_EQ(read_car_instance(file, &car_1), NULLPTR_EX); - open_car_database(&file, "../../tests/5.txt"); + open_car_database(&file, TEST_TXT); ASSERT_EQ(read_car_instance(file, &car_1), EOF_REACHED); fclose(file); - open_car_database(&file, "../../db.txt"); + file = fopen(TEST_TXT, "a"); + fputs("150 200 2 Renault_Logan Jeeps", file); + fclose(file); + open_car_database(&file, TEST_TXT); ASSERT_EQ(read_car_instance(file, &car_1), 0); fclose(file); free_car(&car_1); + remove(TEST_TXT); } TEST(read_car_instance, not_ok_1) { - FILE* file = nullptr; + FILE* file = fopen(TEST_TXT, "a"); + fputs("1 10 a Toyota Sedan", file); + fclose(file); car car_1 = {100, 100, 0, NULL, NULL}; - open_car_database(&file, "../../tests/1.txt"); + open_car_database(&file, TEST_TXT); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); free_car(&car_1); fclose(file); @@ -124,9 +119,12 @@ TEST(read_car_instance, not_ok_1) { } TEST(read_car_instance, not_ok_2) { - FILE* file = nullptr; + FILE* file = fopen(TEST_TXT, "a"); + fputs("1 10 1 Toyota Sedan\n" + "1 10 a Toyota", file); + fclose(file); car car_1 = {100, 100, 0, NULL, NULL}; - open_car_database(&file, "../../tests/2.txt"); + open_car_database(&file, TEST_TXT); read_car_instance(file, &car_1); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); fclose(file); @@ -134,9 +132,12 @@ TEST(read_car_instance, not_ok_2) { } TEST(read_car_instance, not_ok_3) { - FILE* file = nullptr; + FILE* file = fopen(TEST_TXT, "a"); + fputs("1 10 1 Toyota\n" + "1 10 1 Toyota Sedan", file); + fclose(file); car car_1 = {100, 100, 0, NULL, NULL}; - open_car_database(&file, "../../tests/3.txt"); + open_car_database(&file, TEST_TXT); read_car_instance(file, &car_1); ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); fclose(file); @@ -152,12 +153,20 @@ TEST(errprint, ok) { } TEST(search_test, ok) { - car* input_car = (car*)malloc(sizeof(car)); - car* found_car = (car*)malloc(sizeof(car)); - car_nullptr(input_car); - car_nullptr(found_car); - FILE* input = fopen("../../tests/4.txt", "r"); - FILE* db = fopen("../../db.txt", "r"); + FILE* input = fopen(TEST_TXT, "a"); + fputs("100 200 2 Renault_Logan Jeep\n" + "150 200 2 Renault_Logan Jeep", input); + fclose(input); + FILE* db = fopen(TEST_TXT, "a"); + fputs("1150 200 2 Renault_Logan Jeep\n" + "100 100 2 Toyota_Camry Sedan\n" + "100 100 1 Toyota_Camry Sedan\n" + "100 120 2 Renault_Sanderas Sedan", db); + fclose(db); + car* input_car = (car*)calloc(1, sizeof(car)); + car* found_car = (car*)calloc(1, sizeof(car)); + input = fopen("../../tests/4.txt", "r"); + db = fopen("../../db.txt", "r"); read_car_instance(input, input_car); search_in_base(input_car, found_car, db); ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); From aee11c93dadfe0d76026b517414546711002a2bd Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Tue, 16 Mar 2021 20:02:43 +0300 Subject: [PATCH 50/56] fixed minor leak error --- project/src/cars.c | 3 ++- project/src/main.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/project/src/cars.c b/project/src/cars.c index 3ebc00c..3e4ee6b 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -32,6 +32,7 @@ int read_car_instance(FILE* db_ptr, car *car_read) { || car_read->fuel_consumption <= 0) { return INCORRECT_ENTRY; } + free_car(car_read); car_read->model_name = strdup(read_buffer[3]); if (!car_read->model_name) { return ALLOCATE_ERROR; @@ -181,10 +182,10 @@ int search_in_base(car* input_car, car* found_car, FILE* db) { break; } } + free_car(comparison_car); if (max_equality == 5) { break; } - free_car(comparison_car); } free(comparison_car); return return_code; diff --git a/project/src/main.c b/project/src/main.c index e3f9838..daf1d68 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -20,7 +20,7 @@ int main(int argc, char *argv[]) { } FILE* db = NULL, * search = NULL; int return_code = 0; - while(true) { + while (true) { // open fault check if (open_car_database(&db, argv[1]) != 0 || open_car_database(&search, argv[2]) != 0) { From ce3ace4ddbaae2d9789e1c91f4ab30d15b69357b Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Tue, 16 Mar 2021 20:15:53 +0300 Subject: [PATCH 51/56] added all to one Cmake --- .travis.yml | 2 +- project/CMakeLists.txt | 27 +++++++++++++++++++++++---- project/src/main.c | 2 +- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index ab64e50..e50e064 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - valgrind --leak-check=full --track-origins=yes ./test.out ../db.txt ../find.txt < ../find.txt + - valgrind --leak-check=full --track-origins=yes ./main.out ../db.txt ../find.txt < ../find.txt - cd tests - valgrind --leak-check=full --track-origins=yes ./cars_tests diff --git a/project/CMakeLists.txt b/project/CMakeLists.txt index f1877d3..ea2cc09 100644 --- a/project/CMakeLists.txt +++ b/project/CMakeLists.txt @@ -11,16 +11,35 @@ execute_process(COMMAND ${CMAKE_COMMAND} --build . add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src ${CMAKE_BINARY_DIR}/googletest-build) +set(CMAKE_C_FLAGS "-pedantic -fprofile-arcs -ftest-coverage") +set(CMAKE_CXX_FLAGS "-pedantic -fprofile-arcs -ftest-coverage") + enable_testing() -add_subdirectory(tests) + include_directories("${PROJECT_SOURCE_DIR}/include") -file(GLOB sources +file(GLOB prod_sources "${PROJECT_SOURCE_DIR}/include/*.h" "${PROJECT_SOURCE_DIR}/src/cars.c" "${PROJECT_SOURCE_DIR}/src/main.c") -add_executable(test.out ${sources}) -add_executable(main.out ${sources}) \ No newline at end of file +add_executable(main.out ${prod_sources}) + +file(GLOB test_sources "${PROJECT_SOURCE_DIR}/src/*.c") +list(REMOVE_ITEM test_sources "${PROJECT_SOURCE_DIR}/src/main.c") + +file(GLOB tests "${PROJECT_SOURCE_DIR}/tests/*.cpp") +list(REMOVE_ITEM tests "${PROJECT_SOURCE_DIR}/tests/main.cpp") + +foreach(file ${tests}) + set(name) + get_filename_component(name ${file} NAME_WE) + add_executable("${name}_tests" + ${sources} + ${file} + "${PROJECT_SOURCE_DIR}/tests/main.cpp") + target_link_libraries("${name}_tests" gtest_main) + add_test(NAME ${name} COMMAND "${name}_tests") +endforeach() \ No newline at end of file diff --git a/project/src/main.c b/project/src/main.c index daf1d68..8558108 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -29,7 +29,7 @@ int main(int argc, char *argv[]) { } // write to file for search - char read_buffer[SIZE_BUF] = {}; + char read_buffer[SIZE_BUF] = {""}; for (int i = 0; i < PARAM_NUMBER; i++) { if (scanf(SCAN_FORMAT , read_buffer) != 1) { error_out(INCORRECT_ENTRY); From 2796675ee8db3cf36964b3422c5e547b8a7a97d8 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Tue, 16 Mar 2021 20:17:10 +0300 Subject: [PATCH 52/56] error in Cmake fixed --- project/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/CMakeLists.txt b/project/CMakeLists.txt index ea2cc09..2a3c999 100644 --- a/project/CMakeLists.txt +++ b/project/CMakeLists.txt @@ -37,7 +37,7 @@ foreach(file ${tests}) set(name) get_filename_component(name ${file} NAME_WE) add_executable("${name}_tests" - ${sources} + ${test_sources} ${file} "${PROJECT_SOURCE_DIR}/tests/main.cpp") target_link_libraries("${name}_tests" gtest_main) From d7d9f887bf60944a2916f149306b75850b19e42d Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Tue, 16 Mar 2021 20:37:05 +0300 Subject: [PATCH 53/56] fixed vg, added logic to diff header --- .travis.yml | 3 +-- project/include/cars.h | 5 +---- project/include/cars_logic.h | 10 ++++++++++ project/src/cars.c | 9 +++++---- project/tests/cars.cpp | 16 +++++++++++----- 5 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 project/include/cars_logic.h diff --git a/.travis.yml b/.travis.yml index e50e064..5c0aef7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,8 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - valgrind --leak-check=full --track-origins=yes ./main.out ../db.txt ../find.txt < ../find.txt - - cd tests + - valgrind --leak-check=full --track-origins=yes ./main.out ../db.txt ../find.txt < ../find.txt` - valgrind --leak-check=full --track-origins=yes ./cars_tests diff --git a/project/include/cars.h b/project/include/cars.h index 09c5604..67053af 100644 --- a/project/include/cars.h +++ b/project/include/cars.h @@ -36,11 +36,8 @@ float comparison(const car* car_1, const car* car_2); int free_car(car* car_1); int copy_car(car* dest, car* src); int search_in_base(car* input_car, car* found_car, FILE* db); - -int min_of_3(int i, int i1, int i2); -float string_distance(const char* a, const char* b); -float distance_fl(float a, float b); int error_out(int err_code); + #endif // PROJECT_CARS_H // NOLINT diff --git a/project/include/cars_logic.h b/project/include/cars_logic.h new file mode 100644 index 0000000..7608592 --- /dev/null +++ b/project/include/cars_logic.h @@ -0,0 +1,10 @@ +// Copyright 2021 + +#ifndef PROJECT_INCLUDE_CARS_LOGIC_H_ +#define PROJECT_INCLUDE_CARS_LOGIC_H_ + +int min_of_3(int i, int i1, int i2); +float string_distance(const char* a, const char* b); +float distance_fl(float a, float b); + +#endif // CARS_CARS_LOGIC_H diff --git a/project/src/cars.c b/project/src/cars.c index 3e4ee6b..c3af0b5 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -1,6 +1,7 @@ // Copyright 2021 #include "../include/cars.h" +#include "../include/cars_logic.h" #include // open database file. check if not null. @@ -145,16 +146,16 @@ int copy_car(car* dest, car* src) { int error_out(int err_code) { switch (err_code) { case 1: - fprintf(stderr, "%s", "NULL POINTER!"); + fprintf(stderr, "%s", "NULL POINTER!\n"); return 1; case 2: - fprintf(stderr, "%s", "INCORRECT INPUT"); + fprintf(stderr, "%s", "INCORRECT INPUT\n"); return 2; case 3: - fprintf(stderr, "%s", "ALLOCATION FAULT"); + fprintf(stderr, "%s", "ALLOCATION FAULT\n"); return 3; case 4: - fprintf(stderr, "%s", "INCORRECT OUTPUT"); + fprintf(stderr, "%s", "INCORRECT OUTPUT\n"); return 4; default: return 0; diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index 7706ddf..fcb40bd 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -3,6 +3,7 @@ extern "C" { #include "./cars.h" +#include "./cars_logic.h" } #define TEST_TXT "./test.txt" @@ -116,6 +117,7 @@ TEST(read_car_instance, not_ok_1) { free_car(&car_1); fclose(file); free_car(&car_1); + remove(TEST_TXT); } TEST(read_car_instance, not_ok_2) { @@ -129,6 +131,7 @@ TEST(read_car_instance, not_ok_2) { ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); fclose(file); free_car(&car_1); + remove(TEST_TXT); } TEST(read_car_instance, not_ok_3) { @@ -142,6 +145,7 @@ TEST(read_car_instance, not_ok_3) { ASSERT_EQ(read_car_instance(file, &car_1), INCORRECT_ENTRY); fclose(file); free_car(&car_1); + remove(TEST_TXT); } TEST(errprint, ok) { @@ -157,16 +161,16 @@ TEST(search_test, ok) { fputs("100 200 2 Renault_Logan Jeep\n" "150 200 2 Renault_Logan Jeep", input); fclose(input); - FILE* db = fopen(TEST_TXT, "a"); - fputs("1150 200 2 Renault_Logan Jeep\n" + FILE* db = fopen(TEST_DB_TXT, "a"); + fputs("150 200 2 Renault_Logan Jeep\n" "100 100 2 Toyota_Camry Sedan\n" "100 100 1 Toyota_Camry Sedan\n" "100 120 2 Renault_Sanderas Sedan", db); fclose(db); car* input_car = (car*)calloc(1, sizeof(car)); car* found_car = (car*)calloc(1, sizeof(car)); - input = fopen("../../tests/4.txt", "r"); - db = fopen("../../db.txt", "r"); + input = fopen(TEST_TXT, "r"); + db = fopen(TEST_DB_TXT, "r"); read_car_instance(input, input_car); search_in_base(input_car, found_car, db); ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); @@ -176,7 +180,7 @@ TEST(search_test, ok) { ASSERT_STREQ(found_car->model_name, input_car->model_name); free_car(input_car); fclose(db); - db = fopen("../../db.txt", "r"); + db = fopen(TEST_DB_TXT, "r"); read_car_instance(input, input_car); search_in_base(input_car, found_car, db); ASSERT_EQ(found_car->fuel_consumption, input_car->fuel_consumption); @@ -190,6 +194,8 @@ TEST(search_test, ok) { free(found_car); fclose(input); fclose(db); + remove(TEST_TXT); + remove(TEST_DB_TXT); } From 64d6400542551162c1dd7e49c8329d0e4989f388 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Tue, 16 Mar 2021 20:42:33 +0300 Subject: [PATCH 54/56] fixed travis misspell and cpplint --- .travis.yml | 2 +- project/include/cars_logic.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5c0aef7..5b268ab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ script: - make clean && make - cppcheck --inconclusive --enable=all --language=c ../include/*.h ../src/*.c - cpplint ../include/*.h ../src/*.c ../tests/*.cpp - - valgrind --leak-check=full --track-origins=yes ./main.out ../db.txt ../find.txt < ../find.txt` + - valgrind --leak-check=full --track-origins=yes ./main.out ../db.txt ../find.txt < ../find.txt - valgrind --leak-check=full --track-origins=yes ./cars_tests diff --git a/project/include/cars_logic.h b/project/include/cars_logic.h index 7608592..ff71fca 100644 --- a/project/include/cars_logic.h +++ b/project/include/cars_logic.h @@ -7,4 +7,4 @@ int min_of_3(int i, int i1, int i2); float string_distance(const char* a, const char* b); float distance_fl(float a, float b); -#endif // CARS_CARS_LOGIC_H +#endif // PROJECT_INCLUDE_CARS_LOGIC_H_ \ No newline at end of file From bcb8566896967eda5694a20d6d7e78391b4d953e Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Tue, 16 Mar 2021 20:46:23 +0300 Subject: [PATCH 55/56] fixed newline --- project/include/cars_logic.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/include/cars_logic.h b/project/include/cars_logic.h index ff71fca..a1ff65e 100644 --- a/project/include/cars_logic.h +++ b/project/include/cars_logic.h @@ -7,4 +7,4 @@ int min_of_3(int i, int i1, int i2); float string_distance(const char* a, const char* b); float distance_fl(float a, float b); -#endif // PROJECT_INCLUDE_CARS_LOGIC_H_ \ No newline at end of file +#endif // PROJECT_INCLUDE_CARS_LOGIC_H_ From f90f31c69dca2607d4fd45dbabe70cf757ff8676 Mon Sep 17 00:00:00 2001 From: Kozhuro Date: Wed, 17 Mar 2021 15:01:44 +0300 Subject: [PATCH 56/56] fix to new reviews --- project/include/cars.h | 11 +++++++++-- project/src/cars.c | 39 +++++++++++++++++++++------------------ project/src/main.c | 3 +-- project/tests/cars.cpp | 35 ++++++++++++++++++----------------- 4 files changed, 49 insertions(+), 39 deletions(-) diff --git a/project/include/cars.h b/project/include/cars.h index 67053af..939496d 100644 --- a/project/include/cars.h +++ b/project/include/cars.h @@ -11,7 +11,7 @@ #define INCORRECT_ENTRY 2 #define ALLOCATE_ERROR 3 #define OUTPUT_ERROR 4 -// define finish read signal +// define logic #define EOF_REACHED (-1) #define PARAM_NUMBER 5 @@ -19,12 +19,19 @@ #define SIZE_BUF 40 #define SCAN_FORMAT "%39s" +// define parameter indexes in array +#define ENGINE_POW 0 +#define MAX_V 1 +#define FUEL 2 +#define MODEL_NAME 3 +#define BODY_TYPE 4 + typedef struct { float engine_power; float maximum_velocity; float fuel_consumption; - char* body_type; char* model_name; + char* body_type; } car; diff --git a/project/src/cars.c b/project/src/cars.c index c3af0b5..55ed6fe 100644 --- a/project/src/cars.c +++ b/project/src/cars.c @@ -1,7 +1,7 @@ // Copyright 2021 -#include "../include/cars.h" -#include "../include/cars_logic.h" +#include "cars.h" +#include "cars_logic.h" #include // open database file. check if not null. @@ -20,25 +20,25 @@ int open_car_database(FILE** db_ptr, const char* basename) { // read next car instance from base. int read_car_instance(FILE* db_ptr, car *car_read) { if (db_ptr != NULL && car_read != NULL) { - char read_buffer[5][SIZE_BUF]= {"", "", "", "", ""}; - for (int i = 0; i < 5; i++) { + char read_buffer[PARAM_NUMBER][SIZE_BUF]= {"", "", "", "", ""}; + for (int i = 0; i < PARAM_NUMBER; i++) { if (fscanf(db_ptr, SCAN_FORMAT, read_buffer[i]) != 1) { return INCORRECT_ENTRY; } } - car_read->engine_power = strtof(read_buffer[0], NULL); - car_read->maximum_velocity = strtof(read_buffer[1], NULL); - car_read->fuel_consumption = strtof(read_buffer[2], NULL); + car_read->engine_power = strtof(read_buffer[ENGINE_POW], NULL); + car_read->maximum_velocity = strtof(read_buffer[MAX_V], NULL); + car_read->fuel_consumption = strtof(read_buffer[FUEL], NULL); if (car_read->engine_power <= 0 || car_read->maximum_velocity <= 0 || car_read->fuel_consumption <= 0) { return INCORRECT_ENTRY; } free_car(car_read); - car_read->model_name = strdup(read_buffer[3]); + car_read->model_name = strdup(read_buffer[MODEL_NAME]); if (!car_read->model_name) { return ALLOCATE_ERROR; } - car_read->body_type = strdup(read_buffer[4]); + car_read->body_type = strdup(read_buffer[BODY_TYPE]); if (!car_read->body_type) { free(car_read->model_name); return ALLOCATE_ERROR; @@ -69,6 +69,9 @@ float distance_fl(float a, float b) { // levenshtein distance in c algorithm float string_distance(const char* a, const char* b) { + if (!a || !b) { + return 0; + } size_t x = 0, y = 0, len_a = strlen(a), len_b = strlen(b); int matrix[SIZE_BUF + 1][SIZE_BUF + 1]; // matrix initializer @@ -145,18 +148,18 @@ int copy_car(car* dest, car* src) { int error_out(int err_code) { switch (err_code) { - case 1: + case NULLPTR_EX: fprintf(stderr, "%s", "NULL POINTER!\n"); - return 1; - case 2: + return NULLPTR_EX; + case INCORRECT_ENTRY: fprintf(stderr, "%s", "INCORRECT INPUT\n"); - return 2; - case 3: + return INCORRECT_ENTRY; + case ALLOCATE_ERROR: fprintf(stderr, "%s", "ALLOCATION FAULT\n"); - return 3; - case 4: + return ALLOCATE_ERROR; + case OUTPUT_ERROR: fprintf(stderr, "%s", "INCORRECT OUTPUT\n"); - return 4; + return OUTPUT_ERROR; default: return 0; } @@ -184,7 +187,7 @@ int search_in_base(car* input_car, car* found_car, FILE* db) { } } free_car(comparison_car); - if (max_equality == 5) { + if (max_equality == PARAM_NUMBER) { break; } } diff --git a/project/src/main.c b/project/src/main.c index 8558108..2dcd31e 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -1,8 +1,7 @@ // Copyright 2021 #include #include -#include "../include/cars.h" - +#include "cars.h" int main(int argc, char *argv[]) { diff --git a/project/tests/cars.cpp b/project/tests/cars.cpp index fcb40bd..4e4ebe4 100644 --- a/project/tests/cars.cpp +++ b/project/tests/cars.cpp @@ -2,15 +2,15 @@ #include "gtest/gtest.h" extern "C" { -#include "./cars.h" -#include "./cars_logic.h" +#include "cars.h" +#include "cars_logic.h" } #define TEST_TXT "./test.txt" #define TEST_DB_TXT "./test_db.txt" // tests for in-program logic -TEST(min, ok) { +TEST(min_of_3, correct_minimum) { ASSERT_EQ(min_of_3(1, 2, 3), 1); ASSERT_EQ(min_of_3(1, 3, 2), 1); ASSERT_EQ(min_of_3(2, 1, 3), 1); @@ -18,12 +18,13 @@ TEST(min, ok) { ASSERT_EQ(min_of_3(2, 3, 1), 1); ASSERT_EQ(min_of_3(3, 2, 1), 1); } -TEST(Levenstein, ok) { +TEST(string_distance, correct_levenstein_distance) { EXPECT_EQ(string_distance("Toyota", "Toyota"), 1); EXPECT_EQ(string_distance("Toyota", "Toy"), 0.5); EXPECT_EQ(string_distance("Toyota", "Renaul"), 0); + EXPECT_EQ(string_distance("Toyota", nullptr), 0); } -TEST(distance, ok) { +TEST(distance_fl, correct_division) { EXPECT_EQ(distance_fl(1, 2), 0.5); EXPECT_EQ(distance_fl(4, 1), 0.25); } @@ -31,7 +32,7 @@ TEST(distance, ok) { // tests for memory functions -TEST(open_car_database, ok) { +TEST(open_car_database, db_is_opened_correctly) { FILE* pointer; pointer = fopen(TEST_TXT, "a"); fclose(pointer); @@ -41,7 +42,7 @@ TEST(open_car_database, ok) { remove(TEST_TXT); } -TEST(free_car, ok) { +TEST(free_car, memory_is_freed_correctly) { car* pointer = NULL; car car_a = {100, 100, 1, NULL, NULL}; char buffer[SIZE_BUF] = "test_string"; @@ -53,13 +54,13 @@ TEST(free_car, ok) { -TEST(copy_car, not_ok) { +TEST(copy_car, stop_copy_if_null) { car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; car* newcar = nullptr; EXPECT_EQ(copy_car(newcar, &car_a), NULLPTR_EX); } -TEST(copy_car, ok) { +TEST(copy_car, copy_is_correct) { car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; car newcar = {200, 0, 2, nullptr, nullptr}; EXPECT_EQ(copy_car(&newcar, &car_a), 0); @@ -71,7 +72,7 @@ TEST(copy_car, ok) { free_car(&newcar); } -TEST(comparison, ok) { +TEST(comparison, comparison_is_correct) { car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; car car_b = {100, 0, 1, (char*)"Toyota", (char*)"Sedan"}; car car_c = {100, 0, 0, (char*)"Toyota", (char*)"Sedan"}; @@ -82,12 +83,12 @@ TEST(comparison, ok) { EXPECT_EQ(comparison(&car_a, &car_d), 0); } -TEST(print_car_instance, ok) { +TEST(print_car_instance, prints_a_car) { car car_a = {100, 100, 1, (char*)"Toyota", (char*)"Sedan"}; ASSERT_EQ(print_car_instance(&car_a), 0); } -TEST(read_car_instance, ok) { +TEST(read_car_instance, reads_correctly) { FILE* file = fopen(TEST_TXT, "a"); fputs("150 200 2 Renault_Logan Jeeps", file); fclose(file); @@ -107,7 +108,7 @@ TEST(read_car_instance, ok) { remove(TEST_TXT); } -TEST(read_car_instance, not_ok_1) { +TEST(read_car_instance, incorrect_solo_entry) { FILE* file = fopen(TEST_TXT, "a"); fputs("1 10 a Toyota Sedan", file); fclose(file); @@ -120,7 +121,7 @@ TEST(read_car_instance, not_ok_1) { remove(TEST_TXT); } -TEST(read_car_instance, not_ok_2) { +TEST(read_car_instance, incorrect_multiple_entry) { FILE* file = fopen(TEST_TXT, "a"); fputs("1 10 1 Toyota Sedan\n" "1 10 a Toyota", file); @@ -134,7 +135,7 @@ TEST(read_car_instance, not_ok_2) { remove(TEST_TXT); } -TEST(read_car_instance, not_ok_3) { +TEST(read_car_instance, incorrect_multiple_entry_2) { FILE* file = fopen(TEST_TXT, "a"); fputs("1 10 1 Toyota\n" "1 10 1 Toyota Sedan", file); @@ -148,7 +149,7 @@ TEST(read_car_instance, not_ok_3) { remove(TEST_TXT); } -TEST(errprint, ok) { +TEST(errprint, prints_errors) { ASSERT_EQ(error_out(1), 1); ASSERT_EQ(error_out(2), 2); ASSERT_EQ(error_out(3), 3); @@ -156,7 +157,7 @@ TEST(errprint, ok) { ASSERT_EQ(error_out(-1), 0); } -TEST(search_test, ok) { +TEST(search_test, searches_for_cars) { FILE* input = fopen(TEST_TXT, "a"); fputs("100 200 2 Renault_Logan Jeep\n" "150 200 2 Renault_Logan Jeep", input);