All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sunlabs.brazil.util.Glob Maven / Gradle / Ivy

The newest version!
/*
 * 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.
 * 
    *
  • "*" matches 0 or more characters *
  • "?" matches a single character *
  • "[...]" matches a set and/or range of characters *
  • "\" following character is not special *
* * Each of the substrings matching (?, *, or [..]) are returned. * * @author Colin Stevens ([email protected]) * @version 2.16 */ public class Glob { private Glob() {} /** * Match a string against a pattern. * * @param pattern * Glob pattern. Nothing matches if pattern==null. * * @param string * String to match against pattern. * * @return 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); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy