/
ColdWeb-0.2/
ColdWeb-0.2/root/
// ------------------------------------------------------------------
// Object

parent $root
object $parse

method html_traceback
    arg status, t;
    var line, out, x;

    out = "<h2>" + t[1][2] + "</h2>";
    out = [out, "<i><b>Thrown by " + ._html_traceback(@t[2]) + "</b></i>",
           "<p>"];
    for x in [3 .. listlen(t)] {
        line = "<code><i>" + toliteral(t[x][1]) + "</i>: ";
        out = out + [line + ._traceback(@t[x]) + "</code><br>"];
    }
    return .response(status, [@out, "</p>"]);
.

method traceback
    arg t;
    var line, out, x;

    out = "=> " + t[1][2];
    out = [out, "Thrown by " + ._traceback(@t[2])];
    for x in [3 .. listlen(t)] {
        line = toliteral(t[x][1]) + ": ";
        line = line + ._traceback(@t[x]);
        out = [@out, line];
    }
    return out;
.

method _html_traceback
    arg type, what, [more];
    var line;

    switch (type) {
        case 'function:
            return "function <tt>" + tostr(what) + "()</tt>";
        case 'opcode:
            return "operator <tt>" + toliteral(what) + "</tt>";
        default:
            line = toliteral(more[2]) + "." + tostr(what) + "()";
            if (more[1] != more[2])
                line = line + " (" + toliteral(more[1]) + ") ";
            line = line + " line " + tostr(more[3]);
            return line;
    }
.

method _traceback
    arg type, what, [more];
    var line;

    switch (type) {
        case 'function:
            return "function " + tostr(what) + "()";
        case 'opcode:
            return "operator " + toliteral(what);
        default:
            line = toliteral(more[1]) + "." + tostr(what) + "()";
            if (more[1] != more[2])
                line = line + " (" + toliteral(more[2]) + ") ";
            line = line + " line " + tostr(more[3]);
            return line;
    }
.

method get_name
    arg obj;

    if (!valid(obj))
        return "*** invalid object (" + toliteral(obj) + ") ***";
    return toliteral(obj);
.

method unparse
  arg data;
  var str, element, association, pos, method;
  
  switch (type(data)) {
      case 'integer:
          return tostr(data);
      case 'string:
          return toliteral(data);
      case 'symbol:
          return toliteral(data);
      case 'error:
          return toliteral(data);
      case 'buffer:
          return toliteral(data);
      case 'dbref:
          return .get_name(data);
      case 'list:
          if (!data)
              return "[]";
          str = "[";
          for element in (sublist(data, 1, listlen(data) - 1)) {
              str = str + .unparse(element);
              str = str + ", ";
          }
          str = str + .unparse(data[listlen(data)]);
          return str + "]";
      case 'dictionary:
          if (!data)
              return "#[]";
          str = "#[";
          for association in (data) {
              str = str + .unparse(association);
              str = str + ", ";
          }
          return substr(str, 1, strlen(str) - 2) + "]";
      case 'frob:
          return data.unparse();
  }
.