001: package com.protomatter.util;
002:
003: /**
004: * {{{ The Protomatter Software License, Version 1.0
005: * derived from The Apache Software License, Version 1.1
006: *
007: * Copyright (c) 1998-2002 Nate Sammons. All rights reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution,
022: * if any, must include the following acknowledgment:
023: * "This product includes software developed for the
024: * Protomatter Software Project
025: * (http://protomatter.sourceforge.net/)."
026: * Alternately, this acknowledgment may appear in the software itself,
027: * if and wherever such third-party acknowledgments normally appear.
028: *
029: * 4. The names "Protomatter" and "Protomatter Software Project" must
030: * not be used to endorse or promote products derived from this
031: * software without prior written permission. For written
032: * permission, please contact support@protomatter.com.
033: *
034: * 5. Products derived from this software may not be called "Protomatter",
035: * nor may "Protomatter" appear in their name, without prior written
036: * permission of the Protomatter Software Project
037: * (support@protomatter.com).
038: *
039: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
040: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
041: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
042: * DISCLAIMED. IN NO EVENT SHALL THE PROTOMATTER SOFTWARE PROJECT OR
043: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
044: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
045: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
046: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
047: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
048: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
049: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
050: * SUCH DAMAGE. }}}
051: */
052:
053: import java.util.*;
054:
055: /**
056: * A string tokenizer. Behaves like <tt>java.util.StringTokenizer</tt>
057: * extept that two delimiters next to eachother are recognized as
058: * two separate delimiters. For instance, splitting "<tt>foo||bar</tt>"
059: * using "<tt>|</tt>" as the delimiter will return three tokens
060: * ("<tt>foo</tt>", "" (empty string), and "<tt>bar</tt>").
061: */
062: public class ProtoStringTokenizer {
063: private String string;
064: private int index = 0;
065: private int length = 0;
066: private Dictionary tokens = new Hashtable();
067:
068: /**
069: * Create a new ProtoStringTokenizer with the given string
070: * to tokenize and the given list of tokens.
071: */
072: public ProtoStringTokenizer(String string, String tokens) {
073: this .string = string;
074: this .length = string.length();
075: String value = "";
076: for (int i = 0; i < tokens.length(); i++)
077: this .tokens.put(new Character(tokens.charAt(i)), value);
078: }
079:
080: /**
081: * Determine if there are more tokens available
082: */
083: public boolean hasMoreTokens() {
084: return (index < length);
085: }
086:
087: /**
088: * Get the next token
089: */
090: public String nextToken() {
091: String s = this .string;
092: for (int i = index; i < length; i++) {
093: if (tokens.get(new Character(s.charAt(i))) != null) {
094: String ret = s.substring(index, i);
095: this .index = i + 1;
096: return ret;
097: }
098: }
099: String ret = s.substring(index, length);
100: this .index = length;
101: return ret;
102: }
103:
104: /**
105: * A test program.
106: */
107: public static void main(String args[]) {
108: if (args.length != 2) {
109: System.out
110: .println("Usage: ProtoStringTokenizer string delim");
111: System.exit(0);
112: }
113: ProtoStringTokenizer st = new ProtoStringTokenizer(args[0],
114: args[1]);
115: System.out.println("String = '" + args[0] + "'");
116: System.out.println("Delim = '" + args[1] + "'");
117: while (st.hasMoreTokens()) {
118: System.out.println("Token = '" + st.nextToken() + "'");
119: }
120: }
121: }
|