merentha_mudos_v1/
merentha_mudos_v1/bin/
merentha_mudos_v1/lib/cfg/
merentha_mudos_v1/lib/cfg/races/
merentha_mudos_v1/lib/cmds/abilities/
merentha_mudos_v1/lib/cmds/actions/
merentha_mudos_v1/lib/cmds/spells/
merentha_mudos_v1/lib/daemon/include/
merentha_mudos_v1/lib/daemon/services/
merentha_mudos_v1/lib/doc/
merentha_mudos_v1/lib/doc/building/
merentha_mudos_v1/lib/doc/help/classes/
merentha_mudos_v1/lib/doc/help/general/
merentha_mudos_v1/lib/doc/help/races/
merentha_mudos_v1/lib/doc/help/skills/
merentha_mudos_v1/lib/doc/help/stats/
merentha_mudos_v1/lib/doc/man/efuns/
merentha_mudos_v1/lib/doc/man/lfuns/
merentha_mudos_v1/lib/doc/news/
merentha_mudos_v1/lib/doc/old/
merentha_mudos_v1/lib/doc/old/concepts/
merentha_mudos_v1/lib/doc/old/lpc/constructs/
merentha_mudos_v1/lib/doc/old/lpc/types/
merentha_mudos_v1/lib/domains/ROOMS/
merentha_mudos_v1/lib/domains/obj/armour/
merentha_mudos_v1/lib/domains/obj/monsters/
merentha_mudos_v1/lib/domains/obj/other/
merentha_mudos_v1/lib/domains/obj/weapons/
merentha_mudos_v1/lib/realms/petrarch/
merentha_mudos_v1/lib/save/daemons/
merentha_mudos_v1/lib/save/rid/
merentha_mudos_v1/lib/save/users/a/
merentha_mudos_v1/lib/save/users/p/
merentha_mudos_v1/lib/save/users/t/
merentha_mudos_v1/lib/std/login/
merentha_mudos_v1/lib/std/obj/
merentha_mudos_v1/v22.2b12m1/
merentha_mudos_v1/v22.2b12m1/ChangeLog.old/
merentha_mudos_v1/v22.2b12m1/Win32/
merentha_mudos_v1/v22.2b12m1/compat/
merentha_mudos_v1/v22.2b12m1/compat/simuls/
merentha_mudos_v1/v22.2b12m1/include/
merentha_mudos_v1/v22.2b12m1/mudlib/
merentha_mudos_v1/v22.2b12m1/testsuite/
merentha_mudos_v1/v22.2b12m1/testsuite/clone/
merentha_mudos_v1/v22.2b12m1/testsuite/command/
merentha_mudos_v1/v22.2b12m1/testsuite/data/
merentha_mudos_v1/v22.2b12m1/testsuite/etc/
merentha_mudos_v1/v22.2b12m1/testsuite/include/
merentha_mudos_v1/v22.2b12m1/testsuite/inherit/
merentha_mudos_v1/v22.2b12m1/testsuite/inherit/master/
merentha_mudos_v1/v22.2b12m1/testsuite/log/
merentha_mudos_v1/v22.2b12m1/testsuite/single/
merentha_mudos_v1/v22.2b12m1/testsuite/single/tests/compiler/
merentha_mudos_v1/v22.2b12m1/testsuite/single/tests/efuns/
merentha_mudos_v1/v22.2b12m1/testsuite/single/tests/operators/
merentha_mudos_v1/v22.2b12m1/testsuite/u/
merentha_mudos_v1/v22.2b12m1/tmp/
// 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;
}

string identify(mixed arg) {
    string rtn;
    mixed x, y;

    switch(typeof(arg)){
    case OBJECT: return "("+file_name(arg)+")";
    case STRING: return "\""+arg+"\"";
    case INT: return ""+arg;
    case ARRAY:       {
	    rtn = "({ ";
	    foreach (y in arg)
	    rtn += identify(y)+", ";
	    return rtn+"})";
	}

    case MAPPING:       {
	    rtn = "([ " +
	    implode(values(map_mapping(arg,(: sprintf("%s : %s", identify($1),identify($2)) :))),", ");
	    return rtn+"])";
	}

    case FUNCTION:
    case FLOAT:       {
	    return sprintf("%O\n", arg);
	}

	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() {}