File: pattern.cpp

package info (click to toggle)
fcitx5-unikey 5.1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 916 kB
  • sloc: cpp: 10,885; makefile: 4; sh: 1
file content (80 lines) | stat: -rw-r--r-- 2,133 bytes parent folder | download | duplicates (3)
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
/*
 * SPDX-FileCopyrightText: 1998-2002 Pham Kim Long <longp@cslab.felk.cvut.cz>
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#include "pattern.h"

//////////////////////////////////////////////////
// Pattern matching (based on KPM algorithm)
//////////////////////////////////////////////////

//----------------------------
void PatternState::reset() {
    m_pos = 0;
    m_found = 0;
}

//----------------------------
void PatternState::init(char *pattern) {
    m_pos = 0;
    m_found = 0;
    m_pattern = pattern;

    int i = 0, j = -1;
    m_border[i] = j;
    while (m_pattern[i]) {
        while (j >= 0 && m_pattern[i] != m_pattern[j])
            j = m_border[j];
        i++;
        j++;
        m_border[i] = j;
    }
}

//-----------------------------------------------------
// get next input char, returns 1 if pattern is found.
//-----------------------------------------------------
int PatternState::foundAtNextChar(char ch) {
    int ret = 0;
    // int j = m_pos;
    while (m_pos >= 0 && ch != m_pattern[m_pos])
        m_pos = m_border[m_pos];
    m_pos++;
    if (m_pattern[m_pos] == 0) {
        m_found++;
        m_pos = m_border[m_pos];
        ret = 1;
    }
    return ret;
}

//-----------------------------------------------------
void PatternList::init(char **patterns, int count) {
    m_count = count;
    delete[] m_patterns;
    m_patterns = new PatternState[count];
    for (int i = 0; i < count; i++)
        m_patterns[i].init(patterns[i]);
}

//-----------------------------------------------------
// return the order number of the pattern that is found.
// If more than 1 pattern is found, returns any pattern
// Returns -1 if no pattern is found
//-----------------------------------------------------
int PatternList::foundAtNextChar(char ch) {
    int patternFound = -1;
    for (int i = 0; i < m_count; i++) {
        if (m_patterns[i].foundAtNextChar(ch))
            patternFound = i;
    }
    return patternFound;
}

//-----------------------------------------------------
void PatternList::reset() {
    for (int i = 0; i < m_count; i++)
        m_patterns[i].reset();
}