#include "boot.clh" object PROGRAMMER parents BUILDER; name = "Generic Programmer"; obj prog_obj; /* object being programmed */ str prog_method; /* method being programmed */ verb "eval" = eval_cmd; verb "@prog*ram" = program_cmd; verb "@prog*ram" : "on" = program_cmd; verb "@ps" = ps_cmd; verb "@kill" = kill_cmd; verb "@verb" = verb_cmd; verb "@verb" : "on" = verb_cmd; verb "@rmv*erb" = rmverb_cmd; verb "@rmv*erb" : "on" = rmverb_cmd; verb "@rmm*ethod" = rmmethod_cmd; verb "@rmm*ethod" : "on" = rmmethod_cmd; verb "@rmva*r" = rmvar_cmd; verb "@rmva*r" : "on" = rmvar_cmd; method init if (this == PROGRAMMER) this.add_owner(WIZARD); else pass(); endif endmethod /* init */ method eval_cmd if (caller != this) return 1; endif if (!compile(this, "eval_tmp", args[2])) echo("--> " + tostr(this.eval_tmp())); rm_method("eval_tmp"); endif endmethod method program_cmd var what; ignore E_METHODNF; if (caller != this) return 1; elseif (!args[2] && !args[3]) echo("Entering programming mode. Use \".\" to end"); prog_obj = NOTHING; this.input_to("done_programming"); elseif (!args[2] || !args[3]) echo("Usage: @program <method> on <object>"); echo(" @program"); else what = this.match_env(args[4]); if (!what) echo("I don't see that here."); else prog_obj = what; prog_method = args[2]; echo("Programming " + args[2] + " on " + what.id); echo("Entering programming mode. Use \".\" to end"); this.input_to("done_programming"); endif endif endmethod /* program_cmd */ method done_programming if (prog_obj == NOTHING) compile(args[1]); else if (!compile(prog_obj, prog_method, args[1])) echo("Method programmed."); endif endif endmethod /* done_programming */ method verb_cmd var r, newargs, what, prep; if (caller != this) return 1; endif newargs = explode(args[2]); if (!args[2] || !args[3] || !args[4] || (lengthof(newargs)) < 2 || (lengthof(newargs) > 3)) echo("Usage: @verb <verb> <method-to-call> on <obj>"); echo(" @verb <verb> <preposition> <method-to-call> on <obj>"); return 0; endif what = this.match_env(args[4]); if (!what) echo("I don't see that here."); return 0; elseif (lengthof(newargs) == 2) r = what.add_verb(newargs[1], "", newargs[2]); else r = what.add_verb(newargs[1], newargs[2], newargs[3]); endif if (r == E_PERM) echo("Permission denied."); else echo("Verb added."); endif return 0; endmethod /* verb_cmd */ method rmverb_cmd var what; if (caller != this) return 1; endif if (!args[2] || !args[3] || !args[4]) echo("Usage: @rmverb <verb> on <obj>"); return 0; endif what = this.match_env(args[4]); if (!what) echo("I don't see that here."); elseif (what.rm_verb(args[2]) == E_PERM) echo("Permission denied."); else echo("Verb removed."); endif return 0; endmethod /* rmverb_cmd */ method rmmethod_cmd var r, what; ignore E_PERM, E_METHODNF; if (caller != this) return 1; endif if (!args[2] || !args[3] || !args[4]) echo("Usage: @rmmethod <method> on <obj>"); return; endif what = this.match_env(args[4]); if (!what) echo("I don't see that here."); else r = what.rm_method(args[2]); if (typeof(r) == ERR) echo(tostr(r)); else echo("Method removed."); endif endif return 0; endmethod /* rmmethod_cmd */ method rmvar_cmd var r, what; ignore E_PERM, E_VARNF; if (caller != this) return 1; endif if (!args[2] || !args[3] || !args[4]) echo("Usage: @rmvar <var> on <obj>"); return; endif what = this.match_env(args[4]); if (!what) echo("I don't see that here."); else r = what.rm_var(args[2]); if (typeof(r) == ERR) echo(tostr(r)); else echo("Variable removed."); endif endif return 0; endmethod method ps_cmd var i, line, task; echo("PID PLAYER METHOD STATUS"); for task in (ps()) if (task[4] != this && !("a" in args[2])) continue; endif line = pad(tostr(task[1]),7) + " " + pad(task[4].id, 15) + " " + pad(tostr(task[6]) + "." + task[9], 15) + " "; if (task[10] == 0) line = line + "MSG "; elseif (task[10] == 1) line = line + "LOCK "; elseif (task[10] == 2) line = line + "TIMER "; elseif (task[10] == 3) line = line + "SYS_MSG"; endif echo(line); endfor endmethod /* ps_cmd */ method kill_cmd var r, pid; ignore E_PERM; pid = tonum(args[2]); r = kill(pid); if (r == E_PERM); echo("Permission denied."); elseif (r != 0) echo("No such process."); else echo("Killed."); endif endmethod /* kill_cmd */ endobject /* PROGRAMMER */