-
Notifications
You must be signed in to change notification settings - Fork 6
/
EventQueue.cpp
93 lines (71 loc) · 2.49 KB
/
EventQueue.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <string.h>
#include "Main.h"
#include "EventQueue.h"
EventQueue::EventQueue()
{
init();
}
EventQueue::~EventQueue()
{
}
void EventQueue::init(void)
{
for(int i=0; i<CODES_EVENT_LENGTH; i++)
{
evQueue[i].type=0;
evQueue[i].code=0;
evQueue[i].value=0;
}
}
void EventQueue::add(int type, int code, int value)
{
// Если новый код отличается от последнего в очереди
if(evQueue[0].type!=type ||
evQueue[0].code!=code ||
evQueue[0].value!=value)
{
// Очередь сдвигается к концу чтобы освободить нуливой (т.е. первый) элемент
for(int i=CODES_EVENT_LENGTH-1; i>=1; i--)
{
evQueue[i]=evQueue[i-1];
}
// В нулевой элемент помещаются новые значения
evQueue[0].type=type;
evQueue[0].code=code;
evQueue[0].value=value;
}
}
void EventQueue::print()
{
for(int i=0; i<CODES_EVENT_LENGTH; i++)
{
printf("Queue [%d]: %d, %d, %d\n", i,
evQueue[i].type,
evQueue[i].code,
evQueue[i].value);
}
}
// Проверяется, есть ли последовательность событий, заданная в строке поиска
bool EventQueue::checkSequence(char *regexpCompile)
{
// Очередь преобразуется в строку (для последующего сравнения)
char queueSequence[STRING_LEN];
sprintf(queueSequence, "");
// Перебор очереди с последнего элемента к первому
for(int i=CODES_EVENT_LENGTH-1; i>=0; i--)
{
// Строка с событием из очереди
char event[STRING_LEN];
sprintf(event, "%d,%d,%d;", evQueue[i].type, evQueue[i].code, evQueue[i].value);
// Добавление строки с событием
sprintf(queueSequence, "%s%s", queueSequence, event);
}
// printf("Queue: '%s'\n", queueSequence);
// Проверка регулярного выражения
int count = 0;
int ovector[REGEXP_OVECTOR_SIZE];
count=pcre_exec( (pcre *)regexpCompile, NULL, queueSequence, strlen(queueSequence), 0, 0, ovector, REGEXP_OVECTOR_SIZE);
// printf("Count=%d\n", count);
return count>0; // Если что-то найдено, возвращается true
}