new object $code_lib: $libraries; var $code_lib quotes = [["\"Abandon all hope, ye who enter here.\""], ["\"Pull out Wedge, your not doing any more good back there.\"", "", "- Luke Skywalker, StarWars"], ["\"God is in the details.\""], ["\"I don't practice what I preach,", "because I'm not the type of person I'm preaching too.\"", "", "- Bob Dobbs"], ["\"I haven't shaved for six years.", "I seem to be cursed with a thin beard.\"", "", "- Calvin, Age 6 (of Calvin & Hobbes)"], ["\"I may be a Dreamer, but I'm not the only one.\"", "", "- John Lennon"], ["\"C code. C code run. Run, Code, Run! Please!?\"", "", "- Anonymous C hacker."], ["\"They who dream by day are cognizant of many things", "which escape those who dream only by night.\"", "", "- Edgar Allan Poe"], ["\"The good die first,", "and they whose hearts are dry as a summer dust", "burn to the socket.\"", "", "- William Wordsworth"], ["\"Banning guns to prevent murder", "is like banning word processors to prevent libel.\"", "", "- Unknown"], ["\"You will not be punished for your anger,", "you will be punished by your anger.\"", "", "- Buddha"], ["What part of:", "", "main() { printf(&unix[\"021%six0120\"],(unix)[\"have\"]+\"fun\"-0x60);}", "", "do you not understand?", "", "(taken from the 1987 Obfuscated C Code Contest)"], ["\"The goal of computer science is to build something that will", "last at least until we've finished building it.\""], ["\"Give me ambiguity or give me something else.\""], ["\"We are born naked, wet and hungry. Then things get worse.\""], ["\"Make it idiot proof and someone will make a better idiot.\""], ["\"Lottery: A tax on people who are bad at math.\""], ["\"There's too much blood in my caffeine system.\""], ["\"Artificial Intelligence usually beats real stupidity.\""], ["\"Ever notice how fast MS-Windows runs? Neither did I.\""], ["\"Very funny, Scotty. Now beam down my clothes.\""], ["\"Consciousness: that annoying time between naps.\""], ["\"The gene pool could use a little chlorine.\""], ["\"When there's a will, I want to be in it.\""], ["\"Change is inevitable, except from a vending machine.\""], ["\"MS-Windows is a virus:", "it takes over your computer and makes it run bad.\""], ["\"I have not failed 10,000 times,", "I have sucessfully found 10,000 ways that do not work.\"", "- Thomas Edison"], ["\"The difference between literature and journalism is", "that journalism is unreadable and literature is not read.\"", "", "- Oscar Wilde (1854-1900)"], ["\"The man who reads nothing at all is better educated", "than the man who reads nothing but newspapers.\"", "", "- Thomas Jefferson (1743-1826)"], ["\"In the mind of the beginner, there are many possibilities.", "In the mind of the expert there are few.\"", "", "- Shunryu Suzuki"], ["\"Time is a great teacher, but unfortunately it kills all of its pupils.\"", "", "- Hector Berlioz"], ["\"After I'm dead I'd rather have people ask", "why I have no monument, than why I have one.\"", "", "- Cato the Elder (234-249 B.C.)"], ["\"I loathe people who keep dogs. They are cowards who haven't", "got the guts to bite people themselves.\"", "", "-August Strindberg"], ["\"By the time I'd grown up, I natrually supposed that I'd be grown up.\"", "", "-Eve Babitz"], ["\"Every place has a spirit:", "it may be good, it may be bad", "it can be restful as eternity.", "This place-spirit can inhabit a book, a house, a town, a valley;", "the nature of the spirits is they remain.\"", "", "- William S. Burroughs"], ["\"I have never been lost... but I will admit to being confused for several weeks.\"", "", "- Daniel Boon"], ["Time is what keeps things from happening all at once."], ["According to my calculations the problem doesn't exist."], ["Forget about World Peace ... visualize using your turn signal."], ["Ever stop to think, and forget to start again?"], ["Diplomacy is the art of saying \"nice doggie!\"...till you can find a rock."], ["\"The sign of growing up is being able to form independent opinions,", "The sign of maturity is knowing when they are not wanted.\""]]; var $root created_on = 796268969; var $root flags = ['methods, 'code, 'variables, 'core]; var $root inited = 1; var $root managed = [$code_lib]; var $root manager = $code_lib; public method ._debug_listing() { arg list; var indent, i, out, t, j; indent = ""; out = [" Tick# Event", " ----- -----------------------------"]; t = 0; for i in (list) { if (type(i) == 'integer) { if (indent) indent = indent.subrange(3); out += [strfmt("%6r %lreturn", i - t, indent)]; } else { if (!t) t = i[1]; j = strfmt("%6r %l%l(%l)", (i[1]) - t, indent, (._show_ref(i)).replace("()", ""), (toliteral(i[5]).match_pattern("[*]"))[1]); out += [j]; indent += " "; } refresh(); } return out; }; public method ._do_method_href() { arg method, object; var mod_method, prefix, postfix, index; prefix = ""; postfix = ""; if ((method[1]) != ".") { index = stridx(method, "."); prefix = method.subrange(1, index); method = method.subrange(index + 1); } else { prefix = "."; method = method.subrange(2); } postfix = "("; method = method.subrange(1, (method.length()) - 1); return (((((((prefix + "<A HREF=\"/bin/method?target=") + object) + ".") + method) + "\">") + method) + "</A>") + postfix; }; public method ._profile_listing() { arg list; var i, out, ref, times, sums, callers, t, tic, max, start, head; head = ["Object<definer>.method Tics (%) Total (%)", "---------------------- ---- --- ----- ---"]; times = #[]; sums = #[]; callers = []; for i in (list) { refresh(); if (type(i) == 'integer) { if (callers) { [[ref, tic], @callers] = callers; times = times.add(ref, (((| times[ref] |) || 0) + i) - t); if (!(ref in callers)) sums = sums.add(ref, (((| sums[ref] |) || 0) + i) - tic); } t = i; } else { if (callers) { ref = (callers[1])[1]; times = times.add(ref, (((| times[ref] |) || 0) + (i[1])) - t); } ref = ._show_ref(i); callers = [[ref, i[1]], @callers]; t = i[1]; } start ?= t; } max = 0.01 * (t - start); out = map i in (times.keys()) to (refresh() && [i.chop(50), times[i], (times[i]) / max, sums[i], (sums[i]) / max]); out = out.sort(map i in (out) to (-(i[2]))); out = map i in (out) to (strfmt("%50l%7r%6.1r%%%7r%6.1r%%", @i)); out = head + out; return out; }; public method ._show_ref() { arg i; return ((i[2]) != (i[3])) ? strfmt("%l<%l>.%l()", i[2], i[3], i[4]) : strfmt("%l.%l()", i[2], i[4]); }; public method ._trace_listing() { arg list; var indent, i, out, t, j; indent = ""; out = [" Tick# Event", " ----- -----------------------------"]; t = 0; for i in (list) { if (type(i) == 'integer) { if (indent) indent = indent.subrange(3); } else { if (!t) t = i[1]; j = strfmt("%6r %l%l", (i[1]) - t, indent, ._show_ref(i)); out += [j.chop(79)]; indent += " "; } refresh(); } return out; }; public method ._trace_profile() { arg list; var i, out, ref, times, sums, callers, t, tic, max, start; out = ["Object<definer>.method Tics (%) Cummul. (%)"]; times = #[]; sums = #[]; callers = []; for i in (list) { refresh(); if (type(i) == 'integer) { if (callers) { [[ref, tic], @callers] = callers; times = times.add(ref, (((| times[ref] |) || 0) + (i[1])) - t); sums = sums.add(ref, (((| sums[ref] |) || 0) + (i[1])) - tic); } t = i; } else { if (callers) { ref = (callers[1])[1]; times = times.add(ref, (((| sums[ref] |) || 0) + (i[1])) - t); } ref = strfmt("%l<%l>.%l", i[2], i[3], i[4]); callers = [[ref, i[1]], @callers]; t = i[1]; } start ?= t; } max = 0.01 * (t - start); out = map i in (times.keys()) to (refresh() && [i, times[i], (times[i]) / max, sums[i], (sums[i]) / max]); out = out.sort(out.slice(2)); out = map i in (out) to (strfmt(i, "%50l%7r%7r%7r%7r")); return out; }; public method .add_random_quote() { arg quote, @from; if (!($sys.is_admin(sender()))) throw(~perm, "Sender is not an admin"); if (type(quote) != 'string) throw(~type, "Quote must be given as a string."); quote = ("\"" + quote) + "\""; quote = quote.wrap_line(70); quote = from ? [@quote, " - " + (from[1])] : quote; quotes += [quote]; }; public method .code_to_html() { arg code, object; var line, object_parse, results, obj_regexp, meth_regexp, chunk, word, method_parse, last_word, mode, chunk_out, meth_r2; obj_regexp = "\$[a-zA-Z0-9_]+"; meth_regexp = "((^)|[ (!])\.[a-zA-Z0-9_]+\("; meth_r2 = "^(\.[a-zA-Z0-9_]+\()(.*)$"; results = []; for line in (code) { object_parse = line.global_regexp(obj_regexp); last_word = 0; chunk_out = ""; while (object_parse) { [chunk, (word ?= 0), @object_parse] = object_parse; if (last_word && (method_parse = chunk.regexp(meth_r2))) { chunk_out += ._do_method_href(method_parse[1], last_word); chunk = method_parse[2]; } method_parse = chunk.global_regexp(meth_regexp); mode = 0; chunk_out += map chunk in (method_parse) to ((mode = !mode) ? chunk : (._do_method_href(chunk, object))).join(""); if (word) { last_word = word; if ((| $object_lib.to_dbref(word) |)) chunk_out += ((("<A HREF=\"/bin/display?target=" + ((last_word = word).subrange(2))) + "\">") + word) + "</A>"; else chunk_out += word; } } results += [chunk_out + (object_parse.join(""))]; } return results; }; public method .generate_debug_listing() { arg info, mode; return .(tosym(("_" + tostr(mode)) + "_listing"))(info); }; public method .generate_listing() { arg who, @args; var meths, header, title, i; // called by one of the who_cmds, does all the grunge work. [(title ?= "Connected Users"), (meths ?= [['namef, 'doing], ['connected_time], ['idle_time], ['realm_name]]), (header ?= ["Name", "On for", "Idle", "Location"])] = args; header = map i in (header) to ([i, "".pad(i.length(), "-")]); // if who is empty, only print header if (!who) return [("--- " + title) + " (0) ---"]; // get values using $list.mmap and format return ["--- %l (%l) ---".format(title, who.length()), @map i in (meths) to (who.mmap(@i)).tabulate(header, 0, 1, " ", (| sender().linelen() |) || 79), "---"]; }; public method .generate_object_listing() { arg objs, multi, @args; var line, obj, col, name, fmt, out; if (!objs) { out = ["** None **"]; } else { col = ((| sender().linelen() |) || 79) / 10; fmt = ((((("%3L%" + tostr(col * 4)) + "L %") + tostr(col)) + "L %") + tostr(col)) + "R "; out = [strfmt(fmt, "#", "Name", "Perms", "Size") + "Manager"]; col = col * 4; for obj in (objs) { line = strfmt(fmt, obj.(multi)(@args).length(), obj.namef('xref), $object_lib.see_perms(obj, ["", ""]), obj.size()); name = (obj.manager()).namef('xref); if ((name.length()) > col) name = name.pad(col); out += [line + name]; } } return out; }; public method .parse_name() { arg name, @def; var article, match, flag, type, tmps, ignore; // used to parse $has_name names and name templates [name, flag] = $parse_lib.opt(name, "u?nique", "p?roper", "n?ormal", "i?gnore"); name = name.join(); if (flag) { def = [@def, ["p?roper", "p", 1, ""]][1]; flag = (| flag.last() |) || def; if ((flag[1]) == "i?gnore") { article = 'prop; ignore = 1; } else { switch (flag[1]) { case "n?ormal": type = 'normal; case "u?nique": type = 'uniq; case "p?roper": type = 'prop; } } } [name, @tmps] = name.split(" *, *"); if (!ignore) { if ((match = name.regexp("^the +(.*)$"))) { article = 'uniq; name = match[1]; } else if ((match = name.regexp("^(a|an) +(.*)$"))) { article = 'normal; name = match[2]; } else { article = 'prop; } if (type && (article != type)) throw(~article, (("Conflicting name types " + type) + " and ") + article); } return [[name, article], tmps]; }; public method .point_to_line() { arg err, left, right, lineno, line; var out; return [((err + ", line ") + lineno) + ":", " " + line, strfmt("%*{-}l%*{^}l", left, "", right, "")]; }; public method .punctuation_type() { arg str; var end; end = str.length(); switch (str[end]) { case "!": return "exclaim"; case "?": return "ask"; case ".": return "say"; case ")": if (end > 1) { switch (str[end - 1]) { case ";": return "wink"; case ":": return "smile"; case "8": return "grin"; default: return "say"; } } case "(": if ((end > 1) && ((str[end - 1]) in [":", "8"])) return "frown"; } return "say"; }; public method .quotes() { return quotes; }; public method .random_password() { var len, out, con, vow, rare, num, c, caps, maxcaps, flag, last; len = random(5) + 7; out = ""; con = "bcdfghjklmnprst"; rare = ["q", "aa", "ee", "oo", "qu", "v", "w", "x", "z", "y"]; vow = "aeiou"; num = "1234567890"; flag = random(15); maxcaps = random(4) + 2; while (strlen(out) < len) { switch (flag) { case 1: c = num.random(); out += c; flag = random(15); case 2, 3: if (rare) { c = rare.random(); if (random(2) == 1) rare = setremove(rare, c); out += c; flag = random(15); } case 4 .. 8: c = vow.random(); while (c == last) c = vow.random(); out += c; flag = random(7) + 3; case 9 .. 15, -1: c = con.random(); while (c == last) c = con.random(); out += c; flag = random(10); case -15 .. -9: c = con.random(); while (c == last) c = con.random(); out += uppercase(c); flag = random(10); case -8 .. -4: c = vow.random(); while (c == last) c = vow.random(); out += uppercase(c); flag = random(7) + 3; case -3, -2: if (rare) { c = rare.random(); if (random(2) == 1) rare = setremove(rare, c); out += uppercase(c); flag = random(15); } } last = c; if ((caps < maxcaps) && (random(10) == 1)) { caps++; flag = -flag; } } return out; }; public method .random_quote() { var which; which = random(quotes.length()); if (which) return quotes[which]; return []; }; public method .random_word() { arg @args; var len, out, con, vow, rare, c, caps, maxcaps, flag, last, min, max, extra; [(min ?= 3), (max ?= 10), (extra ?= #[])] = args; len = random(max - min) + min; out = ""; con = "bcdfghjklmnprst"; rare = ["q", "aa", "ee", "oo", "qu", "v", "w", "x", "z", "y"]; vow = "aeiou"; if ((| extra['con] |)) con += extra['con]; if ((| extra['vow] |)) vow += extra['vow]; if ((| extra['rare] |)) rare += extra['rare]; flag = random(15); maxcaps = random(4) + 2; while (strlen(out) < len) { switch (flag) { case 1, 2: if (rare) { c = rare.random(); if (random(2) == 1) rare = setremove(rare, c); out += c; flag = random(15); } case 3 .. 8: c = vow.random(); while (c == last) c = vow.random(); out += c; flag = random(7) + 3; case 9 .. 15: c = con.random(); while (c == last) c = con.random(); out += c; flag = random(10); } last = c; } return out; }; public method .valid_message_id() { arg str; return !match_regexp(str, "[^a-z0-9-]"); }; public method .valid_setting_id() { arg str; return !match_regexp(str, "[^@a-z0-9-]"); }; public method .verify_code() { arg code, method, warn; var l, line, m, warns, isadmin, msg; warns = []; method = ("\." + tostr(method)) + "\("; isadmin = sender().is($admin); for l in [1 .. code.length()] { line = code[l]; // if its in a comment, ignore it if (match_begin(line, "//")) continue; // required warnings, sorry if ((m = line.match_regexp("[^._]anticipate_assignment\("))) warns += .point_to_line("WARNING: call to anticipate_assignment()", ((m[1])[1]) + 2, ((m[1])[2]) - 2, l, line); if ((m = line.match_regexp("(!)[a-z0-9_]+ in "))) { warns += ["WARNING: possible ambiguity, line " + l]; warns += .point_to_line("WARNING: parenthesis suggested around followup expression to '!'", ((m[2])[1]) + 1, (m[2])[2], l, line); } if ((m = line.match_regexp("(if *\(|&&|\|\|) *[a-z0-9_]+ *(=)[^=]"))) warns += .point_to_line("WARNING: parenthesis suggested around assignment expression", ((m[3])[1]) + 1, (m[3])[2], l, line); // optional warnings if (warn && (m = line.match_regexp(method))) warns += .point_to_line("WARNING: Possible Recursion", ((m[1])[1]) + 2, ((m[1])[2]) - 2, l, line); } return warns; };