merentha_fluffos_v2/
merentha_fluffos_v2/bin/
merentha_fluffos_v2/fluffos-2.9-ds2.03/
merentha_fluffos_v2/fluffos-2.9-ds2.03/ChangeLog.old/
merentha_fluffos_v2/fluffos-2.9-ds2.03/Win32/
merentha_fluffos_v2/fluffos-2.9-ds2.03/compat/
merentha_fluffos_v2/fluffos-2.9-ds2.03/compat/simuls/
merentha_fluffos_v2/fluffos-2.9-ds2.03/include/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/clone/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/command/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/data/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/etc/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/include/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/inherit/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/inherit/master/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/log/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/single/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/single/tests/compiler/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/single/tests/efuns/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/single/tests/operators/
merentha_fluffos_v2/fluffos-2.9-ds2.03/testsuite/u/
merentha_fluffos_v2/fluffos-2.9-ds2.03/tmp/
merentha_fluffos_v2/fluffos-2.9-ds2.03/windows/
merentha_fluffos_v2/lib/cfg/
merentha_fluffos_v2/lib/cfg/races/
merentha_fluffos_v2/lib/cmds/abilities/
merentha_fluffos_v2/lib/cmds/actions/
merentha_fluffos_v2/lib/cmds/spells/
merentha_fluffos_v2/lib/daemon/include/
merentha_fluffos_v2/lib/daemon/services/
merentha_fluffos_v2/lib/doc/
merentha_fluffos_v2/lib/doc/building/
merentha_fluffos_v2/lib/doc/help/classes/
merentha_fluffos_v2/lib/doc/help/general/
merentha_fluffos_v2/lib/doc/help/races/
merentha_fluffos_v2/lib/doc/help/skills/
merentha_fluffos_v2/lib/doc/help/stats/
merentha_fluffos_v2/lib/doc/man/efuns/
merentha_fluffos_v2/lib/doc/man/lfuns/
merentha_fluffos_v2/lib/doc/news/
merentha_fluffos_v2/lib/doc/old/
merentha_fluffos_v2/lib/doc/old/concepts/
merentha_fluffos_v2/lib/doc/old/lpc/constructs/
merentha_fluffos_v2/lib/doc/old/lpc/types/
merentha_fluffos_v2/lib/domains/ROOMS/
merentha_fluffos_v2/lib/domains/obj/armour/
merentha_fluffos_v2/lib/domains/obj/monsters/
merentha_fluffos_v2/lib/domains/obj/other/
merentha_fluffos_v2/lib/domains/obj/weapons/
merentha_fluffos_v2/lib/realms/petrarch/
merentha_fluffos_v2/lib/save/daemons/
merentha_fluffos_v2/lib/save/rid/
merentha_fluffos_v2/lib/save/users/a/
merentha_fluffos_v2/lib/save/users/p/
merentha_fluffos_v2/lib/save/users/t/
merentha_fluffos_v2/lib/std/login/
merentha_fluffos_v2/lib/std/obj/
merentha_fluffos_v2/win32/
// Petrarch
// Merentha Lib 1.0
// sefun.c

#pragma show_error_context
#include <lpctypes.h>

#include "files.c"
#include "logs.c"
#include "math.c"
#include "money.c"
#include "mud_config.c"
#include "numbers.c"
#include "objects.c"
#include "player_funs.c"
#include "preds.c"
#include "strings.c"
#include "time.c"

int same(mixed x, mixed y) {
    if (typeof(x) != typeof(y)) return 0;
    switch (typeof(x)) {
    case INT:
    case STRING:
    case OBJECT:
    case FLOAT:
        return x == y;
    case MAPPING:
        if (x == y) return 1; // speed up this case
        if (sizeof(x) != sizeof(y)) return 0;
        if (!same(keys(x), keys(y))) return 0;
        if (!same(values(x), values(y))) return 0;
        return 1;
    case ARRAY:
        if (x == y) return 1; // speed up this case
        if (sizeof(x) != sizeof(y)) return 0;
        for (int i = 0; i < sizeof(x); i++) {
            if (!same(x[i], y[i])) return 0;
        }
        return 1;
    case FUNCTION:
        error("Not implemented.");
    }
}

void cat(string file) {
    message("sefun", read_file(file), this_player());
}

varargs int getoid(object ob) {
    int id;

    sscanf(file_name(ob || previous_object()), "%*s#%d", id);
    return id;
}

string user_cwd(string name) {
    return ("/realms/" + name[0..0] + "/" + name);
}

string user_path(string name) {
    return (user_cwd(name) + "/");
}

string file_owner(string file) {
    string temp, junk;

    if (file[0] != '/') file = "/" + file;

    if (sscanf(file, "/realms/%s/%s", temp, junk) == 2) {
        return temp;
    }
    return 0;
}

varargs 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";
}

string resolve_path(string curr, string newer) {
    int i, j, size;
    string *tmp;

    switch(newer){
    case 0:
    case ".":
        return curr;
    case "here":
        return file_name(environment())+".c";
    default:
        if (newer[0..1] == "~/") newer = user_path((string)this_player()->query_name()) + newer[2..];
        else {
            switch(newer[0]){
            case '~':            {
                    i = strsrch(newer, '/');
                    if (i < 0) newer = user_path(newer[1..]);
                    else newer = user_path(newer[1..i-1]) + newer[i..];
                    break;
                }
            case '/': break;
            default: newer[<0..<1] = curr + "/";
            }
        }

        if (newer[<1] != '/') newer += "/";
        size = sizeof(tmp = regexp(explode(newer, "/"), "."));

        i = j = 0;

        while (i < size){
            switch(tmp[i]){
            case "..":
                if (j){
                    while (j-- && !tmp[j]);
                    if (j >= 0) tmp[j] = 0;
                    else j++;
                }
            case ".":
                tmp[i++] = 0;
                break;

            default:
                j = ++i;
                break;
            }
        }
        return "/"+implode(tmp, "/");
    }
}


string domain_file(string) {
    return "Root";
}

string creator_file(string) {
    return "Root";
}

string author_file(string) {
    return "Root";
}

void simul() {}

string convert_name(string str) {
    string a, b, ret;
    if(!str || str == "") return "";
    if(strsrch(str,"@") != -1){
        str = replace_string(str, " ", "");
        str = replace_string(str, "'", "");
        return lower_case(replace_string(str, "-", ""));
    }
    if(sscanf(str, "%s@%s", a, b) == 2 &&
      ret = INTERMUD_D->GetMudName(b)) return a+"@"+ret;
    else return str; 
}

varargs string get_stack( int x) {
    int i, s;
    string list = "";
    string *stack0 = call_stack(0);
    string *stack1 = call_stack(1);
    string *stack2 = call_stack(2);
    for(i = 0, s = sizeof(stack1); i < s; i++){
        list +="\n"+i+":"+identify(stack2[i])+"."+identify(stack1[i])+"."+identify(stack2[i]);
    }

    if(x){
        list += "\n"+ identify(previous_object(-1));
    }

    return list;
}

void tc(string mess){
    object crat = find_player("cratylus");
    string sauce = base_name((previous_object() || this_object()));
    if(crat) tell_object(crat, sauce +": "+mess+"\n");
    //if(crat) crat->receive_private_msg(sauce+": "+mess, PRIVATE_MSG);
    debug_message(sauce +": "+mess);
    flush_messages();
}