Conversation
|
Добавь в ревью Антона Мамедова |
project/src/hw-1.c
Outdated
| 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"); |
There was a problem hiding this comment.
Эти функции можно объединить в одну, в unix системах потоки ввода/вывода воспринимаются как файл. Поток ввода имеет дескриптор 0
project/include/hw-1.h
Outdated
| 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); |
There was a problem hiding this comment.
В .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 != '\'') { |
There was a problem hiding this comment.
Что будет если в str залетит NULL? А в line_cnt? Во всех функциях нужно проверять аргументы на валидность, чтоб не вызвать неопределенное поведение. Эти сценарии так же следует тестировать
project/src/program.c
Outdated
| if (argc == 1) { | ||
| if (parse_comments_from_console()) |
There was a problem hiding this comment.
Эта проверка всегда будет верна, т.к argc не может быть меньше 1. Первый аргумент - имя запускаемого файла
.travis.yml
Outdated
| # скрипт сборки и тестирования проекта: | ||
| - mkdir build | ||
| - cd build | ||
| - cmake .. -DCMAKE_BUILD_TYPE=$BUILD_CONFIGURATION |
There was a problem hiding this comment.
Попробуй добавить флаг -DCMAKE_CXX_FLAGS="--coverage"
| switch (*str) { | ||
| case '\"': | ||
| str = skip_to_double_quote(str + 1, &line_cnt); | ||
| if (!str) { |
There was a problem hiding this comment.
Думаю тело цикла можно вынести в отдельную внутреннюю функцию библиотеки, по хорошему функция должна умещаться в экран
project/src/hw-1.c
Outdated
| print_res(res, &comments_amount); | ||
| free_res(&res); | ||
| return 0; |
There was a problem hiding this comment.
Функция парсинга не должна печатать результат, она должна его возвращать. Тогда она будет более универсальной и применима к другим проектам.
|
Все поправил. Слияние функции чтения из консоли и функции чтения из файла обсудили. Выносить тело цикла в отдельную функцию не имеет смысла, т.к. практически все функция - это этот цикл, т.е. она уже вынесена. Обратите внимание, что мне также придется передавать все аргументы в эту новую функцию, и если добавить все проверка на валидность указателей, выигрыш будет ровно в 1 строку, не считая закрывающей скобочки. Зато будет новая функция, прототип к ней, дополнительный переход с передачей 64 бит адресов. Функция парсинга теперь возвращает только массив структур. Выводит только сообщения об ошибках при аварийном завершении. В строку выводить не стал, т.к. не считаю необходимым создавать строку, алочить память и т.п., когда сохраняю начало и конец строки через указатели в структуре. Тем более, есть функция, которая спокойно такие структуры читает. Флаг --coverage был до этого в CMakeList. Не работало отображение в ПР, сейчас посмотрим Оказывается, валгринд не вызывался на ВМ lcovr не работает с clang. Есть возможность проверить компиляцию и на нем (проверял, работает). Но при компиляции clang'ом, lcov выдает ошибку и крашит CI-тест |
|
Зачет |
Турчин Денис АПО-13
Вариант 74
Разработать программу, которая на вход принимает исходный код на языке C, находит в нём все комментарии (однострочные и многострочные) и для каждого из них заполняет структуру, содержащую информацию о тексте комментария, его типе и о номерах строк, на которых он расположен. В результате должен получиться список таких структур, который нужно вывести на экран.