/* You may freely copy, distribute, modify and use this class as long as the original author attribution remains intact. See message below. Copyright (C) 2003 Christian Pesch. All Rights Reserved. */ /* * --------------------------------------------------------- * Antelmann.com Java Framework by Holger Antelmann * Copyright (c) 2002 Holger Antelmann <info@antelmann.com> * For details, see also http://www.antelmann.com/developer/ * --------------------------------------------------------- */ package slash.metamusic.freedb; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; /** * CDDBArgumentParser is a helper class that parses arguments in results * according to CDDB Protocol level 2. * It works similarly to a StringTokenizer, but it properly handles * arguments enclosed with quotes. * * @author Christian Pesch based on work from Holger Antelmann * @version $Id: CDDBArgumentParser.java 914 2006-12-26 20:44:49Z cpesch $ */ public class CDDBArgumentParser { private String line; protected String delimiter = " \t\n\r\f"; public CDDBArgumentParser(String line) { this.line = line; } public void setDelimiter(String delimiter) { this.delimiter = delimiter; } public String getRemainder() { while (hasMoreArguments() && isDelimiter(line.charAt(0))) line = line.substring(1); String rest = line; line = ""; return rest; } public boolean hasMoreArguments() { return line.length() > 0; } public String nextArgument() throws NoSuchElementException { if (!hasMoreArguments()) { throw new NoSuchElementException(); } // strip slack on the beginning while (hasMoreArguments() && isDelimiter(line.charAt(0))) line = line.substring(1); if (line.length() < 1) { return ""; } int pos; String arg; if (line.charAt(0) == '\"') { // handle quoted argument pos = findNextQuote(1); arg = line.substring(1, pos); } else { // handle unquoted argument pos = findNextDelimiter(1); arg = line.substring(0, pos); } if (pos >= line.length()) { line = ""; } else { line = line.substring(pos + 1); } return arg; } int findNextQuote(int from) { int i = from; for (; (i < line.length()) && !(line.charAt(i) == '\"'); i++) ; return i; } int findNextDelimiter(int from) { int i = from; for (; (i < line.length()) && !isDelimiter(line.charAt(i)); i++) ; return i; } boolean isDelimiter(char c) { for (int i = 0; i < delimiter.length(); i++) { if (c == delimiter.charAt(i)) return true; } return false; } public static String[] getAll(String line) { CDDBArgumentParser parser = new CDDBArgumentParser(line); List<String> strings = new ArrayList<String>(); while (parser.hasMoreArguments()) { strings.add(parser.nextArgument()); } return strings.toArray(new String[strings.size()]); } public static void main(String[] args) { System.out.println(args[0]); CDDBArgumentParser ap = new CDDBArgumentParser(args[0]); while (ap.hasMoreArguments()) { System.out.println("\"" + ap.nextArgument() + "\""); } System.exit(0); } }