server0451
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
30uint32_t msg_format_check(char *buf, const char *regex_pattern)31{
32/*--- Компиляция регулярного выражения ---*/33
34regex_t regex_ptr;35
36if (regcomp(®ex_ptr, regex_pattern, REG_EXTENDED) != 0) {37return MSG_FORMAT_CHECK_REGEX_COMP_FAIL;38}39
40
41/*--- Применение регулярного выражения ---*/42
43size_t nmatch = 1;44regmatch_t pmatch[1] = {0};45
46bool match_result = regexec(®ex_ptr, buf, nmatch, pmatch, 0);47regfree(®ex_ptr); /* Очищаем выделенную под регулярное выражение память,48* иначе случится утечка памяти.
49*/
50
51if (match_result != 0) {52return MSG_FORMAT_CHECK_NO_MATCH;53}54
55
56/*--- Проверка полноты совпадения ---*/57
58uint32_t msg_len = strlen(buf);59uint32_t offset_end = pmatch[0].rm_eo;60buf[offset_end] = '\0'; // Обрезаем остаток строки.61uint32_t match_len = strlen(buf);62
63if (msg_len == match_len) {64return MSG_FORMAT_CHECK_MATCH;65} else {66return MSG_FORMAT_CHECK_PARTIAL_MATCH;67}68}
69