/*******************************************************************************
 * Copyright (c) 2013 AdaCore 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:
 *     Philippe Gil (AdaCore) - Initial API and implementation
 *     Marc-Andre Laperle (Ericsson) - Fix parsing for old versions of GDB
 *******************************************************************************/

package org.eclipse.cdt.dsf.mi.service.command.output;

/**
 * '-gdb-show language' returns the current source language.
 *
 * sample output:
 *
 * -gdb-show language
 * ^done,value="auto"
 *
 * GDB 6.2-6.8:
 * -gdb-show language
 * ^done,value="auto; currently c"
 *
 * the different returned values are:
 * 
 * (gdb) help set language
 * Set the current source language.
 * The currently understood settings are:
 *
 * local or auto    Automatic setting based on source file
 * ada              Use the Ada language
 * c                Use the C language
 * c++              Use the C++ language
 * asm              Use the Asm language
 * minimal          Use the Minimal language
 * d                Use the D language
 * fortran          Use the Fortran language
 * objective-c      Use the Objective-c language
 * go               Use the Go language
 * java             Use the Java language
 * modula-2         Use the Modula-2 language
 * opencl           Use the Opencl language
 * pascal           Use the Pascal language
 *
 * @since 4.3
 */
public class MIGDBShowLanguageInfo extends MIInfo {

	public static final String LOCAL = "local"; //$NON-NLS-1$
	public static final String AUTO = "auto"; //$NON-NLS-1$

	public static final String ADA = "ada"; //$NON-NLS-1$
	public static final String C = "c"; //$NON-NLS-1$
	public static final String C_PLUS_PLUS = "c++"; //$NON-NLS-1$
	public static final String ASM = "asm"; //$NON-NLS-1$
	public static final String MINIMAL = "minimal"; //$NON-NLS-1$
	public static final String D = "d"; //$NON-NLS-1$
	public static final String FORTRAN = "fortran"; //$NON-NLS-1$
	public static final String OBJECTIVE_C = "objective-c"; //$NON-NLS-1$
	public static final String GO = "go"; //$NON-NLS-1$
	public static final String JAVA = "java"; //$NON-NLS-1$
	public static final String MODULA_2 = "modula-2"; //$NON-NLS-1$
	public static final String OPENCL = "opencl"; //$NON-NLS-1$
	public static final String PASCAL = "pascal"; //$NON-NLS-1$

	private String fLanguage = AUTO;

	public MIGDBShowLanguageInfo(MIOutput record) {
		super(record);
		parse();
	}

	protected void parse() {
        if (isDone()) {
            MIOutput out = getMIOutput();
            MIResultRecord outr = out.getMIResultRecord();
            if (outr != null) {
                MIResult[] results =  outr.getMIResults();
                for (int i = 0; i < results.length; i++) {
                    String var = results[i].getVariable();
                    if (var.equals("value")) { //$NON-NLS-1$
                        MIValue value = results[i].getMIValue();
                        if (value instanceof MIConst) {
                            fLanguage = ((MIConst)value).getString();

                            // Some versions of GDB (6.2-6.8) output "auto; currently c"
                            // so we need to remove the semicolon part
                            int semiColonIdx = fLanguage.indexOf(';');
                            if (semiColonIdx != -1) {
                                fLanguage = fLanguage.substring(0, semiColonIdx);
                            }
                        }
                    }
                }
            }
        }
	}

	public String getLanguage() {
		return fLanguage;
	}
}
