static buf_T *get_buf(VALUE obj)
{
    buf_T *buf;

    Data_Get_Struct(obj, buf_T, buf);
    if (buf == NULL)
        rb_raise(eDeletedBufferError, "attempt to refer to deleted buffer");
    return buf;
}

static VALUE buffer_append(VALUE self, VALUE num, VALUE str)
{
    buf_T *buf = get_buf(self);
    buf_T *savebuf = curbuf;
    char *line = STR2CSTR(str);
    long n = NUM2LONG(num);

    if (n >= 0 && n <= buf->b_ml.ml_line_count && line != NULL) {
        curbuf = buf;
        if (u_inssub(n + 1) == OK) {
            mark_adjust(n + 1, MAXLNUM, 1L, 0L);
            ml_append(n, (char_u *) line, (colnr_T) 0, FALSE);
            changed();
        }
        curbuf = savebuf;
        update_curbuf(NOT_VALID);
    }
    else {
        rb_raise(rb_eIndexError, "index %d out of buffer", n);
    }
    return str;
}

static void ruby_vim_init(void)
{
    ...
    rb_define_method(cBuffer, "append", buffer_append, 2);
    ...
}

