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

Last change on this file since 2013 was 2013, checked in by Sven Rech, 11 years ago

fixed keysearcher keypattern bug

File size: 6.2 KB
RevLine 
[2010]1/*                             
2   Copyright 2009 Sven Rech (svenrech at googlemail dot com), Uni Duisburg-Essen
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
[2013]17using System;
[2010]18namespace KeySearcher.KeyPattern
[1117]19{
20    internal class Wildcard
21    {
22        private char[] values = new char[256];
23        private int length;
24        private int counter;
25        public bool isSplit
26        {
27            get;
28            private set;
29        }
30
31        public Wildcard(string valuePattern)
32        {
33            isSplit = false;
34            counter = 0;
35            if (valuePattern.Length == 1)
36            {
37                length = 1;
38                values[0] = valuePattern[0];
39            }
40            else
41            {
42                length = 0;
43                int i = 1;
44                while (valuePattern[i] != ']')
45                {
46                    if (valuePattern[i + 1] == '-')
47                    {
48                        for (char c = valuePattern[i]; c <= valuePattern[i + 2]; c++)
49                            values[length++] = c;
50                        i += 2;
51                    }
52                    else
53                        values[length++] = valuePattern[i];
54                    i++;
55                }
56            }
[2013]57
58            Array.Sort(values, 0, length);
[1117]59        }
60
61        public Wildcard(Wildcard wc)
62        {
63            isSplit = wc.isSplit;
64            length = wc.length;
65            counter = wc.counter;
66            for (int i = 0; i < 256; i++)
67                values[i] = wc.values[i];
68        }
69
70        public Wildcard(char[] values, int length)
71        {
72            isSplit = false;
73            this.length = length;
74            this.values = values;
75            this.counter = 0;
76        }
77
78        private Wildcard()
79        {
80        }
81
82        public Wildcard[] split()
83        {
84            if (length <= 1)
85                return null;
86            int length1 = this.length - this.counter;
87            Wildcard[] wcs = new Wildcard[2];
88            wcs[0] = new Wildcard();
89            wcs[0].counter = 0;
90            wcs[0].length = length1 / 2;
91            wcs[1] = new Wildcard();
92            wcs[1].counter = 0;
93            wcs[1].length = length1 - wcs[0].length;
94            for (int i = 0; i < wcs[0].length; i++)
95                wcs[0].values[i] = values[this.counter + i];
96            for (int i = 0; i < wcs[1].length; i++)
97                wcs[1].values[i] = values[i + this.counter + wcs[0].length];
98            wcs[0].isSplit = true;
99            wcs[1].isSplit = true;
100            return wcs;
101        }
102
103        public char getChar()
104        {
105            return values[counter];
106        }
107
108        public char getChar(int add)
109        {
110            return values[(counter + add) % length];
111        }
112
113        public bool succ()
114        {
115            counter++;
116            if (counter >= length)
117            {
118                counter = 0;
119                return true;
120            }
121            return false;
122        }
123
[2010]124        /// <summary>
125        /// Adds "add" to the counter and returns the carry.
126        /// </summary>
127        /// <param name="add">The carry</param>
128        /// <returns></returns>
129        public int add(int add)
130        {
131            counter += add;
132            if (counter >= length)
133            {
134                int result = counter / length;
135                counter %= length;
136                return result;
137            }
138            return 0;
139        }
140
[1117]141        public int size()
142        {
143            return length;
144        }
145
146        public int count()
147        {
148            return counter;
149        }
150
151        public void resetCounter()
152        {
153            counter = 0;
154        }
155
156        public string getRepresentationString()
157        {
158            if (length == 1)
159                return "" + values[0];
160            string res = "[";
161            int begin = 0;
162            for (int i = 1; i < length; i++)
163            {
164                if (values[i - 1] != values[i] - 1)
165                {
166                    if (begin == i - 1)
167                        res += values[begin];
168                    else
169                    {
170                        if (i - 1 - begin == 1)
171                            res += values[begin] + "" + values[i - 1];
172                        else
173                            res += values[begin] + "-" + values[i - 1];
174                    }
175                    begin = i;
176                }
177            }
178            if (begin == length - 1)
179                res += values[begin];
180            else
181            {
182                if (length - 1 - begin == 1)
183                    res += values[begin] + "" + values[length - 1];
184                else
185                    res += values[begin] + "-" + values[length - 1];
186            }
187
188            res += "]";
189            return res;
190        }
191
192        public bool contains(Wildcard wc)
193        {
194            if (wc == null)
195                return false;
196            for (int i = 0; i < wc.length; i++)
197            {
198                bool contains = false;
199                for (int j = 0; j < this.length; j++)
200                {
201                    if (this.values[j] == wc.values[i])
202                    {
203                        contains = true;
204                        break;
205                    }
206                }
207                if (!contains)
208                    return false;
209            }
210            return true;
211        }
[2010]212
213        internal int getLength()
214        {
215            return length;
216        }
217
218        internal char[] getChars()
219        {
220            return values;
221        }
[1117]222    }
223}
Note: See TracBrowser for help on using the repository browser.