/*******************************************************************************
* Copyright (c) 2000, 2006 QNX Software 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.output;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* GDB/MI thread list parsing.
~"\n"
~" 2 Thread 2049 (LWP 29354) "
~"* 1 Thread 1024 (LWP 29353) "
*/
public class CLIInfoThreadsInfo extends MIInfo {
protected int[] threadIds;
protected int currentThreadId;
public CLIInfoThreadsInfo(MIOutput out) {
super(out);
parse();
}
public int[] getThreadIds() {
return threadIds;
}
public String[] getThreadNames() {
return null;
}
public int getCurrentThread() {
return currentThreadId;
}
protected void parse() {
List aList = new ArrayList();
if (isDone()) {
MIOutput out = getMIOutput();
MIOOBRecord[] oobs = out.getMIOOBRecords();
for (int i = 0; i < oobs.length; i++) {
if (oobs[i] instanceof MIConsoleStreamOutput) {
MIStreamRecord cons = (MIStreamRecord) oobs[i];
String str = cons.getString();
// We are interested in finding the current thread
parseThreadInfo(str.trim(), aList);
}
}
}
threadIds = new int[aList.size()];
for (int i = 0; i < aList.size(); i++) {
threadIds[i] = ((Integer) aList.get(i)).intValue();
}
Arrays.sort(threadIds);
}
protected void parseThreadInfo(String str, List aList) {
if (str.length() > 0) {
boolean isCurrentThread = false;
// Discover the current thread
if (str.charAt(0) == '*') {
isCurrentThread = true;
str = str.substring(1).trim();
}
// Fetch the threadId
if (str.length() > 0 && Character.isDigit(str.charAt(0))) {
int i = 1;
while (i < str.length() && Character.isDigit(str.charAt(i))) {
i++;
}
String number = str.substring(0, i);
try {
Integer num = Integer.valueOf(number);
aList.add(num);
if (isCurrentThread) {
currentThreadId = num.intValue();
}
} catch (NumberFormatException e) {
}
}
}
}
}