/*******************************************************************************
 * Copyright (c) 2010, 2015 QNX Software Systems, Freescale Semiconductor and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Freescale Semiconductor, QNX Software Systems - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.dsf.mi.service.command.output;

import java.util.StringTokenizer;

/**
 * @since 3.0
 */
public class CLIInfoProgramInfo extends MIInfo {

	Long fPid;

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

	/**
	 * Return the inferior's PID reported in the output, or null if we didn't
	 * find it there.
	 */
	public Long getPID() {
		return fPid;
	}

	void parse() {
		if (isDone()) {
			MIOutput out = getMIOutput();
			MIOOBRecord[] oobs = out.getMIOOBRecords();
			for (MIOOBRecord oob : oobs) {
				if (oob instanceof MIConsoleStreamOutput) {
					parseLine(((MIConsoleStreamOutput) oob).getString());

					// quit parsing output once we have everything we want out
					// of it
					if (fPid != null) {
						break;
					}
				}
			}
		}
	}

	void parseLine(String str) {
		// Sample output on Windows:
		// 		[New thread 4960.0x5d8]
		// 			Using the running image of child thread 4960.0x5d8.
		// 		Program stopped at 0x4012f5.
		// 		It stopped at a breakpoint that has since been deleted.

		if (str != null && !str.isEmpty()) {
			str = str.replace('.', ' ').trim();
			if (str.startsWith("Using")) { //$NON-NLS-1$
				StringTokenizer st = new StringTokenizer(str);
				while (st.hasMoreTokens()) {
					String s = st.nextToken();
					/* Not a process id if LWP is reported */
					if (s.equals("LWP")) //$NON-NLS-1$
						break;

					if (Character.isDigit(s.charAt(0))) {
						try {
							fPid = Long.decode(s).longValue();
							break;
						} catch (NumberFormatException e) {
						}
					}
				}
			}
		}
	}
}
