0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.1.0735: cannot handle binary data

Problem:    Cannot handle binary data.
Solution:   Add the Blob type. (Yasuhiro Matsumoto, closes #3638)
This commit is contained in:
Bram Moolenaar
2019-01-12 22:47:31 +01:00
parent e3c74d249a
commit 6e5ea8d2a9
27 changed files with 1354 additions and 114 deletions

View File

@@ -51,6 +51,7 @@
# define rb_cFloat (*dll_rb_cFloat)
# endif
# define rb_cNilClass (*dll_rb_cNilClass)
# define rb_cString (*dll_rb_cString)
# define rb_cSymbol (*dll_rb_cSymbol)
# define rb_cTrueClass (*dll_rb_cTrueClass)
# if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
@@ -219,6 +220,7 @@ static void ruby_vim_init(void);
*/
# define rb_assoc_new dll_rb_assoc_new
# define rb_cObject (*dll_rb_cObject)
# define rb_class_new_instance dll_rb_class_new_instance
# define rb_check_type dll_rb_check_type
# ifdef USE_TYPEDDATA
# define rb_check_typeddata dll_rb_check_typeddata
@@ -365,8 +367,10 @@ VALUE *dll_rb_cFloat;
# endif
VALUE *dll_rb_cNilClass;
static VALUE *dll_rb_cObject;
VALUE *dll_rb_cString;
VALUE *dll_rb_cSymbol;
VALUE *dll_rb_cTrueClass;
static VALUE (*dll_rb_class_new_instance) (int,VALUE*,VALUE);
static void (*dll_rb_check_type) (VALUE,int);
# ifdef USE_TYPEDDATA
static void *(*dll_rb_check_typeddata) (VALUE,const rb_data_type_t *);
@@ -579,8 +583,10 @@ static struct
# endif
{"rb_cNilClass", (RUBY_PROC*)&dll_rb_cNilClass},
{"rb_cObject", (RUBY_PROC*)&dll_rb_cObject},
{"rb_cString", (RUBY_PROC*)&dll_rb_cString},
{"rb_cSymbol", (RUBY_PROC*)&dll_rb_cSymbol},
{"rb_cTrueClass", (RUBY_PROC*)&dll_rb_cTrueClass},
{"rb_class_new_instance", (RUBY_PROC*)&dll_rb_class_new_instance},
{"rb_check_type", (RUBY_PROC*)&dll_rb_check_type},
# ifdef USE_TYPEDDATA
{"rb_check_typeddata", (RUBY_PROC*)&dll_rb_check_typeddata},
@@ -1164,7 +1170,13 @@ static VALUE vim_to_ruby(typval_T *tv)
result = Qtrue;
else if (tv->vval.v_number == VVAL_FALSE)
result = Qfalse;
} /* else return Qnil; */
}
else if (tv->v_type == VAR_BLOB)
{
result = rb_str_new(tv->vval.v_blob->bv_ga.ga_data,
tv->vval.v_blob->bv_ga.ga_len);
}
/* else return Qnil; */
return result;
}
@@ -1242,6 +1254,19 @@ static buf_T *get_buf(VALUE obj)
return buf;
}
static VALUE vim_blob(VALUE self UNUSED, VALUE str)
{
VALUE result = rb_str_new("0z", 2);
char buf[4];
int i;
for (i = 0; i < RSTRING_LEN(str); i++)
{
sprintf(buf, "%02X", RSTRING_PTR(str)[i]);
rb_str_concat(result, rb_str_new_cstr(buf));
}
return result;
}
static VALUE buffer_s_current(void)
{
return buffer_new(curbuf);
@@ -1662,6 +1687,7 @@ static void ruby_vim_init(void)
rb_define_module_function(mVIM, "set_option", vim_set_option, 1);
rb_define_module_function(mVIM, "command", vim_command, 1);
rb_define_module_function(mVIM, "evaluate", vim_evaluate, 1);
rb_define_module_function(mVIM, "blob", vim_blob, 1);
eDeletedBufferError = rb_define_class_under(mVIM, "DeletedBufferError",
rb_eStandardError);