/* --COPYRIGHT--,EPL
 *  Copyright (c) 2008 Texas Instruments 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:
 *      Texas Instruments - initial implementation
 * 
 * --/COPYRIGHT--*/
/*
 *  ======== display ========
 */
function display(msg, obj)
{
    function genObj(indent, obj)
    {
	if (indent.length >= 16) {
	    return ("...");
	}
	var pindent = "    " + indent;
	
	var str = '' + obj;
	if (obj != null) {
	    str += " {\n";
	    var i;
	    for (i in obj) {
		str += pindent + i + " = " + gen(pindent, obj[i]) + "\n";
	    }
	    str += indent + "}\n";
	}
	return (str);
    }
    function gen(indent, obj)
    {
	if (obj == null) {
	    return (obj + '');
	}
	else if (typeof obj == "object") {
	    return (genObj(indent, obj));
	}
	else {
	    return (obj + '');
	}
    }

    print(msg + gen('', obj));
}

/*
 *  ======== expandString ========
 */
function expandString(cmd, values)
{
    return (String(Packages.xdc.services.intern.xsr.Utils.expandString(cmd, values)));
}

/*
 *  ======== expandDbgName ========
 */
function expandDbgName(cfgName, exeName, pattern)
{
//    print("cfgName = '" + cfgName + "', " + "exeName = '" + exeName);

    /* parse cfgName into a directory and a base name */
    var ca = cfgName.match(/^(.*[\/\\]){0,1}([^\/\\]*)/);
    if (ca[1] == null) {
	ca[1] = "./";
    }

    /* parse exeName into a directory and a base name */
    var ea = exeName.match(/^(.*[\/\\]){0,1}([^\/\\]*)/);
    if (ea[1] == null) {
	ea[1] = "./";
    }

    /* expand the output file name pattern */
    var fname = expandString(pattern, {
	cfgName: ca[2],
	cfgDir: ca[1],
	exeName: ea[2],
	exeDir: ea[1]
    });

    return (fname);
}

/*
 *  ======== parsePlatName ========
 */
function parsePlatName(pName)
{
    var result = {};

    if (pName == null) {
        return (result);
    }

    /* first try old names (defined in BuildEnvironment.platformTable) */
    var pa = pName.split(':');
    result.platPkgName = pa[0];
    var platIName = pa[1];
    if (pa.length > 2) {
        pa.shift();
        platIName = pa.join(":");
    }

    if (platIName == null) {
        /* try new platform naming convention (config param of module) */
        var index = pName.lastIndexOf('.') + 1;
        platIName = pName.substr(index);
        try {
            /* get the instances module */
            var Mod = xdc.useModule(pName.substring(0, index - 1));

            /* check for the specified config param */
            if (!platIName in Mod) {
//                print("can't find '" + platIName + "' in module " + Mod);
                platIName = "";
            }
            else {
                result.instMod = Mod;

                /* get the type name */
                var tmp = String(Mod[platIName].$type);

                /* remove the ".Module" suffix */
                tmp = tmp.substring(0, tmp.lastIndexOf('.'));

                /* remove the ".Platform" suffix */
                result.platPkgName = tmp.substring(0, tmp.lastIndexOf('.'));
            }
        }
        catch (e) {
            platIName = "";
        }
    }

    result.instName = platIName;

//    print(pName + " := " + result.platPkgName + "::" + result.instName);
    return (result);
}
