File: interval.cc

package info (click to toggle)
flexc%2B%2B 2.17.01-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 7,180 kB
  • sloc: cpp: 6,467; makefile: 148; sh: 130; ansic: 18
file content (65 lines) | stat: -rw-r--r-- 1,413 bytes parent folder | download
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
//#define XERR
#include "fpattern.ih"

FPattern FPattern::interval(States &states, FPattern &regex,
                                Interval const &interval)
{
    FPattern ret;

    size_t lower = interval.lower();
    size_t upper = interval.upper();

    if (lower == 0)
    {
        switch (upper)
        {
            case 0:
                wmsg << "ignoring regex{0, 0}" << endl;
            return regex;

            case 1:
                ret = questionMark(states, regex);
            break;

            case numeric_limits<size_t>::max():
                ret = star(states, regex);
            break;

            default:        // {0, x}, with 1 < x < size_t::max
            {
                Interval oneUp(1, upper);
                
                FPattern tmp = FPattern::interval(states, regex, oneUp);
                ret = questionMark(states, tmp);
            }                                
            break;
        }
    }

    else if (lower == 1 && upper == max<size_t>())
        ret = plus(states, regex);

    else if (lower <=  upper)
    {
        ret = copy(states, regex, lower, upper);

        if (lower == upper && regex.fixedLength())
            ret.d_length = lower * regex.d_length;
    }

    else
    {
        Pair pair = states.next2();
        states[pair.first] = State(EMPTY, pair.second, 0);

        ret = FPattern(pair);
    }

    return ret;
}