Skip to main content

[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();



Back to the top