/**********************************************************************
 * Copyright (c) 2002,2003 QNX Software Systems and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 *
 * Contributors:
 * QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.make.internal.core.makefile.gnu;

import org.eclipse.cdt.make.core.makefile.gnu.IVariableDefinition;
import org.eclipse.cdt.make.internal.core.makefile.Directive;
import org.eclipse.cdt.make.internal.core.makefile.MacroDefinition;

/**
 */
public class VariableDefinition extends MacroDefinition implements IVariableDefinition  {

	/**
	 * ? is Conditional
	 * : is Simply-expanded
	 * + is append
	 * 0 is recusively-expanded.
	 */
	final static int TYPE_RECURSIVE_EXPAND = 0;
	final static int TYPE_SIMPLE_EXPAND = ':';
	final static int TYPE_CONDITIONAL = '?';
	final static int TYPE_APPEND = '+';
	int type;
	String varTarget;

	public VariableDefinition(Directive parent, String name, StringBuffer value) {
		this(parent, name, value, TYPE_RECURSIVE_EXPAND);
	}

	public VariableDefinition(Directive parent, String name, StringBuffer value, int type) {
		this(parent,  "", name, value, type);
	}

	public VariableDefinition(Directive parent, String target, String name, StringBuffer value, int type) {
		super(parent, name, value);
		varTarget = target;
		this.type = type;
	}

	/**
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		StringBuffer sb = new StringBuffer();
		if (isTargetSpecific()) {
			sb.append(getTarget()).append(": ");
		}
		if (isOverride()) {
			sb.append("override ");
		}
		if (isMultiLine()) {
			sb.append("define ");
			sb.append(getName()).append('\n');
			sb.append(getValue()).append('\n');
			sb.append("endef\n");
		} else {
			if (isExport()) {
				sb.append("export ");
			}
			sb.append(getName());
			if (isRecursivelyExpanded()) {
				sb.append(" = ");
			} else if (isSimplyExpanded()) {
				sb.append(" := ");
			} else if (isConditional()) {
				sb.append(" ?= ");
			} else if (isAppend()) {
				sb.append(" += ");
			}
			sb.append(getValue()).append('\n');
		}
		return sb.toString();
	}

	public boolean isRecursivelyExpanded() {
		return type == TYPE_RECURSIVE_EXPAND;
	}

	public boolean isSimplyExpanded() {
		return type == TYPE_SIMPLE_EXPAND;
	}
                                                                                                                             
	public boolean isConditional() {
		return type == TYPE_CONDITIONAL;
	}
                                                                                                                             
	public boolean isAppend() {
		return type == TYPE_APPEND;
	}

	public boolean isTargetSpecific() {
		String t = getTarget();
		return t != null && t.length() > 0;
	}

	public boolean isExport() {
		return false;
	}

	public boolean isMultiLine() {
		return false;
	}

	/**
	 * Variable from an `override' directive.
	 */
	public boolean isOverride() {
		return false;
	}

	/**
	 * Automatic variable -- cannot be set.
	 */
	public boolean isAutomatic() {
		return false;
	}

	public String getTarget() {
		return varTarget;
	}

}
