server0451

Форк
0
/
msg_format_check.c 
68 строк · 2.1 Кб
1
/******************* ОПИСАНИЕ *******************/
2

3
/**
4
 * Имя файла: msg_format_check.c
5
 * ----------------------------------------------------------------------------|---------------------------------------|
6
 * Назначение: проверка формата сообщения с помощью регулярных выражений.
7
 * ----------------------------------------------------------------------------|---------------------------------------|
8
 * Примечания:
9
 */
10

11

12
/************ ДИРЕКТИВЫ ПРЕПРОЦЕССОРА ***********/
13

14
/*--- Включения ---*/
15

16
// Из стандартной библиотеки языка Си.
17
#include <inttypes.h>
18
#include <stdbool.h>
19
#include <string.h>
20

21
// Из библиотек POSIX.
22
#include <regex.h>
23

24
// Локальные модули.
25
#include "msg_format_check.h"
26

27

28
/******************** ФУНКЦИИ *******************/
29

30
uint32_t msg_format_check(char *buf, const char *regex_pattern)
31
{
32
    /*--- Компиляция регулярного выражения ---*/
33
    
34
    regex_t regex_ptr;
35

36
    if (regcomp(&regex_ptr, regex_pattern, REG_EXTENDED) != 0) {
37
        return MSG_FORMAT_CHECK_REGEX_COMP_FAIL;
38
    }
39
    
40

41
    /*--- Применение регулярного выражения ---*/
42
    
43
    size_t nmatch = 1;
44
    regmatch_t pmatch[1] = {0};
45

46
    bool match_result = regexec(&regex_ptr, buf, nmatch, pmatch, 0);
47
    regfree(&regex_ptr);  /* Очищаем выделенную под регулярное выражение память,
48
                           * иначе случится утечка памяти.
49
                           */
50

51
    if (match_result != 0) {
52
        return MSG_FORMAT_CHECK_NO_MATCH;
53
    }
54

55

56
    /*--- Проверка полноты совпадения ---*/
57
    
58
    uint32_t msg_len = strlen(buf);
59
    uint32_t offset_end = pmatch[0].rm_eo;
60
    buf[offset_end] = '\0';  // Обрезаем остаток строки.
61
    uint32_t match_len = strlen(buf);
62

63
    if (msg_len == match_len) {
64
        return MSG_FORMAT_CHECK_MATCH;
65
    } else {
66
        return MSG_FORMAT_CHECK_PARTIAL_MATCH;
67
    }
68
}
69

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.