4997a9b80d1e651cc84bcb0c1b5e3e1d1f0f087c
[jalview.git] / src / com / stevesoft / pat / Multi.java
1 /*******************************************************************************
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $(date) The Jalview Authors
4  *
5  * This file is part of Jalview.
6  *  
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *   
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  *******************************************************************************/
21 //
22 // This software is now distributed according to
23 // the Lesser Gnu Public License.  Please see
24 // http://www.gnu.org/copyleft/lesser.txt for
25 // the details.
26 //    -- Happy Computing!
27 //
28 package com.stevesoft.pat;
29
30 import java.util.Hashtable;
31
32 /**
33  * Matches any number of instances of sub Pattern this was the hardest method to
34  * write. It implements '+', '*', '?', "{0,10}", "{5,}", "{5}", etc.
35  * 
36  * @see pat.Multi_stage2
37  * @see pat.MultiMin
38  */
39 class Multi extends PatternSub
40 {
41   patInt a, b;
42
43   public patInt minChars()
44   {
45     return a.mul(p.countMinChars());
46   }
47
48   public patInt maxChars()
49   {
50     return b.mul(p.countMaxChars());
51   }
52
53   Pattern p;
54
55   Multi_stage2 st2;
56
57   public boolean matchFewest = false;
58
59   /**
60    * @param a
61    *          The fewest number of times the sub pattern can match.
62    * @param b
63    *          The maximum number of times the sub pattern can match.
64    * @param p
65    *          The sub pattern.
66    * @see Multi_stage2
67    * @see MultiMin
68    */
69   public Multi(patInt a, patInt b, Pattern p) throws RegSyntax
70   {
71     this.a = a;
72     this.b = b;
73     this.p = p;
74     st2 = new Multi_stage2(a, b, p);
75     st2.parent = this;
76     sub = st2.sub;
77   }
78
79   public String toString()
80   {
81     st2.matchFewest = matchFewest;
82     return st2.toString();
83   }
84
85   public int matchInternal(int pos, Pthings pt)
86   {
87     try
88     {
89       st2 = new Multi_stage2(a, b, p);
90     } catch (RegSyntax r__)
91     {
92     }
93     st2.matchFewest = matchFewest;
94     st2.parent = this;
95     return st2.matchInternal(pos, pt);
96   }
97
98   public Pattern clone1(Hashtable h)
99   {
100     try
101     {
102       Multi m = new Multi(a, b, ((Pattern) p).clone(h));
103       m.matchFewest = matchFewest;
104       return m;
105     } catch (RegSyntax rs)
106     {
107       return null;
108     }
109   }
110 };