/*
 *  call-seq:
 *     obj.inspect   => string
 *  
 *  Returns a string containing a human-readable representation of
 *  <i>obj</i>. If not overridden, uses the <code>to_s</code> method to
 *  generate the string.
 *     
 *     [ 1, 2, 3..4, 'five' ].inspect   #=> "[1, 2, 3..4, \"five\"]"
 *     Time.new.inspect                 #=> "Wed Apr 09 08:54:39 CDT 2003"
 */


static VALUE
rb_obj_inspect(obj)
    VALUE obj;
{
    if (TYPE(obj) == T_OBJECT
        && ROBJECT(obj)->iv_tbl
        && ROBJECT(obj)->iv_tbl->num_entries > 0) {
        VALUE str;
        size_t len;
        char *c;

        c = rb_obj_classname(obj);
        if (rb_inspecting_p(obj)) {
            len = strlen(c)+10+16+1;
            str = rb_str_new(0, len); /* 10:tags 16:addr 1:nul */
            snprintf(RSTRING(str)->ptr, len, "#<%s:0x%lx ...>", c, obj);
            RSTRING(str)->len = strlen(RSTRING(str)->ptr);
            return str;
        }
        len = strlen(c)+6+16+1;
        str = rb_str_new(0, len);     /* 6:tags 16:addr 1:nul */
        snprintf(RSTRING(str)->ptr, len, "-<%s:0x%lx", c, obj);
        RSTRING(str)->len = strlen(RSTRING(str)->ptr);
        return rb_protect_inspect(inspect_obj, obj, str);
    }
    return rb_funcall(obj, rb_intern("to_s"), 0, 0);
}