Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--valgrind/org.eclipse.linuxtools.valgrind.core/ChangeLog5
-rw-r--r--valgrind/org.eclipse.linuxtools.valgrind.core/src/org/eclipse/linuxtools/internal/valgrind/core/ValgrindCoreParser.java111
2 files changed, 116 insertions, 0 deletions
diff --git a/valgrind/org.eclipse.linuxtools.valgrind.core/ChangeLog b/valgrind/org.eclipse.linuxtools.valgrind.core/ChangeLog
index 35777382d4..2cc1d653df 100644
--- a/valgrind/org.eclipse.linuxtools.valgrind.core/ChangeLog
+++ b/valgrind/org.eclipse.linuxtools.valgrind.core/ChangeLog
@@ -1,3 +1,8 @@
+2010-09-13 Elliott Baron <ebaron@fedoraproject.org>
+
+ * src/org/eclipse/linuxtools/internal/valgrind/core/ValgrindCoreParser.java (ValgrindCoreParser): Handle warning
+ messages.
+
2010-08-25 Elliott Baron <ebaron@fedoraproject.org>
* META-INF/MANIFEST.MF: Bump version to 0.6.1.
diff --git a/valgrind/org.eclipse.linuxtools.valgrind.core/src/org/eclipse/linuxtools/internal/valgrind/core/ValgrindCoreParser.java b/valgrind/org.eclipse.linuxtools.valgrind.core/src/org/eclipse/linuxtools/internal/valgrind/core/ValgrindCoreParser.java
new file mode 100644
index 0000000000..403bbf7cbb
--- /dev/null
+++ b/valgrind/org.eclipse.linuxtools.valgrind.core/src/org/eclipse/linuxtools/internal/valgrind/core/ValgrindCoreParser.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat, Inc.
+ * 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:
+ * Elliott Baron <ebaron@redhat.com> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.linuxtools.internal.valgrind.core;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.linuxtools.valgrind.core.IValgrindMessage;
+
+public class ValgrindCoreParser extends AbstractValgrindTextParser {
+ private static final String AT = "at"; //$NON-NLS-1$
+ private static final String BY = "by"; //$NON-NLS-1$
+
+ protected List<IValgrindMessage> messages;
+ protected int pid;
+ protected ILaunch launch;
+
+ public ValgrindCoreParser(File inputFile, ILaunch launch) throws IOException {
+ this.launch = launch;
+ BufferedReader br = new BufferedReader(new FileReader(inputFile));
+ // keep track of nested messages and their corresponding indents
+ Stack<IValgrindMessage> messageStack = new Stack<IValgrindMessage>();
+ Stack<Integer> indentStack = new Stack<Integer>();
+ messages = new ArrayList<IValgrindMessage>();
+
+ try {
+ pid = parsePID(inputFile.getName(), CommandLineConstants.LOG_PREFIX);
+ String line;
+ while ((line = br.readLine()) != null) {
+ // remove PID string
+ // might encounter warnings also #325130
+ line = line.replaceFirst("==\\d+==|\\*\\*\\d+\\*\\*", EMPTY_STRING); //$NON-NLS-1$
+
+ int indent;
+ for (indent = 0; indent < line.length()
+ && line.charAt(indent) == ' '; indent++)
+ ;
+
+ line = line.trim();
+ if (!line.equals(EMPTY_STRING)) {
+ /*
+ * indent == 1 -> top level message
+ * indent > 1 -> child message
+ * indent == 0 -> should not occur
+ */
+ if (indent == 1) {
+ // top-level message, clear stacks
+ IValgrindMessage message = getMessage(null, line);
+ messages.add(message);
+ messageStack.clear();
+ messageStack.push(message);
+ indentStack.clear();
+ indentStack.push(indent);
+ }
+ else if (indent > 1) {
+ // find this message's parent
+ while (indent <= indentStack.peek()) {
+ messageStack.pop();
+ indentStack.pop();
+ }
+
+ messageStack.push(getMessage(messageStack.peek(), line));
+ indentStack.push(indent);
+ }
+ }
+ }
+ } finally {
+ if (br != null) {
+ br.close();
+ }
+ }
+ }
+
+ protected IValgrindMessage getMessage(IValgrindMessage message, String line) throws IOException {
+ if (line.startsWith(AT) || line.startsWith(BY)) {
+ Object[] parsed = parseFilename(line);
+ String filename = (String) parsed[0];
+ int lineNo = (Integer) parsed[1];
+ return new ValgrindStackFrame(message, line, launch, filename, lineNo);
+ }
+ return new ValgrindError(message, line, launch, pid);
+ }
+
+ public IValgrindMessage[] getMessages() {
+ return messages.toArray(new IValgrindMessage[messages.size()]);
+ }
+
+ public void printMessages(IValgrindMessage m, int indent) {
+ for (int i = 0; i < indent; i++) {
+ System.out.print(SPACE);
+ }
+ System.out.println(m.getText());
+ for (IValgrindMessage child : m.getChildren()) {
+ printMessages(child, indent + 1);
+ }
+ }
+}

Back to the top