/* * Glob.java * * Brazil project web application toolkit, * export version: 2.3 * Copyright (c) 1999-2004 Sun Microsystems, Inc. * * Sun Public License Notice * * The contents of this file are subject to the Sun Public License Version * 1.0 (the "License"). You may not use this file except in compliance with * the License. A copy of the License is included as the file "license.terms", * and also available at http://www.sun.com/ * * The Original Code is from: * Brazil project web application toolkit release 2.3. * The Initial Developer of the Original Code is: suhler. * Portions created by suhler are Copyright (C) Sun Microsystems, Inc. * All Rights Reserved. * * Contributor(s): cstevens, suhler. * * Version: 2.16 * Created by suhler on 99/08/05 * Last modified by suhler on 04/11/30 14:59:15 * * Version Histories: * * 2.16 04/11/30-14:59:15 (suhler) * fixed sccs version string * * 2.15 04/11/30-13:21:58 (suhler) * fixed sccs version string * * 2.14 04/11/30-13:19:26 (suhler) * fixed sccs version string * * 2.13 04/11/30-13:19:19 (suhler) * fixed sccs version string * * 2.12 04/11/30-13:18:24 (suhler) * Fixed Version String * * 2.11 04/11/30-13:17:30 (suhler) * * 2.10 04/11/30-13:16:28 (suhler) * Fixed Sccs version * * 2.9 04/11/30-13:15:44 (suhler) * * 2.8 04/11/30-13:12:21 (suhler) * * 2.7 04/11/30-13:11:37 (suhler) * fixed SCCS version string * * 2.6 04/11/30-13:10:21 (suhler) * fixed SCCS version string * * 2.5 04/11/30-13:08:28 (suhler) * * 2.4 04/11/30-13:08:21 (suhler) * fix version string * * 2.3 04/11/30-12:58:36 (suhler) * "fixed * * 2.2 04/11/18-15:46:53 (suhler) * allow pattern==null * * 2.1 02/10/01-16:36:57 (suhler) * version change * * 1.6 99/11/09-20:24:39 (cstevens) * bugs revealed by writing tests. * * 1.5 99/10/14-13:11:12 (cstevens) * @author & @version * * 1.4 99/10/07-13:02:29 (cstevens) * documentation for Glob * * 1.3 99/08/10-16:17:18 (cstevens) * comments * * 1.2 99/08/06-12:07:44 (suhler) * submatch for tailing * pattern was broken * * 1.2 99/08/05-17:03:08 (Codemgr) * SunPro Code Manager data about conflicts, renames, etc... * Name history : 1 0 util/Glob.java * * 1.1 99/08/05-17:03:07 (suhler) * date and time created 99/08/05 17:03:07 by suhler * */ package sunlabs.brazil.util; /** * Glob-style string matching and substring extraction. Glob was * implemented by translating the glob package for * tcl8.0. *
true
if the string matched the pattern,
* false
otherwise.
*/
public static boolean
match(String pattern, String string)
{
return match(pattern, string, null);
}
/**
* Match a string against a pattern, and return sub-matches.
*
* The caller can provide an array of strings that will be filled in with
* the substrings of string
that matched the glob
* meta-characters in pattern
. The array of strings may be
* partially modified even if the string did not match the glob pattern.
* The array may contain more elements than glob meta-characters, in
* which case those extra elements will not be modified; the array may
* also contain fewer elements or even be null
, to ignore
* some or all of the glob meta-characters. In other words, the user can
* pass pretty much anything and this method defines errors out of
* existence.
*
* @param pattern
* Glob pattern.
*
* @param string
* String to match against pattern.
*
* @param substr
* Array of strings provided by the caller, to be filled in
* with the substrings that matched the glob meta-characters.
* May be null
.
*
* @return true
if the string matched the pattern,
* false
otherwise.
*/
public static boolean
match(String pattern, String string, String[] substr)
{
return (pattern != null) && match(pattern, 0, string, 0, substr, 0);
}
private static boolean
match(String pat, int pIndex, String str, int sIndex, String[] substrs,
int subIndex)
{
int pLen = pat.length();
int sLen = str.length();
while (true) {
if (pIndex == pLen) {
if (sIndex == sLen) {
return true;
} else {
return false;
}
} else if ((sIndex == sLen) && (pat.charAt(pIndex) != '*')) {
return false;
}
switch (pat.charAt(pIndex)) {
case '*': {
int start = sIndex;
pIndex++;
if (pIndex >= pLen) {
addMatch(str, start, sLen, substrs, subIndex);
return true;
}
while (true) {
if (match(pat, pIndex, str, sIndex, substrs,
subIndex + 1)) {
addMatch(str, start, sIndex, substrs, subIndex);
return true;
}
if (sIndex == sLen) {
return false;
}
sIndex++;
}
}
case '?': {
pIndex++;
addMatch(str, sIndex, sIndex + 1, substrs, subIndex++);
sIndex++;
break;
}
case '[': {
try {
pIndex++;
char s = str.charAt(sIndex);
char p = pat.charAt(pIndex);
while (true) {
if (p == ']') {
return false;
}
if (p == s) {
break;
}
pIndex++;
char next = pat.charAt(pIndex);
if (next == '-') {
pIndex++;
char p2 = pat.charAt(pIndex);
if ((p <= s) && (s <= p2)) {
break;
}
pIndex++;
next = pat.charAt(pIndex);
}
p = next;
}
pIndex = pat.indexOf(']', pIndex) + 1;
if (pIndex <= 0) {
return false;
}
addMatch(str, sIndex, sIndex + 1, substrs, subIndex++);
sIndex++;
} catch (StringIndexOutOfBoundsException e) {
/*
* Easier just to catch malformed [] sequences than
* to check bounds all the time.
*/
return false;
}
break;
}
case '\\': {
pIndex++;
if (pIndex >= pLen) {
return false;
}
// fall through
}
default: {
if (pat.charAt(pIndex) != str.charAt(sIndex)) {
return false;
}
pIndex++;
sIndex++;
}
}
}
}
private static void
addMatch(String str, int start, int end, String[] substrs, int subIndex)
{
if ((substrs == null) || (subIndex >= substrs.length)) {
return;
}
substrs[subIndex] = str.substring(start, end);
}
}