/*
 * 
 * Copyright 2001-2004 The Ant-Contrib project
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package net.sf.antcontrib.cpptasks.userdefine;
public class UserDefineMapping {
    // list of Arch: EBC, ARM, IA32, X64, IPF, PPC, NT32
    public final static String[] arch = { "EBC", "ARM", "IA32", "X64", "IPF",
            "PPC", "NT32" };

    // list of OS: Linux, Windows
    public final static String[] os = { "WINDOWS", "LINUX" };

    // list of Vendor: Microsoft, Intel, Cygwin, Gcc
    public final static String[] vendor = { "MSFT", "INTEL", "GCC", "CYGWIN" };

    // list of Command Type: CC, LIB, LINK, ASL, ASM, ASMLINK
    public final static String[] commandType = { "CC", "LIB", "LINK", "ASL",
            "ASM", "ASMLINK", "PP" };

    //
    // flags mapping (Include compellingIncFileFlag,Path Delimiter, Output file
    // flag,
    // includepathfalge,
    // )
    // Examples: '/I' for MSFT cl.exe while '-I' for GCC
    // '/Fo' for MSFT cl.exe while '-o' for GCC
    //
    public final static String[][] compellingIncFileFlag = {
            { "MSFT_CC", "/FI" }, { "GCC_CC", "-include" },
            { "INTEL_CC", "-FI" }, { "WINDDK_CC", "/FI" },
            { "MSFT_ASM", "/FI" }, { "GCC_ASM", "-include" },
            { "WINDDK_ASM", "/FI" } };

    public final static String[][] includePathFlag = { { "MSFT_CC", "/I" },
            { "GCC_CC", "-I" }, { "INTEL_CC", "/I" }, { "WINDDK_CC", "/I" },
            { "MSFT_ASM", "/I" }, { "GCC_ASM", "-I" }, { "WINDDK_CC", "/I" },
            { "MSFT_PP", "/I" }, { "GCC_PP", "-I" }, { "WINDDK_PP", "/I" } };

    public final static String[][] outputFileFlag = { { "MSFT_CC", "/Fo" },
            { "GCC_CC", "-o" }, { "INTEL_CC", "/Fo" }, { "WINDDK_CC", "/Fo" },
            { "MSFT_LIB", "/OUT:" }, { "GCC_LIB", "-cr" },
            { "INTEL_LIB", "/OUT:" }, { "WINDDK_LIB", "/OUT:" },
            { "MSFT_LINK", "/OUT:" }, { "GCC_LINK", "-o" },
            { "INTEL_LINK", "/OUT:" }, { "WINDDK_LINK", "/OUT:" },
            { "MSFT_ASM", "/Fo" }, { "GCC_ASM", "-o" },
            { "WINDDK_ASM", "/Fo" },{"WINDDK_IPF_ASM", "-o"} };

    public final static String[][] subSystemFlag = {
            { "MSFT_LIB", "/SUBSYSTEM:" }, { "GCC_LIB", "--subsystem=" },
            { "WINDDk_LIB", "/SUBSYSTEM:" }, { "INTEL_LIB", "/SUBSYSTEM:" },
            { "MSFT_LINK", "/SUBSYSTEM:" }, { "GCC_LINK", "--subsystem=" },
            { "INTEL_LINK", "/SUBSYSTEM:" }, { "WINDDK_LINK", "/SUBSYSTEM:" } };

    public final static String[][] outputFileSuffix = {
            { "WINDOWS_ASM", ".obj" }, { "WINDOWS_CC", ".obj" },
            { "LINUX_ASM", ".o" }, { "LINUX_CC", ".o" } };

    public final static String[][] entryPointFlag = {
            { "MSFT_LINK", "/ENTRY:" }, { "GCC_LINK", "-e" },
            { "INTEL_LINK", "/ENTRY:" },
            { "WINDDK_LINK", "/ENTRY:" } };

    public final static String[][] mapFlag = { { "MSFT_LINK", "/MAP:" },
            { "GCC_LINK", "" }, { "INTEL_LINK", "/MAP:" },
            { "WINDDK_LINK", "/MAP:" } };

    public final static String[][] pdbFlag = { { "MSFT_LINK", "/PDB:" },
            { "GCC_LINK", "" }, { "INTEL_LINK", "" }, { "WINDDK_LINK", "/PDB:"} };

    public static String getIncludePathDelimiter(String vendor,
            String commandType) {
        String key = vendor + "_" + commandType;
        for (int i = 0; i < includePathFlag.length; i++) {
            if (includePathFlag[i][0].equalsIgnoreCase(key)) {
                return includePathFlag[i][1];
            }
        }
        return null;
    }

    public static String getOutputFileFlag(String vendor, String arch, String commandType) {
        /*
         * First find outputfileFlag by vendor_arch_commandType
         */
        String key = vendor + "_" + arch + "_" + commandType;
        for (int i = 0; i < outputFileFlag.length; i++) {
            if (outputFileFlag[i][0].equalsIgnoreCase(key)) {
                return outputFileFlag[i][1];
            }
        }
        key = vendor + "_" + commandType;
        for (int i = 0; i < outputFileFlag.length; i++) {
            if (outputFileFlag[i][0].equalsIgnoreCase(key)) {
                return outputFileFlag[i][1];
            }
        }
        return null;
    }

    public static String getCompellingIncFileFlag(String vendor,
            String commandType) {
        String key = vendor + "_" + commandType;
        for (int i = 0; i < compellingIncFileFlag.length; i++) {
            if (compellingIncFileFlag[i][0].equalsIgnoreCase(key)) {
                return compellingIncFileFlag[i][1];
            }
        }
        return null;
    }

    public static String getSubSystemFlag(String vendor, String commandType) {
        String key = vendor + "_" + commandType;
        for (int i = 0; i < subSystemFlag.length; i++) {
            if (subSystemFlag[i][0].equalsIgnoreCase(key)) {
                return subSystemFlag[i][1];
            }
        }
        return null;
    }

    public static String getEntryPointFlag(String vendor, String commandType) {
        String key = vendor + "_" + commandType;
        for (int i = 0; i < entryPointFlag.length; i++) {
            if (entryPointFlag[i][0].equalsIgnoreCase(key)) {
                return entryPointFlag[i][1];
            }
        }
        return null;
    }

    public static String getMapFlag(String vendor, String commandType) {
        String key = vendor + "_" + commandType;
        for (int i = 0; i < mapFlag.length; i++) {
            if (mapFlag[i][0].equalsIgnoreCase(key)) {
                return mapFlag[i][1];
            }
        }
        return null;
    }

    public static String getPdbFlag(String vendor, String commandType) {
        String key = vendor + "_" + commandType;
        for (int i = 0; i < pdbFlag.length; i++) {
            if (pdbFlag[i][0].equalsIgnoreCase(key)) {
                return pdbFlag[i][1];
            }
        }
        return null;
    }

    //
    // Well-known source file suffix and output file suffix relationship
    // sourceExtension(Multiple),
    // headExtension(Multiple) and outputSuffix(Single)
    //

    //
    // Default command string such as 'cl' in MSFT while 'gcc' in GCC
    //
    public final static String[][] defaultCommand = { { "GCC", "gcc" },
            { "MSFT_CC", "cl" }, { "MSFT_LIB", "lib" },
            { "MSFT_LINK", "link" }, };

    public static String getDefaultCommand(String toolchain) {
        for (int i = 0; i < defaultCommand.length; i++) {
            if (defaultCommand[i][0].equalsIgnoreCase(toolchain)) {
                return defaultCommand[i][1];
            }
        }
        return null;
    }

}