Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
61d3e7d
Added .DS_Store to .gitignore
Oct 10, 2020
eace29b
updated gitignore
Oct 10, 2020
43ff072
Updated gitignore:
Oct 10, 2020
e195f9d
Initial project version
Oct 10, 2020
3808cc8
Updated project structure
Oct 11, 2020
16a4f8b
Tag name parsing addded
Oct 11, 2020
77b78bb
Updated ci
Oct 11, 2020
50993ff
Updated cmake version
Oct 11, 2020
f90e1d0
Added gtest initial
Oct 11, 2020
bf48262
Working attribute parser
Oct 12, 2020
77746ba
Updated ci script
Oct 12, 2020
9d5dd77
Updated cmakelists
Oct 12, 2020
d2128ad
update cmakelists
Oct 12, 2020
6e06807
updated build line
Oct 12, 2020
3d72a0b
update tests
Oct 12, 2020
fb52795
Added README.MD
Oct 13, 2020
83faa0a
Added correct tests for html_tag{:
Oct 13, 2020
96563d8
updated tests
Oct 13, 2020
5deef8a
tag parsing version added
Oct 13, 2020
9852dfe
Updated free function
Oct 13, 2020
52faee6
Updated tests
Oct 13, 2020
f71c01d
updated travis
Oct 13, 2020
b3d2cf2
updated travis
Oct 14, 2020
1154cdf
updated travis
Oct 14, 2020
5cc797f
updated travis
Oct 14, 2020
95809d1
reverted travis
Oct 14, 2020
49f8e62
Updated memcheck tests
Oct 14, 2020
e58bc21
Updated travis for memcheck
Oct 14, 2020
0a64c16
Updated travis
Oct 14, 2020
a055d85
updated travis
Oct 14, 2020
2438f8f
Added main app code
Oct 14, 2020
0f03d45
Added cppcheck
Oct 14, 2020
bee60d6
updated travis
Oct 14, 2020
efc3cf2
updated travis
Oct 14, 2020
3ad95c0
correct cppcheck for travis
Oct 14, 2020
a97c2e6
updated travis for cppcheck
Oct 14, 2020
908a5f8
updated travis
Oct 15, 2020
e63c6a2
Updated CmakeLIsts for gcov
Oct 15, 2020
9f0afab
added gcovr to tests
Oct 15, 2020
c5ed055
updated travis for gcovr
Oct 15, 2020
be08ddd
updated travis for gcovr
Oct 15, 2020
964d0b1
updated travis for gcov
Oct 15, 2020
f8c099b
updated travis for gcov
Oct 15, 2020
839dfbe
Solved pull request problems
Oct 15, 2020
141de92
removed commented code
Oct 15, 2020
1e80a5c
added nullptr check
Oct 15, 2020
c54493a
added parentheses
Oct 15, 2020
f053596
corrected funcion exit
Oct 15, 2020
0d4bc0d
check_attr_format refactor
Oct 15, 2020
6bcff01
solved pr problems
Oct 15, 2020
427f216
added nullptr checks
Oct 15, 2020
11df4ae
Added iz2 readme
Oct 23, 2020
2acf4ba
removed old things
Oct 23, 2020
3f5293b
Added initial project version
Oct 23, 2020
9ffc469
updated readme
Oct 23, 2020
65ee540
moodfinder template
Oct 24, 2020
1ad3609
updated .gitignore
Oct 27, 2020
e2ce8e9
Single process version + tests
Oct 27, 2020
be5966c
singleprocess working"
Oct 29, 2020
f68802c
updated travis
Oct 29, 2020
12f4198
updated travis
Oct 29, 2020
204e2ff
updated profiling
Oct 29, 2020
3f2650a
corrected memory error
Oct 29, 2020
38a41df
corrected cppcheck
Oct 29, 2020
9320a69
corrected cppcheck
Oct 29, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,9 @@
*.exe
*.out
*.app

# Macos things
*.DS_Store
*.idea/
*cmake-build*

38 changes: 38 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
language: cpp
os: linux
dist: xenial
compiler: gcc


before_script:
- cd iz2
- mkdir build
- cd build

jobs:
#
# Valgrind
#
- os: linux
env:
- TEST="Valgrind"
addons:
apt:
packages:
- valgrind
script:
- cmake ..
- make
- ctest -T memcheck

#
# CppCheck
#
- os: linux
env:
- TEST="CppCheck"

script:
- cmake -DENABLE_CPPCHECK=ON ..
- make
- make check
47 changes: 47 additions & 0 deletions iz2/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
cmake_minimum_required(VERSION 3.1)

project(iz1 C CXX)

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 17)
#
### GCOV
#

if (ENABLE_GCOV)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftest-coverage -fprofile-arcs")
endif ()


include(configure_test.cmake)
add_subdirectory(test)

if (ENABLE_CPPCHECK)
include(configure_cppcheck.cmake)
endif ()

##
### Source definitions ###
##

set(libmoodfinder_s_sources
${PROJECT_SOURCE_DIR}/include/moodfinder.h
${PROJECT_SOURCE_DIR}/include/moodfinder_errors.h
${PROJECT_SOURCE_DIR}/src/moodfinder_s.c
)


include_directories("${PROJECT_SOURCE_DIR}/include")

add_library(libmoodfinder_s STATIC ${libmoodfinder_s_sources})

set(main_sources
${PROJECT_SOURCE_DIR}/src/main.c
${PROJECT_SOURCE_DIR}/src/moodfinder_profiler.c
${PROJECT_SOURCE_DIR}/include/moodfinder_profile.h
)

add_executable(main ${main_sources})
target_link_libraries(main libmoodfinder_s)


29 changes: 29 additions & 0 deletions iz2/README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Вариант #23
Сравните и выведите в консоль время работы последовательного и параллельного с использованием нескольких процессов
алгоритмов, каждый из которых выделяет в динамической памяти символьный массив размером 100 Мб и,
рассматривая его содержимое как абстрактную переписку, определяет эмоциональную окраску последней. Переписка считается
оптимистичной, если диграфов :) в ней больше, чем диграфов :(; в противном случае переписка признается пессимистичной.

Результаты замеров
```
100000 chars : 0.000568 seconds
600000 chars : 0.003453 seconds
1100000 chars : 0.005946 seconds
1600000 chars : 0.008527 seconds
2100000 chars : 0.011032 seconds
2600000 chars : 0.013986 seconds
3100000 chars : 0.016421 seconds
3600000 chars : 0.018687 seconds
4100000 chars : 0.021882 seconds
4600000 chars : 0.023492 seconds
5100000 chars : 0.026175 seconds
5600000 chars : 0.029254 seconds
6100000 chars : 0.031903 seconds
6600000 chars : 0.034180 seconds
7100000 chars : 0.036982 seconds
7600000 chars : 0.039288 seconds
8100000 chars : 0.042387 seconds
8600000 chars : 0.045159 seconds
9100000 chars : 0.048569 seconds
9600000 chars : 0.050803 seconds
```
39 changes: 39 additions & 0 deletions iz2/configure_cppcheck.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
##
### Cppcheck
##

list(APPEND CPPCHECK_CMAKE_ARGS
"-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}"
)
include(ExternalProject)
ExternalProject_Add(
cppcheck
GIT_REPOSITORY https://github.com/danmar/cppcheck.git
GIT_TAG 1.79
GIT_SHALLOW 1
CMAKE_ARGS ${CPPCHECK_CMAKE_ARGS}
PREFIX ${CMAKE_BINARY_DIR}/external/cppcheck/prefix
TMP_DIR ${CMAKE_BINARY_DIR}/external/cppcheck/tmp
STAMP_DIR ${CMAKE_BINARY_DIR}/external/cppcheck/stamp
DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/external/cppcheck/download
SOURCE_DIR ${CMAKE_BINARY_DIR}/external/cppcheck/src
BINARY_DIR ${CMAKE_BINARY_DIR}/external/cppcheck/build
)

list(APPEND CPPCHECK_ARGS
--enable=warning,style,performance,portability,unusedFunction
--std=c99
--verbose
--error-exitcode=1
--language=c
-DMAIN=main
-I ${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/include/*.h
${CMAKE_SOURCE_DIR}/src/*.c
)

add_custom_target(
check
COMMAND ${CMAKE_BINARY_DIR}/bin/cppcheck ${CPPCHECK_ARGS}
COMMENT "running cppcheck"
)
26 changes: 26 additions & 0 deletions iz2/configure_test.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
##
### Valgrind
##

set(MEMORYCHECK_COMMAND_OPTIONS "${MEMORYCHECK_COMMAND_OPTIONS} --leak-check=full")
set(MEMORYCHECK_COMMAND_OPTIONS "${MEMORYCHECK_COMMAND_OPTIONS} --track-fds=yes")
set(MEMORYCHECK_COMMAND_OPTIONS "${MEMORYCHECK_COMMAND_OPTIONS} --trace-children=yes")
set(MEMORYCHECK_COMMAND_OPTIONS "${MEMORYCHECK_COMMAND_OPTIONS} --error-exitcode=1")

##
### Test definitions ###
##
include(CTest)

configure_file(install_gtest.cmake
googletest-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download)
execute_process(COMMAND ${CMAKE_COMMAND} --build .
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download)

add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src
${CMAKE_BINARY_DIR}/googletest-build)

enable_testing()

1 change: 1 addition & 0 deletions iz2/examples/clear_negative.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(
1 change: 1 addition & 0 deletions iz2/examples/clear_positive.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:):):):):):):):):):):):):):):):):):):):)
1 change: 1 addition & 0 deletions iz2/examples/dirty_negative.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
bpserqn:(grlbmyauwo:(flvvyw:(dt:(gtroemwi:(yflxrv:(vr:(nbaqwvbbxd:(:(fet:(zincficm:(rgozemxfw:(cwof:(rxrm:(zont:(gtufqcw:(:(ynydxbpox:(dmbjefj:(hwovhqxh:(
1 change: 1 addition & 0 deletions iz2/examples/dirty_positive.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
liaki:)bcnq:)uwh:)qnexbr:):)cxojtrerwb:)dj:)leag:)iw:)qlwstugh:)shjckmyao:)ssjhbxqd:)zcpihlvf:)ipfjwra:)f:)is:)tyx:):)tqfhe:)lkpixd:)
Empty file added iz2/examples/empty.txt
Empty file.
1 change: 1 addition & 0 deletions iz2/examples/neutral.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:)hfc:(:)viexcm:(:):(:)veux:(:)xyomlgochx:(:)hkewbzhym:(:):(:)llu:(:):(:)wrrtzwhqgm:(:)qyxgxhesw:(:):(:)bdbhvwizxw:(:)ugfosxx:(:)oxs:(:)uwbfjeor:(:)kunsgh:(:)jpat:(:)f:(:)zqgotu:(:)skirkrregh:(:)mqo:(:)giuex:(:)uoz:(:)unedk:(:)ummgxloei:(:)pfvzxogd:(:)oottuozmew:(:)yadwlltyv:(:)ai:(:)zcvgdvou:(:)pw:(:)ww:(:)ptlrtm:(:)skdyh:(:)tovzyh:(:)ssgdchl:(:)tqqmkzd:(:)jdo:(:)qbfgusxuvk:(:):(:)pyo:(:)hnt:(:)dxkpznror:(:)iotfc:(:):(:)akyyyf:(:)oow:(:)guthbyfy:(:)yfxckx:(:)aqoorhxlvx:(:)jtikbnbnvd:(:)psffqnyiq:(:)vvcs:(:)eteraparaa:(:)jtxfwq:(:):(:)s:(:)ueciggoy:(:)wrwjmoda:(:):(:)sdsejmg:(:)yxotncs:(:)ddkjgb:(:)fn:(:)acjh:(:)toim:(:)swtu:(:)tglz:(:)mglvoj:(:)w:(:)htllhw:(:)sazwfryjew:(:)xbwaiz:(:)ofullgdip:(:)gkfgccf:(:)ejdptbb:(:)exqucqrrn:(:)sh:(:)sdcjuww:(:)nnffdp:(:):(:)qky:(:)qajnys:(:)qbntjbm:(:):(:)iutbwcaec:(:)zitjp:(:)bmsgjyfmo:(:)uizgq:(:)rasrxet:(:)ruy:(:):(:)gczhefir:(:)mwnhxkzxvj:(:)eb:(:)icw:(:)bdlnlbz:(:)wzyr:(:)kzvuwpu:(
11 changes: 11 additions & 0 deletions iz2/examples/script.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import string
import random

file = open('neutral.txt', 'w')
letters = string.ascii_lowercase
count = 100
for _ in range(count):
file.write(':)')
file.write(''.join([letters[random.randint(0, len(letters) - 1)] for i in range(random.randint(0, 10))]))
file.write(':(')
file.close()
5 changes: 5 additions & 0 deletions iz2/include/moodfinder.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#define POSITIVE 0
#define NEGATIVE 1
#define NEUTRAL 2

int find_mood(const char *filename);
3 changes: 3 additions & 0 deletions iz2/include/moodfinder_errors.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#define EMPTY_FILE_ERROR -2
#define FILE_NOT_EXIST_ERROR -1
#define MMAP_FAILED -3
10 changes: 10 additions & 0 deletions iz2/include/moodfinder_profile.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#ifndef IZ1_MOODFINDER_PROFILE_H
#define IZ1_MOODFINDER_PROFILE_H

void generate_file(const char *filename, int status, int size);

double profile_on_file(const char *filename, int count);

void profile_app(int start_size, int end_size, int step);

#endif //IZ1_MOODFINDER_PROFILE_H
17 changes: 17 additions & 0 deletions iz2/install_gtest.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
cmake_minimum_required(VERSION 3.1)

project(extern-download NONE)


include(ExternalProject)
ExternalProject_Add(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-1.8.1
SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src"
BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
)
14 changes: 14 additions & 0 deletions iz2/src/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
Сравните и выведите в консоль время работы последовательного и параллельного с использованием
нескольких процессов алгоритмов, каждый из которых выделяет в динамической памяти символьный
массив размером 100 Мб и, рассматривая его содержимое как абстрактную переписку, определяет
эмоциональную окраску последней. Переписка считается оптимистичной, если диграфов :) в ней
больше, чем диграфов :(; в противном случае переписка признается пессимистичной.
*/
#include <moodfinder_profile.h>

int main()
{
profile_app(100000, 10000000, 500000);
return 0;
}
53 changes: 53 additions & 0 deletions iz2/src/moodfinder_profiler.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#include "moodfinder_profile.h"

#include "moodfinder.h"
#include "moodfinder_errors.h"

#include <stdio.h>
#include <time.h>

void generate_file(const char *filename, int status, int size)
{
FILE *f = fopen(filename, "w");
if (!f)
return;
char c = (char)(status == NEGATIVE ? '(' : ')');
if (status == NEUTRAL)
{
size /= 2;
for (int i = 0; i < size; ++i)
fputs(":(", f);
}
for (int i = 0; i < size; ++i)
fprintf(f, ":%c", c);
fclose(f);
}


double profile_on_file(const char *filename, int count)
{
struct timespec start, finish;
double mean_time = 0;

for (int i = 0; i < count; ++i)
{
clock_gettime(CLOCK_MONOTONIC, &start);
find_mood(filename);
clock_gettime(CLOCK_MONOTONIC, &finish);
double elapsed = (double) (finish.tv_sec - start.tv_sec) + (double)(finish.tv_nsec - start.tv_nsec) / 1000000000.0;
mean_time += elapsed / (double)count;
}
return mean_time;
}

void profile_app(int start_size, int end_size, int step)
{
const char filename[] = "f.txt";
for (int size = start_size; size <= end_size; size += step)
{
generate_file(filename, NEUTRAL, size);
double res = profile_on_file(filename, 10);
printf("%d chars : %lf seconds\n", size, res);
}
}

40 changes: 40 additions & 0 deletions iz2/src/moodfinder_s.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include "moodfinder.h"
#include "moodfinder_errors.h"

#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>


int find_mood(const char *filename)
{
int fd = open(filename, O_RDONLY);
if (fd == -1)
return FILE_NOT_EXIST_ERROR;
struct stat st;
stat(filename, &st);
size_t file_size = st.st_size;
char *region = mmap(NULL,
file_size,
PROT_READ,
(unsigned) MAP_SHARED | (unsigned) MAP_POPULATE,
fd,
0);
if (region == MAP_FAILED)
{
close(fd);
if (file_size == 0)
return EMPTY_FILE_ERROR;
return MMAP_FAILED;
}
long long mood = 0;
for (size_t i = 0; i < file_size - 1; ++i)
{
if (region[i] == ':')
mood += (region[i + 1] == ')') + -1 * (region[i + 1] == '(');
}
munmap(region, file_size);
close(fd);
return mood > 0 ? POSITIVE : (mood == 0 ? NEUTRAL : NEGATIVE);
}
26 changes: 26 additions & 0 deletions iz2/test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
include_directories("${PROJECT_SOURCE_DIR}/include")

file(GLOB tests "${PROJECT_SOURCE_DIR}/test/*.cpp")
list(REMOVE_ITEM tests "${PROJECT_SOURCE_DIR}/test/main.cpp")

if (ENABLE_GCOV)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftest-coverage -fprofile-arcs")
endif ()


foreach (file ${tests})
set(name)
get_filename_component(name ${file} NAME_WE)
add_executable("${name}_tests"
${file}
"${PROJECT_SOURCE_DIR}/test/main.cpp"
)
target_link_libraries("${name}_tests"
libmoodfinder_s
gtest_main
)
add_test(NAME ${name}
COMMAND "${name}_tests"
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
)
endforeach ()
Loading