/* * * Copyright 2001-2004 The Ant-Contrib project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sf.antcontrib.cpptasks.types; import java.util.Vector; import net.sf.antcontrib.cpptasks.CUtil; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.types.DataType; import org.apache.tools.ant.types.Reference; /** * Set of preprocessor macro defines and undefines. * * @author Mark A Russell <a * href="mailto:mark_russell@csgsystems.com">mark_russell@csg_systems.com * </a> * @author Adam Murdoch */ public class DefineSet extends DataType { private Vector defineList = new Vector(); private String ifCond = null; private String unlessCond = null; /** * * Adds a define element. * * @throws BuildException * if reference */ public void addDefine(DefineArgument arg) throws BuildException { if (isReference()) { throw noChildrenAllowed(); } defineList.addElement(arg); } /** Adds defines/undefines. */ private void addDefines(String[] defs, boolean isDefine) { for (int i = 0; i < defs.length; i++) { UndefineArgument def; if (isDefine) { def = new DefineArgument(); } else { def = new UndefineArgument(); } def.setName(defs[i]); defineList.addElement(def); } } /** * * Adds an undefine element. * * @throws BuildException * if reference */ public void addUndefine(UndefineArgument arg) throws BuildException { if (isReference()) { throw noChildrenAllowed(); } defineList.addElement(arg); } public void execute() throws org.apache.tools.ant.BuildException { throw new org.apache.tools.ant.BuildException( "Not an actual task, but looks like one for documentation purposes"); } /** Returns the defines and undefines in this set. */ public UndefineArgument[] getDefines() throws BuildException { if (isReference()) { DefineSet defset = (DefineSet) getCheckedRef(DefineSet.class, "DefineSet"); return defset.getDefines(); } else { if (isActive()) { UndefineArgument[] defs = new UndefineArgument[defineList .size()]; defineList.copyInto(defs); return defs; } else { return new UndefineArgument[0]; } } } /** * Returns true if the define's if and unless conditions (if any) are * satisfied. * * @exception BuildException * throws build exception if name is not set */ public final boolean isActive() throws BuildException { return CUtil.isActive(getProject(), ifCond, unlessCond); } /** * A comma-separated list of preprocessor macros to define. Use nested * define elements to define macro values. * * @param defList * comma-separated list of preprocessor macros * @throws BuildException * throw if defineset is a reference */ public void setDefine(CUtil.StringArrayBuilder defList) throws BuildException { if (isReference()) { throw tooManyAttributes(); } addDefines(defList.getValue(), true); } /** * Sets a description of the current data type. */ public void setDescription(String desc) { super.setDescription(desc); } /** * Sets an id that can be used to reference this element. * * @param id * id */ public void setId(String id) { // // this is actually accomplished by a different // mechanism, but we can document it // } /** * Sets the property name for the 'if' condition. * * The define will be ignored unless the property is defined. * * The value of the property is insignificant, but values that would imply * misinterpretation ("false", "no") will throw an exception when * evaluated. * * @param propName * property name */ public final void setIf(String propName) { ifCond = propName; } /** * Specifies that this element should behave as if the content of the * element with the matching id attribute was inserted at this location. If * specified, no other attributes or child content should be specified, * other than "description". * */ public void setRefid(Reference r) throws BuildException { if (!defineList.isEmpty()) { throw tooManyAttributes(); } super.setRefid(r); } /** * A comma-separated list of preprocessor macros to undefine. * * @param undefList * comma-separated list of preprocessor macros * @throws BuildException * throw if defineset is a reference */ public void setUndefine(CUtil.StringArrayBuilder undefList) throws BuildException { if (isReference()) { throw tooManyAttributes(); } addDefines(undefList.getValue(), false); } /** * Set the property name for the 'unless' condition. * * If named property is set, the define will be ignored. * * The value of the property is insignificant, but values that would imply * misinterpretation ("false", "no") of the behavior will throw an * exception when evaluated. * * @param propName * name of property */ public final void setUnless(String propName) { unlessCond = propName; } }