mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-24 08:44:01 +02:00
[220446] Added and preprocessor for tutorial excercises.
This commit is contained in:
parent
398f01e873
commit
e8d462f047
8 changed files with 586 additions and 4 deletions
|
@ -3,5 +3,6 @@
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="src" path="src_ant"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#Thu Jun 07 11:07:55 PDT 2007
|
#Fri Feb 22 09:41:13 PST 2008
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
|
||||||
|
@ -33,7 +33,7 @@ org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
|
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
|
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
|
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
|
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
|
||||||
org.eclipse.jdt.core.compiler.problem.nullReference=ignore
|
org.eclipse.jdt.core.compiler.problem.nullReference=ignore
|
||||||
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
|
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
|
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
|
||||||
|
@ -41,6 +41,7 @@ org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warnin
|
||||||
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
|
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
|
||||||
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
|
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
|
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
|
||||||
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
|
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
|
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
|
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
|
||||||
|
@ -53,13 +54,17 @@ org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
|
||||||
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
|
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
|
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeUncheckedExceptions=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
|
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedImport=error
|
org.eclipse.jdt.core.compiler.problem.unusedImport=error
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
|
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
|
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
|
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
|
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
|
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
|
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
|
||||||
|
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
|
||||||
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
|
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
|
||||||
org.eclipse.jdt.core.compiler.source=1.5
|
org.eclipse.jdt.core.compiler.source=1.5
|
||||||
|
|
|
@ -12,7 +12,7 @@ Require-Bundle: org.eclipse.ui,
|
||||||
org.eclipse.debug.ui,
|
org.eclipse.debug.ui,
|
||||||
org.eclipse.dd.dsf,
|
org.eclipse.dd.dsf,
|
||||||
org.eclipse.ui,
|
org.eclipse.ui,
|
||||||
org.eclipse.dd.dsf.ui
|
org.eclipse.dd.dsf.ui,
|
||||||
|
org.apache.ant;bundle-version="1.7.0";resolution:=optional
|
||||||
Eclipse-LazyStart: true
|
Eclipse-LazyStart: true
|
||||||
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
||||||
|
|
51
plugins/org.eclipse.dd.examples.dsf/build_preprocess.xml
Normal file
51
plugins/org.eclipse.dd.examples.dsf/build_preprocess.xml
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!-- ======================================================================
|
||||||
|
Copyright (c) 2005, 2008 IBM Corporation and others.\
|
||||||
|
All rights reserved. This program and the accompanying materials
|
||||||
|
are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
which accompanies this distribution, and is available at
|
||||||
|
http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
IBM Corporation - initial API and implementation
|
||||||
|
|
||||||
|
EclipseCon
|
||||||
|
Debug Tutorial Exercises
|
||||||
|
====================================================================== -->
|
||||||
|
<project name="EclipseCon" default="generateAll">
|
||||||
|
<description>
|
||||||
|
Debug Tutorial Exercises
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<taskdef name="preprocess" classname="org.eclipse.dd.examples.ant.tasks.PreProcessor" classpath="../bin" />
|
||||||
|
<property name="workspace" location="c:\eclipse-dev\dev-3.4" />
|
||||||
|
<property name="srcBase" location="${workspace}/org.eclipse.dd.examples.dsf/src_preprocess" />
|
||||||
|
<property name="destBase" location="${workspace}/org.eclipse.dd.examples.dsf/src" />
|
||||||
|
|
||||||
|
<!-- =================================
|
||||||
|
target: generateAll
|
||||||
|
================================= -->
|
||||||
|
<target name="generateAll" description="--> Debug Tutorial Exercises">
|
||||||
|
|
||||||
|
<!-- = = = = = = = = = = = = = = = = =
|
||||||
|
macrodef: process
|
||||||
|
= = = = = = = = = = = = = = = = = -->
|
||||||
|
<macrodef name="process">
|
||||||
|
<attribute name="packagedir"/>
|
||||||
|
<attribute name="symbols"/>
|
||||||
|
<sequential>
|
||||||
|
<delete dir="@{destBase}/${packagedir}/excercise"/>
|
||||||
|
<delete dir="@{destBase}/${packagedir}/answer"/>
|
||||||
|
<mkdir dir="@{destBase}/${packagedir}/excercise"/>
|
||||||
|
<mkdir dir="@{destBase}/${packagedir}/answer"/>
|
||||||
|
<preprocess destdir="@{destBase}/${packagedir}/excercise" symbols="@{symbols}">
|
||||||
|
<fileset dir="@{destBase}/${packagedir}"/>
|
||||||
|
</preprocess>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
|
||||||
|
<process packagedir="${srcBase}/org/eclipse/dd/examples/dsf/requestmonitor" symbols="request_monitors_ex1"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
</project>
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 Wind River Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.examples.dsf.requestmonitor;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
|
||||||
|
import org.eclipse.dd.dsf.concurrent.ImmediateExecutor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example of using a DataRequestMonitor to retrieve a result from an
|
||||||
|
* asynchronous method.
|
||||||
|
*/
|
||||||
|
public class Async2Plus2 {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Executor executor = ImmediateExecutor.getInstance();
|
||||||
|
DataRequestMonitor<Integer> rm =
|
||||||
|
new DataRequestMonitor<Integer>(executor, null) {
|
||||||
|
@Override
|
||||||
|
protected void handleCompleted() {
|
||||||
|
System.out.println("2 + 2 = " + getData());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
asyncAdd(2, 2, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void asyncAdd(int value1, int value2, DataRequestMonitor<Integer> rm) {
|
||||||
|
rm.setData(value1 + value2);
|
||||||
|
rm.done();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 Wind River Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.examples.dsf.requestmonitor;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor;
|
||||||
|
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
|
||||||
|
import org.eclipse.dd.dsf.concurrent.ImmediateExecutor;
|
||||||
|
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example of using a CountingRequestMonitor to wait for multiple
|
||||||
|
* asynchronous calls to complete.
|
||||||
|
*/
|
||||||
|
public class AsyncQuicksort {
|
||||||
|
|
||||||
|
static Executor fgExecutor = ImmediateExecutor.getInstance();
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
final int[] array = {5, 7, 8, 3, 2, 1, 9, 5, 4};
|
||||||
|
|
||||||
|
System.out.println("To sort: " + Arrays.toString(array));
|
||||||
|
asyncQuicksort(
|
||||||
|
array, 0, array.length - 1,
|
||||||
|
new RequestMonitor(fgExecutor, null) {
|
||||||
|
@Override
|
||||||
|
protected void handleCompleted() {
|
||||||
|
System.out.println("Sorted: " + Arrays.toString(array));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static void asyncQuicksort(final int[] array, final int left,
|
||||||
|
final int right, final RequestMonitor rm)
|
||||||
|
{
|
||||||
|
if (right > left) {
|
||||||
|
int pivot = left;
|
||||||
|
//#ifdef request_monitors_ex2
|
||||||
|
//# // TODO: Request Monitors Exercise 2 - Convert partition to an async. method.
|
||||||
|
//# int newPivot = partition(array, left, right, pivot);
|
||||||
|
//# int newPivot = getData();
|
||||||
|
//# printArray(array, left, right, newPivot);
|
||||||
|
//#
|
||||||
|
//# CountingRequestMonitor countingRm = new CountingRequestMonitor(fgExecutor, rm);
|
||||||
|
//# asyncQuicksort(array, left, newPivot - 1, countingRm);
|
||||||
|
//# asyncQuicksort(array, newPivot + 1, right, countingRm);
|
||||||
|
//# countingRm.setDoneCount(2);
|
||||||
|
//#else
|
||||||
|
asyncPartition(
|
||||||
|
array, left, right, pivot,
|
||||||
|
new DataRequestMonitor<Integer>(fgExecutor, rm) {
|
||||||
|
@Override
|
||||||
|
protected void handleCompleted() {
|
||||||
|
int newPivot = getData();
|
||||||
|
printArray(array, left, right, newPivot);
|
||||||
|
|
||||||
|
CountingRequestMonitor countingRm = new CountingRequestMonitor(fgExecutor, rm);
|
||||||
|
asyncQuicksort(array, left, newPivot - 1, countingRm);
|
||||||
|
asyncQuicksort(array, newPivot + 1, right, countingRm);
|
||||||
|
countingRm.setDoneCount(2);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
} else {
|
||||||
|
rm.done();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//#ifdef request_monitors_ex2
|
||||||
|
//# // TODO: Request Monitors Exercise 2 - Convert partition to an async. method.
|
||||||
|
//# static int partition(int[] array, int left, int right, int pivot)
|
||||||
|
//#else
|
||||||
|
static void asyncPartition(int[] array, int left, int right, int pivot, DataRequestMonitor<Integer> rm)
|
||||||
|
//#endif
|
||||||
|
{
|
||||||
|
int pivotValue = array[pivot];
|
||||||
|
array[pivot] = array[right];
|
||||||
|
array[right] = pivotValue;
|
||||||
|
int store = left;
|
||||||
|
for (int i = left; i < right; i++) {
|
||||||
|
if (array[i] <= pivotValue) {
|
||||||
|
int tmp = array[store];
|
||||||
|
array[store] = array[i];
|
||||||
|
array[i] = tmp;
|
||||||
|
store++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
array[right] = array[store];
|
||||||
|
array[store] = pivotValue;
|
||||||
|
|
||||||
|
//#ifdef request_monitors_ex2
|
||||||
|
//# // TODO: Request Monitors Exercise 2 - Convert partition to an async. method.
|
||||||
|
//# return store;
|
||||||
|
//#else
|
||||||
|
rm.setData(store);
|
||||||
|
rm.done();
|
||||||
|
//#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void printArray(int[] array, int left, int right, int pivot) {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
for (int i = 0; i < array.length; i++ ) {
|
||||||
|
if (i == left) {
|
||||||
|
buffer.append('>');
|
||||||
|
} else if (i == pivot) {
|
||||||
|
buffer.append('-');
|
||||||
|
} else {
|
||||||
|
buffer.append(' ');
|
||||||
|
}
|
||||||
|
buffer.append(array[i]);
|
||||||
|
|
||||||
|
if (i == right) {
|
||||||
|
buffer.append('<');
|
||||||
|
} else if (i == pivot) {
|
||||||
|
buffer.append('-');
|
||||||
|
} else {
|
||||||
|
buffer.append(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println(buffer);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,292 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2005, 2008 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
* Bjorn Freeman-Benson - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.dd.examples.ant.tasks;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.Vector;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.tools.ant.BuildException;
|
||||||
|
import org.apache.tools.ant.DirectoryScanner;
|
||||||
|
import org.apache.tools.ant.Task;
|
||||||
|
import org.apache.tools.ant.types.FileSet;
|
||||||
|
import org.apache.tools.ant.util.FileUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Java preprocessor for code examples. Used to export source code for
|
||||||
|
* example plug-ins with parts of code missing/inserted etc., for
|
||||||
|
* various exercises.
|
||||||
|
* <p>
|
||||||
|
* The preprocessor looks for #ifdef statements in java comments, and is
|
||||||
|
* run with a set of symbols. For example:
|
||||||
|
* <pre>
|
||||||
|
* //#ifdef ex1
|
||||||
|
* ... code to insert when 'ex1' symbol is on
|
||||||
|
* //#else
|
||||||
|
* ... code to insert when not 'ex1'
|
||||||
|
* //#endif
|
||||||
|
* </pre>
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public class PreProcessor extends Task {
|
||||||
|
|
||||||
|
private Vector fFileSets = new Vector();
|
||||||
|
private File fDestDir = null;
|
||||||
|
private Set fSymbols = new HashSet();
|
||||||
|
private FileUtils fUtils = FileUtils.getFileUtils();
|
||||||
|
|
||||||
|
// possible states
|
||||||
|
private static final int STATE_OUTSIDE_CONDITION = 0;
|
||||||
|
private static final int STATE_TRUE_CONDITION = 1;
|
||||||
|
private static final int STATE_FALSE_CONDITION = 2;
|
||||||
|
private static final int STATE_POST_TRUE_CONDITION = 3;
|
||||||
|
|
||||||
|
// matchers
|
||||||
|
private Matcher IF_DEF_MATCHER = Pattern.compile("#ifdef\\s+\\w+").matcher("");
|
||||||
|
private Matcher ELSE_IF_MATCHER = Pattern.compile("#elseif\\s+\\w+").matcher("");
|
||||||
|
private Matcher ELSE_MATCHER = Pattern.compile("#else$|#else\\W+").matcher("");
|
||||||
|
private Matcher END_MATCHER = Pattern.compile("#endif").matcher("");
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new preprocessor task
|
||||||
|
*/
|
||||||
|
public PreProcessor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a set of files to process.
|
||||||
|
*
|
||||||
|
* @param set a set of files to process
|
||||||
|
*/
|
||||||
|
public void addFileset(FileSet set) {
|
||||||
|
fFileSets.addElement(set);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the destination directory for processed files.
|
||||||
|
*
|
||||||
|
* @param destDir destination directory for processed files
|
||||||
|
*/
|
||||||
|
public void setDestdir(File destDir) {
|
||||||
|
fDestDir = destDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the symbols that are "on" for the preprocessing.
|
||||||
|
*
|
||||||
|
* @param symbols symbols that are "on" for the preprocessing
|
||||||
|
*/
|
||||||
|
public void setSymbols(String symbols) {
|
||||||
|
String[] strings = symbols.split(",");
|
||||||
|
for (int i = 0; i < strings.length; i++) {
|
||||||
|
String string = strings[i].trim();
|
||||||
|
if (string.length() > 0) {
|
||||||
|
fSymbols.add(string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute() throws BuildException {
|
||||||
|
if (fSymbols.size() == 0) {
|
||||||
|
throw new BuildException("No symbols specified for preprocessor");
|
||||||
|
}
|
||||||
|
if (fFileSets.isEmpty()) {
|
||||||
|
throw new BuildException("No filesets specified for processing");
|
||||||
|
}
|
||||||
|
if (!fDestDir.exists()) {
|
||||||
|
throw new BuildException("destdir does not exist: " + fDestDir.getAbsolutePath());
|
||||||
|
}
|
||||||
|
StringBuffer buf = new StringBuffer("Symbols: ");
|
||||||
|
String[] symbols = (String[]) fSymbols.toArray(new String[fSymbols.size()]);
|
||||||
|
for (int i = 0; i < symbols.length; i++) {
|
||||||
|
String symbol = symbols[i];
|
||||||
|
buf.append(symbol);
|
||||||
|
if(i < (symbols.length -1)) {
|
||||||
|
buf.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log(buf.toString());
|
||||||
|
|
||||||
|
Iterator fileSets = fFileSets.iterator();
|
||||||
|
while (fileSets.hasNext()) {
|
||||||
|
FileSet fileSet = (FileSet) fileSets.next();
|
||||||
|
DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject());
|
||||||
|
String[] includedFiles = scanner.getIncludedFiles();
|
||||||
|
File baseDir = fileSet.getDir(getProject());
|
||||||
|
for (int i = 0; i < includedFiles.length; i++) {
|
||||||
|
String fileName = includedFiles[i];
|
||||||
|
processFile(baseDir, fileName, fDestDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the file
|
||||||
|
* @param baseDir base directory source file is relative to
|
||||||
|
* @param fileName source file name
|
||||||
|
* @param destDir root destination directory
|
||||||
|
*/
|
||||||
|
private void processFile(File baseDir, String fileName, File destDir) throws BuildException {
|
||||||
|
File destFile = new File(destDir, fileName);
|
||||||
|
File srcFile = new File(baseDir, fileName);
|
||||||
|
File dir = destFile.getParentFile();
|
||||||
|
if (!dir.exists()) {
|
||||||
|
dir.mkdirs();
|
||||||
|
}
|
||||||
|
String contents = null;
|
||||||
|
if (fileName.endsWith(".java")) {
|
||||||
|
contents = preProcessFile(srcFile, "//#");
|
||||||
|
} else if (fileName.equals("plugin.xml")) {
|
||||||
|
contents = preProcessFile(srcFile, null);
|
||||||
|
}
|
||||||
|
if (contents == null) {
|
||||||
|
// no change, just copy file
|
||||||
|
try {
|
||||||
|
fUtils.copyFile(srcFile, destFile);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new BuildException(e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// write new file
|
||||||
|
FileWriter writer;
|
||||||
|
try {
|
||||||
|
writer = new FileWriter(destFile);
|
||||||
|
writer.write(contents);
|
||||||
|
writer.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new BuildException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Preprocesses a file
|
||||||
|
*
|
||||||
|
* @param srcFile the file to process
|
||||||
|
* @param strip chars to stip off lines in a true condition, or <code>null</code>
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String preProcessFile(File srcFile, String strip) {
|
||||||
|
try {
|
||||||
|
FileReader fileReader = new FileReader(srcFile);
|
||||||
|
BufferedReader reader = new BufferedReader(fileReader);
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
String line = reader.readLine();
|
||||||
|
String activeSymbol = null;
|
||||||
|
int state = STATE_OUTSIDE_CONDITION;
|
||||||
|
boolean changed = false;
|
||||||
|
while (line != null) {
|
||||||
|
boolean ifdef = IF_DEF_MATCHER.reset(line).find();
|
||||||
|
boolean elseif = ELSE_IF_MATCHER.reset(line).find();
|
||||||
|
boolean elze = ELSE_MATCHER.reset(line).find();
|
||||||
|
boolean endif = END_MATCHER.reset(line).find();
|
||||||
|
boolean commandLine = ifdef || elseif || elze || endif;
|
||||||
|
boolean written = false;
|
||||||
|
switch (state) {
|
||||||
|
case STATE_OUTSIDE_CONDITION:
|
||||||
|
if (ifdef) {
|
||||||
|
String condition = line.substring(IF_DEF_MATCHER.start(), IF_DEF_MATCHER.end());
|
||||||
|
String[] strings = condition.split("\\s+");
|
||||||
|
activeSymbol = strings[1].trim();
|
||||||
|
if (fSymbols.contains(activeSymbol)) {
|
||||||
|
state = STATE_TRUE_CONDITION;
|
||||||
|
} else {
|
||||||
|
state = STATE_FALSE_CONDITION;
|
||||||
|
}
|
||||||
|
} else if (elseif) {
|
||||||
|
throw new BuildException("#elseif encountered without corresponding #ifdef");
|
||||||
|
} else if (elze) {
|
||||||
|
throw new BuildException("#else encountered without corresponding #ifdef (" + srcFile.getPath() + ")");
|
||||||
|
} else if (endif) {
|
||||||
|
throw new BuildException("#endif encountered without corresponding #ifdef");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_TRUE_CONDITION:
|
||||||
|
if (elze || elseif) {
|
||||||
|
state = STATE_POST_TRUE_CONDITION;
|
||||||
|
break;
|
||||||
|
} else if (endif) {
|
||||||
|
state = STATE_OUTSIDE_CONDITION;
|
||||||
|
break;
|
||||||
|
} else if (ifdef) {
|
||||||
|
throw new BuildException("illegal nested #ifdef");
|
||||||
|
}
|
||||||
|
case STATE_FALSE_CONDITION:
|
||||||
|
if (elseif) {
|
||||||
|
String condition = line.substring(ELSE_IF_MATCHER.start(), ELSE_IF_MATCHER.end());
|
||||||
|
String[] strings = condition.split("\\s+");
|
||||||
|
activeSymbol = strings[1].trim();
|
||||||
|
if (fSymbols.contains(activeSymbol)) {
|
||||||
|
state = STATE_TRUE_CONDITION;
|
||||||
|
} else {
|
||||||
|
state = STATE_FALSE_CONDITION;
|
||||||
|
}
|
||||||
|
} else if (elze) {
|
||||||
|
state = STATE_TRUE_CONDITION;
|
||||||
|
break;
|
||||||
|
} else if (endif) {
|
||||||
|
state = STATE_OUTSIDE_CONDITION;
|
||||||
|
break;
|
||||||
|
} else if (ifdef) {
|
||||||
|
throw new BuildException("illegal nested #ifdef");
|
||||||
|
}
|
||||||
|
case STATE_POST_TRUE_CONDITION:
|
||||||
|
if (endif) {
|
||||||
|
state = STATE_OUTSIDE_CONDITION;
|
||||||
|
break;
|
||||||
|
} else if (ifdef) {
|
||||||
|
throw new BuildException("illegal nested #ifdef");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!commandLine) {
|
||||||
|
if (state == STATE_OUTSIDE_CONDITION || state == STATE_TRUE_CONDITION) {
|
||||||
|
if (state == STATE_TRUE_CONDITION && strip != null) {
|
||||||
|
if (line.startsWith(strip)) {
|
||||||
|
line = line.substring(strip.length());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buffer.append(line);
|
||||||
|
buffer.append("\n");
|
||||||
|
written = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
changed = changed || !written;
|
||||||
|
line = reader.readLine();
|
||||||
|
}
|
||||||
|
if (!changed) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return buffer.toString();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new BuildException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
PreProcessor processor = new PreProcessor();
|
||||||
|
processor.setSymbols("ex2");
|
||||||
|
String string = processor.preProcessFile(new File("c:\\eclipse3.1\\dev\\example.debug.core\\src\\example\\debug\\core\\launcher\\PDALaunchDelegate.java"), "//#");
|
||||||
|
//String string = processor.preProcessFile(new File("c:\\eclipse3.1\\dev\\example.debug.core\\plugin.xml"), null);
|
||||||
|
System.out.println(string);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008 Wind River Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Wind River Systems - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
//#ifdef request_monitors_ex1
|
||||||
|
//#package org.eclipse.dd.examples.dsf.requestmonitor.excercise;
|
||||||
|
//#else
|
||||||
|
package org.eclipse.dd.examples.dsf.requestmonitor.answer;
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
import org.eclipse.dd.dsf.concurrent.ImmediateExecutor;
|
||||||
|
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "Hello world" example which uses an asynchronous method to print out
|
||||||
|
* the result.
|
||||||
|
* <p>
|
||||||
|
* The main method uses an immediate executor, which executes runnables
|
||||||
|
* as soon as they are submitted, in creating its request monitor.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class AsyncHelloWorld {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Executor executor = ImmediateExecutor.getInstance();
|
||||||
|
RequestMonitor rm = new RequestMonitor(executor, null);
|
||||||
|
asyncHelloWorld(rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void asyncHelloWorld(RequestMonitor rm) {
|
||||||
|
System.out.println("Hello world");
|
||||||
|
//#ifdef request_monitors_ex1
|
||||||
|
//# // TODO: Request Monitors Exercise 1 - Call a second async.
|
||||||
|
//# // "Hello world 2" method.
|
||||||
|
//# rm.done();
|
||||||
|
//#else
|
||||||
|
RequestMonitor rm2 = new RequestMonitor(ImmediateExecutor.getInstance(), rm);
|
||||||
|
asyncHelloWorld2(rm2);
|
||||||
|
//#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
//#ifdef request_monitors_ex1
|
||||||
|
//# // TODO: Request Monitors Exercise 1 - Add a second async.
|
||||||
|
//# // "Hello world 2" method.
|
||||||
|
//#else
|
||||||
|
static void asyncHelloWorld2(RequestMonitor rm) {
|
||||||
|
System.out.println("Hello world 2");
|
||||||
|
rm.done();
|
||||||
|
}
|
||||||
|
//#endif
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue