Skip to content

Iz 1#1

Open
Denactive wants to merge 11 commits intomainfrom
iz-1
Open

Iz 1#1
Denactive wants to merge 11 commits intomainfrom
iz-1

Conversation

@Denactive
Copy link
Owner

Турчин Денис АПО-13
Вариант 74

Разработать программу, которая на вход принимает исходный код на языке C, находит в нём все комментарии (однострочные и многострочные) и для каждого из них заполняет структуру, содержащую информацию о тексте комментария, его типе и о номерах строк, на которых он расположен. В результате должен получиться список таких структур, который нужно вывести на экран.

@IlyaSaneev
Copy link
Collaborator

Добавь в ревью Антона Мамедова

Comment on lines +243 to +263
int parse_comments_from_file(const char *filename) {
struct stat stat_buf = {};
char* input = file_input(filename, &stat_buf);
if (!input) {
printf("Error | Empty input\n");
return -1;
}

if(parse_comments(input))
return -1;

// file mapping closing
if (munmap((void*)input, stat_buf.st_size))
printf("Error | failed to unmap %s\n", filename);
return 0;
}

int parse_comments_from_console() {
char* input = console_input();
if (!input) {
printf("Error | Empty input\n");
Copy link
Collaborator

Choose a reason for hiding this comment

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

Эти функции можно объединить в одну, в unix системах потоки ввода/вывода воспринимаются как файл. Поток ввода имеет дескриптор 0

Comment on lines +30 to +34
int parse_comments(const char* input);
int parse_comments_from_file(const char *filename);
int parse_comments_from_console();

char* skip_to_single_quote(const char *str, size_t *line_cnt);
Copy link
Collaborator

Choose a reason for hiding this comment

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

В .h файле следует оставить только те функции, которые могут быть использованы пользователем библиотеки, полностью внутренние функции следует инкппсулировать в .с файле


// starts from a sym after ' and returns a sym after closing '
char* skip_to_single_quote(const char* str, size_t *line_cnt) {
while (*str != '\'') {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Что будет если в str залетит NULL? А в line_cnt? Во всех функциях нужно проверять аргументы на валидность, чтоб не вызвать неопределенное поведение. Эти сценарии так же следует тестировать

Comment on lines +4 to +5
if (argc == 1) {
if (parse_comments_from_console())
Copy link
Collaborator

Choose a reason for hiding this comment

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

Эта проверка всегда будет верна, т.к argc не может быть меньше 1. Первый аргумент - имя запускаемого файла

.travis.yml Outdated
# скрипт сборки и тестирования проекта:
- mkdir build
- cd build
- cmake .. -DCMAKE_BUILD_TYPE=$BUILD_CONFIGURATION
Copy link
Collaborator

Choose a reason for hiding this comment

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

Попробуй добавить флаг -DCMAKE_CXX_FLAGS="--coverage"

Comment on lines +198 to +201
switch (*str) {
case '\"':
str = skip_to_double_quote(str + 1, &line_cnt);
if (!str) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Думаю тело цикла можно вынести в отдельную внутреннюю функцию библиотеки, по хорошему функция должна умещаться в экран

Comment on lines +238 to +240
print_res(res, &comments_amount);
free_res(&res);
return 0;
Copy link
Collaborator

Choose a reason for hiding this comment

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

Функция парсинга не должна печатать результат, она должна его возвращать. Тогда она будет более универсальной и применима к другим проектам.

@Denactive
Copy link
Owner Author

Denactive commented Mar 17, 2021

Все поправил. Слияние функции чтения из консоли и функции чтения из файла обсудили.
прототипы инкапсулируемых перенес. Оставил юзеру возможность использования функций вывода, дополнения массива структур, чтение комментариев
Все, что касается ввода-вывода перенес обратно в main. От 2х дополнительных (совсем ненужных) функций отказался

Выносить тело цикла в отдельную функцию не имеет смысла, т.к. практически все функция - это этот цикл, т.е. она уже вынесена. Обратите внимание, что мне также придется передавать все аргументы в эту новую функцию, и если добавить все проверка на валидность указателей, выигрыш будет ровно в 1 строку, не считая закрывающей скобочки. Зато будет новая функция, прототип к ней, дополнительный переход с передачей 64 бит адресов.

Функция парсинга теперь возвращает только массив структур. Выводит только сообщения об ошибках при аварийном завершении. В строку выводить не стал, т.к. не считаю необходимым создавать строку, алочить память и т.п., когда сохраняю начало и конец строки через указатели в структуре. Тем более, есть функция, которая спокойно такие структуры читает.

Флаг --coverage был до этого в CMakeList. Не работало отображение в ПР, сейчас посмотрим

Оказывается, валгринд не вызывался на ВМ

lcovr не работает с clang. Есть возможность проверить компиляцию и на нем (проверял, работает). Но при компиляции clang'ом, lcov выдает ошибку и крашит CI-тест
вроде все)

@IlyaSaneev
Copy link
Collaborator

Зачет

@IlyaSaneev IlyaSaneev removed their assignment Mar 20, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants