project/com.nokia.carbide.cpp.epoc.engine/src/com/nokia/carbide/internal/cpp/epoc/engine/model/SimpleArgList.java
changeset 0 fb279309251b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project/com.nokia.carbide.cpp.epoc.engine/src/com/nokia/carbide/internal/cpp/epoc/engine/model/SimpleArgList.java	Fri Apr 03 23:33:03 2009 +0100
@@ -0,0 +1,132 @@
+/*
+* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.carbide.internal.cpp.epoc.engine.model;
+
+import com.nokia.carbide.internal.api.cpp.epoc.engine.dom.IASTListNode;
+import com.nokia.carbide.internal.api.cpp.epoc.engine.dom.IASTLiteralTextNode;
+import com.nokia.cpp.internal.api.utils.core.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Manage a list of arguments, which quoted strings but not escapes
+ * or parentheses.  This is what the makmake and bldmake tools do,  
+ * Leading and trailing space is retained.
+ *
+ */
+public class SimpleArgList {
+	private List<String> argv;
+	private String initial;
+	private String terminal;
+
+	public SimpleArgList(String text) {
+		String trimmed = text.trim();
+		this.initial = text.substring(0, text.indexOf(trimmed));
+		this.terminal = text.substring(text.length() - this.initial.length() - trimmed.length());
+		this.argv = splitArguments(trimmed);
+		
+	}
+	
+	public SimpleArgList(String initial, List<String> newArgs, String terminal) {
+		Check.checkArg(initial);
+		Check.checkArg(terminal);
+		Check.checkArg(newArgs);
+		this.initial = initial;
+		this.terminal = terminal;
+		this.argv = newArgs;
+	}
+
+	public SimpleArgList(String initial, IASTListNode<IASTLiteralTextNode> newArgs, String terminal) {
+		Check.checkArg(initial);
+		Check.checkArg(terminal);
+		Check.checkArg(newArgs);
+		this.initial = initial;
+		this.terminal = terminal;
+		this.argv = new ArrayList<String>();
+		for (IASTLiteralTextNode node : newArgs)
+			argv.add(node.getValue());
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString() {
+		return initial + catenate(argv) + terminal;
+	}
+	
+	private String catenate(List<String> argv) {
+		StringBuffer buffer = new StringBuffer();
+		boolean first = true;
+		for (String arg : argv) { 
+			if (first)
+				first = false;
+			else
+				buffer.append(' ');
+			if (arg.matches(".*\\s.*")) { //$NON-NLS-1$
+				buffer.append('"');
+				buffer.append(arg);
+				buffer.append('"');
+			} else {
+				buffer.append(arg);
+			}
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * Split a string into arguments.
+	 */
+	private List<String> splitArguments(String string) {
+		List<String> args = new ArrayList<String>();
+		StringBuilder current = new StringBuilder();
+		int idx = 0;
+		boolean quoted = false;
+		while (idx < string.length()) {
+			char ch = string.charAt(idx);
+			if (ch == '"') {
+				quoted = !quoted;
+				current.append(ch);
+				idx++;
+			} else if (!quoted && Character.isWhitespace(ch)) {
+				if (current.length() > 0) {
+					// remove any quotes
+					args.add(current.toString().replaceAll("\"", "")); //$NON-NLS-1$ //$NON-NLS-2$
+					current.setLength(0);
+					idx++;				}
+				while (idx < string.length() && Character.isWhitespace(string.charAt(idx)))
+					idx++;
+			} else {
+				current.append(ch);
+				idx++;
+			}
+		}
+		if (current.length() > 0)
+			args.add(current.toString());
+		return args;
+	}
+
+	/* (non-Javadoc)
+	 * @see com.nokia.carbide.internal.api.cpp.epoc.engine.dom.makefile.ICommand#getArgv()
+	 */
+	public List<String> getArgv() {
+		return argv;
+	}
+	
+}