/*    /secure/sefun/identify.c
 *    from the Dead Souls LPC Library
 *    represent a variable of any type as a string, now out of date
 *    remains for backwards compat
 *    created by Pallando@Dead Souls (Douglas Reay) 921212
 */
string identify( mixed a )
{
    int i, s;
    string ret;
    mapping RealMap;
    if( undefinedp( a ) ) return "UNDEFINED";
    if( nullp( a ) ) return "0";
    if( intp( a ) ) return "" + a;
    if( floatp( a ) ) return "" + a;
    if( objectp( a ) )
    {
	if( ret = a-> GetKeyName() ) ret += " ";
	else ret = "";
	return "OBJ(" + ret + file_name( a ) + ")";
    }
    if( stringp( a ) )
    {
	a = replace_string( a, "\"", "\\\"" );
	a = "\"" + a + "\"";
	a = replace_string( a, "\\", "\\\\" );
	a = replace_string( a, "\\\"", "\"" );
	a = replace_string( a, "\n", "\\n" );
	a = replace_string( a, "\t", "\\t" );
	return a;
    }
    if( pointerp( a ) ) 
    {
	ret = "({ ";
	s = sizeof( a );
	for( i = 0 ; i < s ; i++ )
	{
	    if( i ) ret += ", ";
	    ret += identify( a[i] );
	}
	return ret + ( s ? " " : "" ) + "})";
    }
    if( mapp( a ) )
    {
	ret = "([ ";
	RealMap = (mapping)(a);
	a = keys( RealMap );
	s = sizeof( a );
	for( i = 0 ; i < s ; i++ )
	{
	    if( i ) ret += ", ";
	    ret += identify( a[i] ) + " : " + identify( RealMap[a[i]] );
	}
	return ret + ( s ? " " : "" ) + "])";
    }
    if(functionp(a)) return sprintf("%O", a);
    return "UNKNOWN";
}