/*
 * (c) Copyright QNX Software Systems Ltd. 2002.
 * All Rights Reserved.
 */
package org.eclipse.cdt.debug.mi.core.output;

import java.util.ArrayList;
import java.util.List;

/**
 * GDB/MI thread list parsing.
~"\n"
~"     2 Thread 2049 (LWP 29354)  "
~"* 1 Thread 1024 (LWP 29353)  "

 */
public class MIInfoThreadsInfo extends MIInfo {

	int[] threadIds;
	int currentThreadId;

	public MIInfoThreadsInfo(MIOutput out) {
		super(out);
		parse();
	}

	public int[] getThreadIds() {
		return threadIds;
	}

	public int getCurrentThread() {
		return currentThreadId;
	}

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

	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) {
				}
			}
		}
	}
}
