/* * ==================================================================== * * The ObjectStyle Group Software License, Version 1.0 * * Copyright (c) 2006 The ObjectStyle Group and individual authors of the * software. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowlegement: "This product includes software * developed by the ObjectStyle Group (http://objectstyle.org/)." Alternately, * this acknowlegement may appear in the software itself, if and wherever such * third-party acknowlegements normally appear. * * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse or * promote products derived from this software without prior written permission. * For written permission, please contact andrus@objectstyle.org. * * 5. Products derived from this software may not be called "ObjectStyle" nor * may "ObjectStyle" appear in their names without prior written permission of * the ObjectStyle Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * OBJECTSTYLE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many individuals on * behalf of the ObjectStyle Group. For more information on the ObjectStyle * Group, please see <http://objectstyle.org/>. * */ package org.objectstyle.wolips.eogenerator.core.model; import java.text.CharacterIterator; import java.text.ParseException; import java.text.StringCharacterIterator; import java.util.Enumeration; import java.util.NoSuchElementException; public class CommandLineTokenizer implements Enumeration { private StringCharacterIterator _iterator; private int _state; private boolean _wasQuoted; public CommandLineTokenizer(String line) { _iterator = new StringCharacterIterator(line); reset(); } public void reset() { _state = 1; _iterator.first(); } public boolean hasMoreElements() { return hasMoreTokens(); } public boolean hasMoreTokens() { return (_iterator.current() != CharacterIterator.DONE); } public Object nextElement() { String token; try { token = nextToken(); } catch (ParseException e) { e.printStackTrace(); token = null; } return token; } public String nextToken() throws ParseException { boolean escapeNext = false; boolean wasQuoted = _wasQuoted; // 1 = Whitespace, 2 = Text, 3 = Quoted; StringBuffer token = new StringBuffer(); char c = _iterator.current(); boolean done = false; while (!done && c != CharacterIterator.DONE) { if (escapeNext) { switch (c) { case '\n': throw new ParseException("Unexception escape '\\' at end of string.", _iterator.getIndex()); default: token.append(c); c = _iterator.next(); break; } escapeNext = false; } else { switch (_state) { case 1: switch (c) { case '\n': case ' ': case '\t': c = _iterator.next(); break; case '\"': _state = 3; c = _iterator.next(); if (token.length() > 0 || _wasQuoted) { done = true; _wasQuoted = false; } _wasQuoted = true; break; case '\\': escapeNext = true; c = _iterator.next(); break; default: _state = 2; if (token.length() > 0 || _wasQuoted) { done = true; _wasQuoted = false; } break; } break; case 2: switch (c) { case ' ': case '\t': case '\n': _state = 1; break; // case '\"': // throw new ParseException("Unexpected quote '\"' in // string.", // myIterator.getIndex()); case '\\': escapeNext = true; c = _iterator.next(); break; default: token.append(c); c = _iterator.next(); break; } break; case 3: switch (c) { case '\"': _state = 1; c = _iterator.next(); break; case '\\': escapeNext = true; c = _iterator.next(); break; default: token.append(c); c = _iterator.next(); break; } break; } } } if (token.length() <= 0 && !wasQuoted) { throw new NoSuchElementException("There are no more tokens on this line."); } return token.toString(); } public static void main(String[] args) throws ParseException { String str = "This is a \"Test of \\\" quotes in a string\" and C:\\\\Path"; CommandLineTokenizer tokenizer = new CommandLineTokenizer(str); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken(); System.out.println(token); } } }