# [dumping code using] FUP

Gustavo Glusman (bmgustav@bioinformatics.weizmann.ac.il)
Sat, 20 Apr 1996 23:23:38 PDT

- Messages sorted by:[ date ][ thread ][ subject ][ author ]

    >I recently installed FUP 1.8 on my moo running LambdaMOO 1.7.9p2. Is
    >there a way i can dump moocode from disk to MOO using FUP?

    Naturally, since you can write lists of strings easily to files, and this
    is what MOO code looks like.

    As an example, consider the following utility, $wiz_utils:dump_to_file,
    which is the same as the $prog:@dump verb, but 1) without the user
    interface, and 2) writes to a file.

    @verb $wiz_utils:"dump_to_file"   this none this   rx   #2
    @prog $wiz_utils:dump_to_file
    ":dump_to_file({path,filename},what,id,props,verbs,create)";
    "This spills out all properties and verbs on an object, calling suspend at
    appropriate intervals.";
    "   id=#nnn -- specifies an idnumber to use in place of the object's actual
    id (for porting to another MOO)";
    "   noprops -- don't show properties.";
    "   noverbs -- don't show verbs.";
    if (!caller_perms().wizard)
      return E_PERM;
    endif
    cu = $command_utils;
    su = $string_utils;
    file = args[1];
    if (fileexists(@file))
      return E_PERM;
    endif
    dobj = args[2];
    targname = args[3] || tostr(dobj);
    props = args[4];
    verbs = args[5];
    create = args[6];
    if (create)
      parent = parent(dobj);
      pstring = tostr(parent);
      for p in (properties(#0))
        if (#0.(p) == parent)
          pstring = "$" + p;
        endif
      endfor
      fileappend(@file, {tostr("@create ", pstring, " named ", dobj.name, ":",
    su:from_list(dobj.aliases, ","))});
    endif
    for p in (props ? properties(dobj) | {})
      pquoted = su:print(p);
      info = property_info(dobj, p);
      value = dobj.(p);
      if (create)
        uvalue = typeof(value) == LIST ? "{}" | 0;
        fileappend(@file, {tostr("@prop ", targname, ".", pquoted, " ", uvalue
    || su:print_suspended(value), " ", info[2] || "\"\"", info[1] == dobj.owner
    ? "" | tostr(" ", info[1]))});
        if (uvalue && value)
          fileappend(@file, {tostr(";", targname, ".(", pquoted, ") = ",
    su:print_suspended(value))});
        endif
      else
        if (info[2] != "rc")
          fileappend(@file, {tostr("@chmod ", targname, ".", pquoted, " ",
    info[2])});
        endif
        if (info[1] != dobj.owner)
          fileappend(@file, {tostr("@chown ", targname, ".", pquoted, " ",
    info[1])});
        endif
        fileappend(@file, {tostr(";", targname, ".(", pquoted, ") = ",
    su:print_suspended(value))});
      endif
      cu:suspend_if_needed(0);
    endfor
    for a in (props ? $object_utils:ancestors(dobj) | {})
      for p in (properties(a))
        cu:suspend_if_needed(1);
        pquoted = su:print(p);
        value = dobj.(p);
        avalue = a.(p);
        if (typeof(value) == ERR)
          fileappend(@file, {tostr("\"", targname, ".(", pquoted, ") => ",
    $code_utils:error_name(value), " (", value, ")")});
        elseif (typeof(avalue) == ERR || value != avalue)
          fileappend(@file, {tostr(";", targname, ".(", pquoted, ") = ",
    su:print_suspended(value))});
        endif
      endfor
      cu:suspend_if_needed(1);
    endfor
    if (!verbs)
      return;
    endif
    fileappend(@file, {""});
    v = tostr(0);
    while ((info = verb_info(dobj, v)) || info == E_PERM)
      if (index(info[3], "(old)") && 0)
        "Thought about skipping (old) verbs...";
      else
        suspend(1);
        if (typeof(info) == ERR)
          fileappend(@file, {tostr("\"", dobj, ":", v, " --- ", info, "\";")});
        else
          if (i = index(vname = info[3], " "))
            vname = vname[1..i - 1];
          endif
          if (vname[1] != "*")
            vname = strsub(vname, "*", "");
          endif
          args = verb_args(dobj, v);
          prep = args[2] in {"any", "none"} ? args[2] |
    $code_utils:short_prep(args[2]);
          perms = info[2] != (args == {"this", "none", "this"} ? "rxd" | "rd")
    ? info[2] || "\"\"" | "";
          if (create)
            if (info[1] == dobj.owner)
              tail = perms ? tostr(" ", perms) | "";
            else
              tail = tostr(" ", perms || info[2], " ", info[1]);
            endif
            fileappend(@file, {tostr("@verb ", targname, ":\"", info[3], "\" ",
    args[1], " ", prep, " ", args[3], tail)});
          else
            fileappend(@file, {tostr("@args ", targname, ":\"", info[3], "\" ",
    args[1], " ", prep, " ", args[3])});
            if (info[1] != dobj.owner)
              fileappend(@file, {tostr("@chown ", targname, ":", vname, " ",
    info[1])});
            endif
            if (perms)
              fileappend(@file, {tostr("@chmod ", targname, ":", vname, " ",
    perms)});
            endif
          endif
          if (code = verb_code(dobj, v, 1, 1))
            fileappend(@file, {tostr("@program ", targname, ":", vname)});
            for c in (code)
              fileappend(@file, {c});
              cu:suspend_if_needed(0);
            endfor
            fileappend(@file, {".", ""});
          endif
        endif
      endif
      if (index(tostr(" ", info[3], " "), " * "))
        "... we have a * verb.  may as well forget trying to list...";
        "... the rest; they're invisible.  set v to something nonstring.";
        v = E_TYPE;
      else
        v = tostr(tonum(v) + 1);
      endif
      cu:suspend_if_needed(0);
    endwhile
    "Last modified Tue Mar 28 19:21:50 1995 IST by Gustavo (#2).";
    <end>

    Can probably be improved a lot, but it works nicely. :)

    -------------------------------------------------------------
    Gustavo Glusman               Founder/administrator of BioMOO
    -- Gustavo@bioinformatics.weizmann.ac.il
    -- http://bioinformatics.weizmann.ac.il/Gustavo
    -- BioMOO: telnet bioinformatics.weizmann.ac.il 8888
               WWW:   http://bioinfo.weizmann.ac.il/BioMOO