KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > uni_hamburg > eggink > autojar > Utils


1 package de.uni_hamburg.eggink.autojar;
2
3 import java.util.*;
4
5 class Utils
6 {
7     static boolean patternMatches(String JavaDoc pattern, String JavaDoc name)
8     {
9         if (pattern == null)
10             return true;
11         
12         int iExpr = 0,
13                 iPath = 0,
14                 lenPattern = pattern.length(),
15                 lenName = name.length();
16         boolean ok = false;
17
18 loop:
19         while (iExpr < lenPattern)
20         {
21             char charExpr = pattern.charAt(iExpr);
22
23             switch (charExpr)
24             {
25                 case '?':
26                 {
27                     // any character
28

29                     if (iPath >= lenName)
30                         break loop;
31
32                     ++iExpr;
33                     ++iPath;
34                     break;
35                 }
36
37                 case '*':
38                 {
39                     // character sequence
40

41                     int nqu = 0;
42                     
43                     // find normal chars in pattern after '*', count '?'s
44

45                     while (++iExpr < lenPattern)
46                     {
47                         char c = pattern.charAt(iExpr);
48
49                         if (c == '?')
50                             ++nqu;
51                         else if (c != '*')
52                             break;
53                     }
54                      
55                     if (iExpr >= lenPattern)
56                     {
57                         // at end, no normal chars after *, just check '?'s
58

59                         ok = lenName - iPath >= nqu;
60                         break loop;
61                     }
62                     else
63                     {
64                         // extract normal part
65

66                         int jex = iExpr;
67
68                         while (++jex < lenPattern)
69                         {
70                             char c = pattern.charAt(jex);
71
72                             if (c == '*' || c == '?')
73                                 break;
74                         }
75                     
76                         String JavaDoc normal = pattern.substring(iExpr, jex);
77                         int ifound = name.indexOf(normal, iPath);
78
79                         if (ifound < 0 || ifound - iPath < nqu)
80                         {
81                             // not found in name, or too early
82

83                             break loop;
84                         }
85
86                         // adjust indices
87

88                         iPath = ifound + normal.length();
89                         iExpr = jex;
90
91                         break;
92                     }
93                 }
94                 
95                 default:
96                 {
97                     // normal char
98

99                     if (iPath >= lenName || charExpr != name.charAt(iPath))
100                         break loop;
101
102                     ++iExpr;
103                     ++iPath;
104                 }
105             }
106         }
107
108         if (! ok)
109             ok = iPath == lenName;
110
111         return ok;
112         
113     }
114
115     //----------------------------------------------------------------------
116

117     static boolean patternMatches(ArrayList patterns, String JavaDoc name)
118     {
119         if (patterns == null)
120             return false;
121
122         for (Iterator it = patterns.iterator(); it.hasNext(); )
123         {
124             String JavaDoc pat = (String JavaDoc)it.next();
125
126             if (patternMatches(pat, name))
127                 return true;
128         }
129
130         return false;
131     }
132                     
133 }
134
135
Popular Tags