[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Builder fixes
|
2002-11-22 Alain Magloire
* src/.../cdt/core/CommandLauncher.java (waitAndRead):
Make sure we drain the pipes.
(printCommandLine): Use the line.separator property.
* src/org/eclipse/cdt/ErrorParserManager.java
Check if outputStream is not null before using it.
(write): must be synchronized.
(checkLine): Break the buffer per line and pass it to processLine().
Takes an argument to flush when we are done(on close()).
* src/.../internal/core/CBuilder.java (invokeMake):
We have to call close() the same number of times we call
ErrorParserManager.getOutputStream(). Move the ErrorParerManager.reportProblem()
after the close.
Index: org/eclipse/cdt/core/CommandLauncher.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java,v
retrieving revision 1.2
diff -u -r1.2 CommandLauncher.java
--- org/eclipse/cdt/core/CommandLauncher.java 22 Nov 2002 14:53:48 -0000 1.2
+++ org/eclipse/cdt/core/CommandLauncher.java 24 Nov 2002 15:48:21 -0000
@@ -30,6 +30,8 @@
protected String fErrorMessage;
+ private String lineSeparator;
+
/**
* The number of milliseconds to pause
* between polling.
@@ -44,6 +46,7 @@
public CommandLauncher() {
fProcess= null;
fShowCommand= false;
+ lineSeparator = System.getProperty("line.separator", "\n");
}
/**
@@ -173,6 +176,25 @@
//e.printStackTrace();
}
+ // Drain the pipes.
+ try {
+ while (errInPipe.available() > 0 || inputPipe.available() > 0) {
+ if ( errInPipe.available() > 0 ) {
+ nbytes = errInPipe.read(buffer);
+ err.write(buffer, 0, nbytes);
+ err.flush();
+ }
+ if ( inputPipe.available() > 0 ) {
+ nbytes = inputPipe.read(buffer);
+ out.write(buffer, 0, nbytes);
+ out.flush();
+ }
+ }
+ errInPipe.close();
+ inputPipe.close();
+ } catch (IOException e) {
+ }
+
return state;
}
@@ -183,7 +205,7 @@
buf.append(commandArgs[i]);
buf.append(' ');
}
- buf.append('\n');
+ buf.append(lineSeparator);
try {
os.write(buf.toString().getBytes());
os.flush();
Index: org/eclipse/cdt/core/ErrorParserManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java,v
retrieving revision 1.6
diff -u -r1.6 ErrorParserManager.java
--- org/eclipse/cdt/core/ErrorParserManager.java 7 Nov 2002 03:19:25 -0000 1.6
+++ org/eclipse/cdt/core/ErrorParserManager.java 24 Nov 2002 15:48:21 -0000
@@ -288,7 +288,8 @@
}
/**
- * Method getInputStream.
+ * Method getOutputStream. It has a reference count
+ * the stream must be close the same number of time this method was call.
* @return OutputStream
*/
public OutputStream getOutputStream() {
@@ -303,7 +304,9 @@
if (nOpens > 0 && --nOpens == 0) {
fDirectoryStack.removeAllElements();
fBaseDirectory = null;
- outputStream.close();
+ if (outputStream != null)
+ outputStream.close();
+ checkLine(true);
}
}
@@ -311,16 +314,18 @@
* @see java.io.OutputStream#flush()
*/
public void flush() throws IOException {
- outputStream.flush();
+ if (outputStream != null)
+ outputStream.flush();
}
/**
* @see java.io.OutputStream#write(int)
*/
- public void write(int b) throws IOException {
+ public synchronized void write(int b) throws IOException {
currentLine.append((char) b);
- checkLine();
- outputStream.write(b);
+ checkLine(false);
+ if (outputStream != null)
+ outputStream.write(b);
}
public synchronized void write(byte[] b, int off, int len) throws IOException {
@@ -334,24 +339,34 @@
return;
}
currentLine.append(new String(b, 0, len));
- checkLine();
- outputStream.write(b, off, len);
+ checkLine(false);
+ if (outputStream != null)
+ outputStream.write(b, off, len);
}
- private void checkLine() {
- String line = currentLine.toString();
- if (line.endsWith("\n")) {
- // Remove the training new lines.
- line = line.trim();
+ private void checkLine(boolean flush) {
+ String buffer = currentLine.toString();
+ int i = 0;
+ while ((i = buffer.indexOf('\n')) != -1) {
+ String line = buffer.substring(0, i).trim(); // get rid of any trailing \r
processLine(line);
previousLine = line;
- currentLine.setLength(0);
+ buffer = buffer.substring(i + 1); // skip the \n and advance
+ }
+ currentLine.setLength(0);
+ if (flush) {
+ if (buffer.length() > 0) {
+ processLine(buffer);
+ previousLine = buffer;
+ }
+ } else {
+ currentLine.append(buffer);
}
}
public boolean reportProblems() {
- boolean reset = false;
- if (nOpens == 0) {
+ boolean reset = false;
+ if (nOpens == 0) {
Iterator iter = fErrors.iterator();
while (iter.hasNext()) {
Problem problem = (Problem) iter.next();
@@ -365,8 +380,7 @@
problem.description,
problem.severity,
problem.variableName);
- }
- else {
+ } else {
fMarkerGenerator.addMarker(
problem.file,
problem.lineNumber,
Index: org/eclipse/cdt/internal/CCorePluginResources.properties
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/CCorePluginResources.properties,v
retrieving revision 1.2
diff -u -r1.2 CCorePluginResources.properties
--- org/eclipse/cdt/internal/CCorePluginResources.properties 26 Jul 2002 19:15:13 -0000 1.2
+++ org/eclipse/cdt/internal/CCorePluginResources.properties 24 Nov 2002 15:48:23 -0000
@@ -4,4 +4,4 @@
# All Rights Reserved.
#
################################################
-
\ No newline at end of file
+CBuilder.build_error= Build Error
\ No newline at end of file
Index: org/eclipse/cdt/internal/core/CBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java,v
retrieving revision 1.14
diff -u -r1.14 CBuilder.java
--- org/eclipse/cdt/internal/core/CBuilder.java 22 Nov 2002 17:03:34 -0000 1.14
+++ org/eclipse/cdt/internal/core/CBuilder.java 24 Nov 2002 15:48:23 -0000
@@ -5,6 +5,7 @@
* All Rights Reserved.
*/
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
@@ -141,9 +142,11 @@
}
ErrorParserManager epm = new ErrorParserManager(this);
epm.setOutputStream(cos);
+ OutputStream stdout = epm.getOutputStream();
+ OutputStream stderr = epm.getOutputStream();
launcher.execute(makepath, userArgs, env, workingDirectory);
- if (launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), subMonitor) != CommandLauncher.OK)
+ if (launcher.waitAndRead(stdout, stderr, subMonitor) != CommandLauncher.OK)
errMsg = launcher.getErrorMessage();
isCanceled = monitor.isCanceled();
@@ -160,8 +163,6 @@
subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN);
subMonitor.subTask("Parsing");
- epm.reportProblems();
-
if (errMsg != null) {
String errorDesc = CCorePlugin.getFormattedString(BUILD_ERROR, makepath.toString());
StringBuffer buf = new StringBuffer(errorDesc);
@@ -170,12 +171,16 @@
cos.write(buf.toString().getBytes());
cos.flush();
}
+
+ stdout.close();
+ stderr.close();
+
+ epm.reportProblems();
+
subMonitor.done();
monitor.setCanceled(isCanceled);
- cos.close();
}
- }
- catch (Exception e) {
+ } catch (Exception e) {
CCorePlugin.log(e);
}
monitor.done();