Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 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
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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,8 @@
*.exe
*.out
*.app

# Macos things
*.DS_Store
*.idea/
*cmake-build-debug
57 changes: 57 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
language: cpp
os: linux
dist: xenial
compiler: gcc


before_script:
- cd iz1
- 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

#
# Coverage
#
# - os: linux
# env:
# - TEST="GCovr"
# addons:
# apt:
# packages:
# - gcov
# before_script:
# - pip3 install gcovr
# script:
# - cmake -DENABLE_GCOV
# - make
# - ctest
# - cd .. && gcovr

104 changes: 104 additions & 0 deletions iz1/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
cmake_minimum_required(VERSION 3.1)

project(iz1 C CXX)

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

#
### GCOV
#

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


##
### 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(CMakeLists.txt.in
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()
add_subdirectory(test)


##
### Cppecheck
##

if (ENABLE_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"
)

endif ()

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


include_directories("${PROJECT_SOURCE_DIR}/include")

file(GLOB sources
"${PROJECT_SOURCE_DIR}/include/html_tag/*.h"
"${PROJECT_SOURCE_DIR}/include/my_str/*.h"
"${PROJECT_SOURCE_DIR}/src/*.c")

add_executable(iz1 ${sources})
17 changes: 17 additions & 0 deletions iz1/CMakeLists.txt.in
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 ""
)
20 changes: 20 additions & 0 deletions iz1/README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Индивидуальное задание 1

ИЗ1 посвящено приобретению навыков безопасной работы с памятью на языке C с использованием базовых структур данных и налаживания базовой инфраструктуры для автоматической проверки кода. В качестве результата ИЗ2 ожидается:
* грамотное разбиение проекта на файлы;
* использование безопасного стиля программирования - проверка возможных ошибок, корректное завершение программы в случае их возникновения и правильная работа с памятью;
* максимальное покрытие кода юнит-тестами;
* рабочий CI, включающего в себя автоматическую сборку проекта, статический анализ кода, прохождение линтеров, valgrind, запуск юнит-тестов и получение отчёта о покрытии кода тестами
* все автоматические проверки должны проходить на итоговой версии, которая проходит ревью
Вариант #23
Создать структуру для хранения информации об HTML-теге: его имени, признаке «открывающий/закрывающий» и атрибутах тега. Составить с ее использованием программу, включающую в себя функцию, принимающую на вход текстовую строку с одним тегом. На выход функция должна возвращать указатель на инициализированную структуру.

Требования к оформлению:
Программа должна быть реализована на языке C и работать для произвольных наборов входных данных (в том числе и ошибочных), вводимых пользователем с клавиатуры. Должна быть выполнена грамотная декомпозиция на функции и файлы.
Помимо самой программы необходимо:
– разработать набор юнит-тестов, проверяющих корректную работу реализованных функций. Обеспечить максимальное покрытие исходного кода тестами;
– оформить задачу в виде Merge Request отдельной ветки в основную ветку проекта.
Внимание: в основной ветке проекта никакого кода быть не должно!
– развернуть CI, в рамках которого автоматизировать сборку проекта, прохождение юнит-тестов под valgrind, генерацию отчёта о покрытии кода тестами, линтера и статического анализатора исходного кода;
– после прохождения всех проверок необходимо отправить код на ревью своему преподавателю;
– ревью - процесс итерационный. До наступления дедлайна можно проходить несколько итераций, улучшая свою оценку. Решения после дедлайна не принимаются;
24 changes: 24 additions & 0 deletions iz1/include/html_tag/attr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef IZ1_ATTR_H
#define IZ1_ATTR_H

#include <stdlib.h>
#include <stdbool.h>

typedef struct
{
char *name;
char *value;
} tag_attr_t;

// Функция проверки аттрибута тега (тег располагается в начале строкии и
// заканчивается либо символом '>', либо пробелом. Конец аттрибута записывается
// в переменную attr_end
bool check_attr_format(const char *str, size_t *attr_end);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

поясни сигнатуру. речь о проверке формата, но при этом есть второй аргумент.
кажется, что для проверки формата достаточно сигнатуры:
bool check_attr_format(const char* ftm);
либо проблема в дизайне, либо явно стоит указать комментарием назначение второго аргумента


tag_attr_t *parse_attr(const char *str, int *attr_end);

tag_attr_t **parse_attr_arr(const char *str, size_t count);

void free_attr(tag_attr_t **attr);

#endif //IZ1_ATTR_H
39 changes: 39 additions & 0 deletions iz1/include/html_tag/html_tag.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Создать структуру для хранения информации об HTML-теге: его имени, признаке «открывающий/закрывающий»
* и атрибутах тега. Составить с ее использованием программу, включающую в себя функцию, принимающую на
* вход текстовую строку с одним тегом. На выход функция должна возвращать указатель на инициализированную структуру.
*
* Примеры тегов
* <a>
* <a href="abc">
* </a>
* <tag_name attribute1=value attribute2=value>
* <tag_name attribute1="value1 value2" attribute2="value3 value4">
* </tag_name>
*/

#ifndef IZ1_HTML_TAG_H
#define IZ1_HTML_TAG_H

#include <stdbool.h>
#include <stdlib.h>

#include "attr.h"

typedef struct
{
char *name;
bool is_opening;
size_t attributes_count;
tag_attr_t **attributes;
} html_tag;

bool check_html_tag_format(const char *str);

html_tag *parse_tag(const char *str);

size_t parse_status(const char *str, html_tag *tag);

void free_tag(html_tag **tag);

#endif //IZ1_HTML_TAG_H
12 changes: 12 additions & 0 deletions iz1/include/my_str/alg.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef IZ1_ALG_H
#define IZ1_ALG_H

#define ASCII_NAME_ALLOWED "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789\"-"

int str_find(const char *str, char c);

int str_first_char_occurence(const char *str, const char *c);

int str_count(const char *str, char c);

#endif //IZ1_ALG_H
12 changes: 12 additions & 0 deletions iz1/include/my_str/mem.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef IZ1_MEM_H
#define IZ1_MEM_H

#include <stdlib.h>
#include <string.h>


size_t str_create_ncopy(char **to_allocate, const char *to_copy, size_t n);

size_t str_create_word(char **to_allocate, const char *src, const char *sep);

#endif //IZ1_MEM_H
34 changes: 34 additions & 0 deletions iz1/src/alg.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "my_str/alg.h"

int str_find(const char *str, char c)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

проверка на nullptr

{
if (!str)
return -1;

int i = 0;
while (str[i] != c && str[i] != '\0')
++i;
return i;
}

int str_first_char_occurence(const char *str, const char *c)
{
if (!str)
return -1;

int i = 0;
while (c[str_find(c, str[i])] == '\0' && str[i] != '\0')
++i;
return i;
}

int str_count(const char *str, char c)
{
if (!str)
return -1;

int count = 0;
while (*str != '\0')
count += (*(str++) == c);
return count;
}
Loading