sima/autoconf/
sima/hosts/i386/
sima/mudlib/
sima/mudlib/kernel/
sima/mudlib/obj/
sima/mudlib/sys/
sima/synhash/mips/
#include <driver_hook.h>

mapping fixed_commands;
string cwd;

void write(string s) {
    this_object()->catch_tell(s);
}

void parse_command(string s) {
    string fixed_command;
    int end;
    write("parsing your command:");
    write(s);
    write("\n");
    fixed_command = s;
    if ((end = member(s, ' ')) >= 0) {
	fixed_command = s[0..end-1];
    }
    fixed_command = fixed_commands[fixed_command];
    if (fixed_command)
	call_other(this_object(), fixed_command, end >= 0 ? s[end+1..] : "", s);
    else
	call_other(this_object(), s);
}

void logon() {
    catch_tell("Hello World\n");
    set_interactive_hook(IH_INPUT, "parse_command");
    fixed_commands = ([
	"ls":"list_files",
	"cd":"change_dir",
    ]);
    cwd = "/";
}

void catch_tell(string s) {
    text_message(s);
}

void s() {
    write("south\n");
}

void add() {
    string s;
    s = "add";
    s[0]++;
    write(s);
}

void n() {
    write(sprintf("%d", 42));
}

string make_path_absolute(string path) {
    int back, scan;

    if (! strlen(path) || path[0] != '/')
	path = cwd + path;
    while ((back = strstr(path, "/../")) >= 0) {
	for (scan = back; scan && path[--scan] != '/'; );
	path = path[0..scan] + path[back+4..];
    }
    if (path[<3..] == "/..") {
	for (scan = strlen(path) - 3; scan && path[--scan] != '/'; );
	path = path[0..scan];
    }
    return path;
}

void list_files(string path) {
    int max, i, len, tmp;
    status trunc_flag;
    mixed *dir;

    path = make_path_absolute(path);
    dir = get_dir (path,3, 0);
    if (!dir) {
#if 1
        write(sprintf("%s: No such directory.\n", path));
#else
	write(path);
        write(": No such directory.\n");
#endif
        return;
    }
    if (sizeof(dir) > 999)
    {
        dir = dir[0..998];
        trunc_flag = 1;
    }
    for(i = sizeof(dir); i--; ) {
        if(dir[i--] == -2)
            dir[i]+="/";
        len = strlen(dir[i]);
        if (len > max)
            max = len;
    }
    ++max;
    if (max > 79)
        max = 79;
    for (i=0; i < sizeof(dir); i+=2) {
        string name;
            name = dir[i];
        tmp = strlen(name);
        if (len + tmp > 79) {
            len = 0;
            write("\n");
        }
        write(name);
        if (len + max > 79) {
            write("\n");
            len = 0;
        } else {
            write(
"                                                                                "
                [<max-tmp..]);
            len += max;
        }
    }
    write("\n");
    if (trunc_flag) write("***TRUNCATED***\n");
}

void change_dir(string path) {
    path = make_path_absolute(path);
    if (strlen(path) > 1)
	path += "/";
    cwd = path;
}