source: trunk/CrypPlugins/KeySearcher/KeyPattern/Wildcard.cs @ 1674

Last change on this file since 1674 was 1674, checked in by Paul Lelgemann, 12 years ago

o Refactored distributed KeySearcher: updated directory structure and variable names

File size: 4.8 KB
Line 
1namespace KeySearcher.KeyPattern
2{
3    internal class Wildcard
4    {
5        private char[] values = new char[256];
6        private int length;
7        private int counter;
8        public bool isSplit
9        {
10            get;
11            private set;
12        }
13
14        public Wildcard(string valuePattern)
15        {
16            isSplit = false;
17            counter = 0;
18            if (valuePattern.Length == 1)
19            {
20                length = 1;
21                values[0] = valuePattern[0];
22            }
23            else
24            {
25                length = 0;
26                int i = 1;
27                while (valuePattern[i] != ']')
28                {
29                    if (valuePattern[i + 1] == '-')
30                    {
31                        for (char c = valuePattern[i]; c <= valuePattern[i + 2]; c++)
32                            values[length++] = c;
33                        i += 2;
34                    }
35                    else
36                        values[length++] = valuePattern[i];
37                    i++;
38                }
39            }
40        }
41
42        public Wildcard(Wildcard wc)
43        {
44            isSplit = wc.isSplit;
45            length = wc.length;
46            counter = wc.counter;
47            for (int i = 0; i < 256; i++)
48                values[i] = wc.values[i];
49        }
50
51        public Wildcard(char[] values, int length)
52        {
53            isSplit = false;
54            this.length = length;
55            this.values = values;
56            this.counter = 0;
57        }
58
59        private Wildcard()
60        {
61        }
62
63        public Wildcard[] split()
64        {
65            if (length <= 1)
66                return null;
67            int length1 = this.length - this.counter;
68            Wildcard[] wcs = new Wildcard[2];
69            wcs[0] = new Wildcard();
70            wcs[0].counter = 0;
71            wcs[0].length = length1 / 2;
72            wcs[1] = new Wildcard();
73            wcs[1].counter = 0;
74            wcs[1].length = length1 - wcs[0].length;
75            for (int i = 0; i < wcs[0].length; i++)
76                wcs[0].values[i] = values[this.counter + i];
77            for (int i = 0; i < wcs[1].length; i++)
78                wcs[1].values[i] = values[i + this.counter + wcs[0].length];
79            wcs[0].isSplit = true;
80            wcs[1].isSplit = true;
81            return wcs;
82        }
83
84        public char getChar()
85        {
86            return values[counter];
87        }
88
89        public char getChar(int add)
90        {
91            return values[(counter + add) % length];
92        }
93
94        public bool succ()
95        {
96            counter++;
97            if (counter >= length)
98            {
99                counter = 0;
100                return true;
101            }
102            return false;
103        }
104
105        public int size()
106        {
107            return length;
108        }
109
110        public int count()
111        {
112            return counter;
113        }
114
115        public void resetCounter()
116        {
117            counter = 0;
118        }
119
120        public string getRepresentationString()
121        {
122            if (length == 1)
123                return "" + values[0];
124            string res = "[";
125            int begin = 0;
126            for (int i = 1; i < length; i++)
127            {
128                if (values[i - 1] != values[i] - 1)
129                {
130                    if (begin == i - 1)
131                        res += values[begin];
132                    else
133                    {
134                        if (i - 1 - begin == 1)
135                            res += values[begin] + "" + values[i - 1];
136                        else
137                            res += values[begin] + "-" + values[i - 1];
138                    }
139                    begin = i;
140                }
141            }
142            if (begin == length - 1)
143                res += values[begin];
144            else
145            {
146                if (length - 1 - begin == 1)
147                    res += values[begin] + "" + values[length - 1];
148                else
149                    res += values[begin] + "-" + values[length - 1];
150            }
151
152            res += "]";
153            return res;
154        }
155
156        public bool contains(Wildcard wc)
157        {
158            if (wc == null)
159                return false;
160            for (int i = 0; i < wc.length; i++)
161            {
162                bool contains = false;
163                for (int j = 0; j < this.length; j++)
164                {
165                    if (this.values[j] == wc.values[i])
166                    {
167                        contains = true;
168                        break;
169                    }
170                }
171                if (!contains)
172                    return false;
173            }
174            return true;
175        }
176    }
177}
Note: See TracBrowser for help on using the repository browser.