blob: 828e2c2f487c3220fb3b6d793b6ddb1fb433551c [file] [log] [blame]
/*
*
* Copyright 2002-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;
import java.io.File;
import java.util.Enumeration;
import java.util.Vector;
import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.types.DataType;
/**
* An element that specifies a prototype file and rules for source files that
* should not use precompiled headers
*
* @author Curt Arnold
*/
public final class PrecompileDef extends DataType {
private final Vector exceptSets = new Vector();
private String ifCond;
/**
* Directory of prototype file
*/
private File prototype = new File("stdafx.cpp");
private String unlessCond;
/**
* Constructor
*
*/
public PrecompileDef() {
}
/**
* Method used by PrecompileExceptDef to add exception set to
* PrecompileDef.
*/
public void appendExceptFileSet(ConditionalFileSet exceptSet) {
exceptSet.setProject(getProject());
exceptSets.addElement(exceptSet);
}
/**
* Adds filesets that specify files that should not be processed with
* precompiled headers enabled.
*
* @param exceptSet
* FileSet specify files that should not be processed with
* precompiled headers enabled.
*/
public PrecompileExceptDef createExcept() {
return new PrecompileExceptDef(this);
}
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");
}
public String[] getExceptFiles() {
PrecompileDef ref = getRef();
if (ref != null) {
return ref.getExceptFiles();
}
if (exceptSets.size() == 0) {
return new String[0];
}
Project p = getProject();
String[] exceptFiles = null;
Enumeration setEnum = exceptSets.elements();
while (setEnum.hasMoreElements()) {
ConditionalFileSet exceptSet = (ConditionalFileSet) setEnum
.nextElement();
if (exceptSet.isActive()) {
DirectoryScanner scanner = exceptSet
.getDirectoryScanner(p);
String[] scannerFiles = scanner.getIncludedFiles();
if (exceptFiles == null) {
exceptFiles = scannerFiles;
} else {
if (scannerFiles.length > 0) {
String[] newFiles = new String[exceptFiles.length
+ scannerFiles.length];
for (int i = 0; i < exceptFiles.length; i++) {
newFiles[i] = exceptFiles[i];
}
int index = exceptFiles.length;
for (int i = 0; i < scannerFiles.length; i++) {
newFiles[index++] = scannerFiles[i];
}
exceptFiles = newFiles;
}
}
}
}
if (exceptFiles == null) {
exceptFiles = new String[0];
}
return exceptFiles;
}
/**
* Gets prototype source file
*
*/
public File getPrototype() {
PrecompileDef ref = getRef();
if (ref != null) {
return ref.getPrototype();
}
return prototype;
}
private PrecompileDef getRef() {
if (isReference()) {
return ((PrecompileDef) getCheckedRef(PrecompileDef.class,
"PrecompileDef"));
}
return null;
}
public boolean isActive() {
boolean isActive = CUtil.isActive(getProject(), ifCond, unlessCond);
if (!isActive) {
PrecompileDef ref = getRef();
if (ref != null) {
return ref.isActive();
}
}
return isActive;
}
/**
* 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
//
}
/**
* Set the 'if' condition.
*
* The processor will be ignored unless the property is defined.
*
* The value of property is insignificant, but values that would imply
* misinterpretation ("false", "no") will throw an exception when
* isActive() is evaluated.
*
* @param propName
* name of property
*/
public void setIf(String propName) {
ifCond = propName;
}
/**
* Sets file to precompile.
*
* Should be a source file that includes only one unguarded header file.
* Default value is "stdafx.cpp".
*
* @param prototype
* file path for prototype source file
*/
public void setPrototype(File prototype) {
if (isReference()) {
throw tooManyAttributes();
}
if (prototype == null) {
throw new NullPointerException("prototype");
}
this.prototype = prototype;
}
/**
* Specifies that this element should behave as if the content of the
* element with the matching id attribute was inserted at this location.
*
* @param ref
* Reference to other element
*
*/
public void setRefid(org.apache.tools.ant.types.Reference ref) {
super.setRefid(ref);
}
/**
* Set the 'unless' condition. If named property exists at execution time,
* the processor will be ignored.
*
* Value of property is insignificant, but values that would imply
* misinterpretation ("false", "no") of the behavior will throw an
* exception when isActive is called.
*
* @param propName
* name of property
*/
public void setUnless(String propName) {
unlessCond = propName;
}
}