Hello,

I re-made a patch for VIM which works with Ruby 1.9.
It affects file src/if_ruby.c, src/configure.in src/auto/configure.
This patch provides the following features.
(This patch is for Ruby 1.9, but keeps backword compatibility.
 I tested this patch works with ruby 1.8.7.)

(1) check ruby header directory in Ruby 1.9 (and Ruby 1.8).
    The header directory in Ruby 1.9 is different from Ruby 1.8.

(2) using Ruby1.9 C API instead of Ruby 1.8, although, this patch
    works with ruby 1.8 (keeping backword compatibility.)

(3) setting encoding of Ruby String with Ruby 1.9.
    (String encoding is new feature in Ruby 1.9.)

This patch is for Vim 7.2.234(Subversion revision 1577).

  Regards,
  Masaki Suketa


--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

diff -U1 -r vim7/src/auto/configure vim7ruby/src/auto/configure
--- vim7/src/auto/configure	2009-07-26 18:43:57.000000000 +0900
+++ vim7ruby/src/auto/configure	2009-07-26 18:33:30.000000000 +0900
@@ -5754,3 +5754,3 @@
 $as_echo_n "checking Ruby header files... " >&6; }
-      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
+      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["rubyhdrdir"] || Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null`
       if test "X$rubyhdrdir" != "X"; then
@@ -5759,2 +5759,8 @@
 	RUBY_CFLAGS="-I$rubyhdrdir"
+        rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["arch"]'`
+        if test -d "$rubyhdrdir/$rubyarch"; then
+          RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch"
+        fi
+        rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["ruby_version"].gsub(/\./, "")[0,2]'`
+        RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion"
 	rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LIBS"]'`
diff -U1 -r vim7/src/configure.in vim7ruby/src/configure.in
--- vim7/src/configure.in	2009-07-26 18:43:57.000000000 +0900
+++ vim7ruby/src/configure.in	2009-07-26 17:44:38.000000000 +0900
@@ -958,3 +958,3 @@
       AC_MSG_CHECKING(Ruby header files)
-      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
+      rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["rubyhdrdir"]] || Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
       if test "X$rubyhdrdir" != "X"; then
@@ -962,2 +962,8 @@
 	RUBY_CFLAGS="-I$rubyhdrdir"
+        rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["arch"]]'`
+        if test -d "$rubyhdrdir/$rubyarch"; then
+          RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch"
+        fi
+        rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["ruby_version"]].gsub(/\./, "")[[0,2]]'`
+        RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion"
 	rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LIBS"]]'`
diff -U1 -r vim7/src/if_ruby.c vim7ruby/src/if_ruby.c
--- vim7/src/if_ruby.c	2009-06-27 20:32:13.000000000 +0900
+++ vim7ruby/src/if_ruby.c	2009-07-26 18:40:59.000000000 +0900
@@ -51,2 +51,5 @@
 #include <ruby.h>
+#if defined(RUBY_VERSION) && RUBY_VERSION >=19
+#include <ruby/encoding.h>
+#endif
 
@@ -62,2 +65,24 @@
 
+/*
+ * backward compatiblity for Ruby 1.8(or before).
+ * Ruby 1.9 does not provide STR2CSTR, instead StringValuePtr is provided.
+ * Ruby 1.9 does not provide RXXX(s)->len, RXXX(s)->ptr, instead
+ * RXXX_LEN(s), RXXX_PTR(s) is provided.
+ */
+#ifndef StringValuePtr
+#define StringValuePtr(s) STR2CSTR(s)
+#endif
+#ifndef RARRAY_LEN
+#define RARRAY_LEN(s) RARRAY(s)->len
+#endif 
+#ifndef RARRAY_PTR
+#define RARRAY_PTR(s) RARRAY(s)->ptr
+#endif
+#ifndef RSTRING_LEN
+#define RSTRING_LEN(s) RSTRING(s)->len
+#endif
+#ifndef RSTRING_PTR
+#define RSTRING_PTR(s) RSTRING(s)->ptr
+#endif
+
 #include "vim.h"
@@ -131,3 +156,7 @@
 #define rb_str_new2			dll_rb_str_new2
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+#define rb_errinfo                      dll_rb_errinfo
+#else
 #define ruby_errinfo			(*dll_ruby_errinfo)
+#endif
 #define ruby_init			dll_ruby_init
@@ -138,2 +167,10 @@
 
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+#define ruby_script                     dll_ruby_script
+#define rb_enc_find_index               dll_rb_enc_find_index
+#define rb_enc_find                     dll_rb_enc_find
+#define rb_enc_str_new                  dll_rb_enc_str_new
+#define rb_sprintf                      dll_rb_sprintf
+#endif
+
 /*
@@ -185,3 +222,7 @@
 static VALUE (*dll_rb_str_new2) (const char*);
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+static VALUE (*dll_rb_errinfo) (void);
+#else
 static VALUE *dll_ruby_errinfo;
+#endif
 static void (*dll_ruby_init) (void);
@@ -192,2 +233,10 @@
 
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+static void (*dll_ruby_script) (const char*);
+static int (*dll_rb_enc_find_index) (const char*);
+static rb_encoding* (*dll_rb_enc_find) (const char*); 
+static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*);
+static VALUE (*dll_rb_sprintf) (const char*, ...);
+#endif
+
 static HINSTANCE hinstRuby = 0; /* Instance of ruby.dll */
@@ -247,3 +296,7 @@
     {"rb_str_new2", (RUBY_PROC*)&dll_rb_str_new2},
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+    {"rb_errinfo", (RUBY_PROC*)&dll_rb_errinfo},
+#else
     {"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo},
+#endif
     {"ruby_init", (RUBY_PROC*)&dll_ruby_init},
@@ -253,2 +306,9 @@
 #endif
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+    {"ruby_script", (RUBY_PROC*)&dll_ruby_script},
+    {"rb_enc_find_index", (RUBY_PROC*)&dll_rb_enc_find_index},
+    {"rb_enc_find", (RUBY_PROC*)&dll_rb_enc_find},
+    {"rb_enc_str_new", (RUBY_PROC*)&dll_rb_enc_str_new},
+    {"rb_sprintf", (RUBY_PROC*)&dll_rb_sprintf},
+#endif
     {"", NULL},
@@ -342,2 +402,49 @@
 
+/*
+ *  In Ruby 1.9 or later, ruby String object has encoding.
+ *  conversion buffer string of vim to ruby String object using
+ *  VIM encoding option.
+ */
+    static VALUE 
+vim_str2rb_enc_str(const char *s)
+{
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+    int isnum;
+    long lval;
+    char_u *sval;
+    rb_encoding *enc;
+    isnum = get_option_value((char_u *)"enc", &lval, &sval, 0);
+    if (isnum == 0) {
+        enc = rb_enc_find((char*)sval);
+        vim_free(sval);
+        if (enc) {
+            return rb_enc_str_new(s, strlen(s), enc);
+        }
+    }
+#endif
+    return rb_str_new2(s);
+}
+
+static VALUE
+eval_enc_string_protect(const char *str, int *state)
+{
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+    int isnum;
+    long lval;
+    char_u *sval;
+    rb_encoding *enc;
+    VALUE v;
+    isnum = get_option_value((char_u *)"enc", &lval, &sval, 0);
+    if (isnum == 0) {
+        enc = rb_enc_find((char*)sval);
+        vim_free(sval);
+        if(enc) {
+            v = rb_sprintf("#-*- coding:%s -*-\n%s", rb_enc_name(enc), str);
+            return rb_eval_string_protect(StringValuePtr(v), state);
+        }
+    }
+#endif
+    return rb_eval_string_protect(str, state);
+}
+
 void ex_rubydo(exarg_T *eap)
@@ -354,5 +461,5 @@
 
-	    line = oldline = rb_str_new2((char *)ml_get(i));
+	    line = oldline = vim_str2rb_enc_str((char *)ml_get(i));
 	    rb_lastline_set(line);
-	    rb_eval_string_protect((char *) eap->arg, &state);
+	    eval_enc_string_protect((char *) eap->arg, &state);
 	    if (state) {
@@ -367,3 +474,3 @@
 		}
-		ml_replace(i, (char_u *) STR2CSTR(line), 1);
+		ml_replace(i, (char_u *) StringValuePtr(line), 1);
 		changed();
@@ -416,5 +523,14 @@
 #endif
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+            RUBY_INIT_STACK;
+#endif
 	    ruby_init();
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+            ruby_script("vim-ruby");
+#endif
 	    ruby_init_loadpath();
 	    ruby_io_init();
+#if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+            rb_enc_find_index("encdb");
+#endif
 	    ruby_vim_init();
@@ -436,4 +552,6 @@
 #ifndef DYNAMIC_RUBY
+#if !(defined(RUBY_VERSION) &&  RUBY_VERSION >= 19)
     RUBYEXTERN VALUE ruby_errinfo;
 #endif
+#endif
     VALUE eclass;
@@ -470,5 +588,10 @@
     case TAG_FATAL:
+# if defined(RUBY_VERSION) && RUBY_VERSION >= 19
+	eclass = CLASS_OF(rb_errinfo());
+	einfo = rb_obj_as_string(rb_errinfo());
+#else
 	eclass = CLASS_OF(ruby_errinfo);
 	einfo = rb_obj_as_string(ruby_errinfo);
-	if (eclass == rb_eRuntimeError && RSTRING(einfo)->len == 0) {
+#endif
+	if (eclass == rb_eRuntimeError && RSTRING_LEN(einfo) == 0) {
 	    EMSG(_("E272: unhandled exception"));
@@ -481,3 +604,3 @@
 	    vim_snprintf(buff, BUFSIZ, "%s: %s",
-		     RSTRING(epath)->ptr, RSTRING(einfo)->ptr);
+		     RSTRING_PTR(epath), RSTRING_PTR(einfo));
 	    p = strchr(buff, '\n');
@@ -499,4 +622,4 @@
     str = rb_obj_as_string(str);
-    buff = ALLOCA_N(char, RSTRING(str)->len);
-    strcpy(buff, RSTRING(str)->ptr);
+    buff = ALLOCA_N(char, RSTRING_LEN(str));
+    strcpy(buff, RSTRING_PTR(str));
     p = strchr(buff, '\n');
@@ -509,3 +632,3 @@
 {
-    do_set((char_u *)STR2CSTR(str), 0);
+    do_set((char_u *)StringValuePtr(str), 0);
     update_screen(NOT_VALID);
@@ -516,3 +639,3 @@
 {
-    do_cmdline_cmd((char_u *)STR2CSTR(str));
+    do_cmdline_cmd((char_u *)StringValuePtr(str));
     return Qnil;
@@ -523,3 +646,3 @@
 #ifdef FEAT_EVAL
-    char_u *value = eval_to_string((char_u *)STR2CSTR(str), NULL, TRUE);
+    char_u *value = eval_to_string((char_u *)StringValuePtr(str), NULL, TRUE);
 
@@ -628,3 +751,3 @@
 	char *line = (char *)ml_get_buf(buf, n, FALSE);
-	return line ? rb_str_new2(line) : Qnil;
+	return line ? vim_str2rb_enc_str(line) : Qnil;
     }
@@ -647,3 +770,3 @@
 {
-    char	*line = STR2CSTR(str);
+    char	*line = StringValuePtr(str);
     aco_save_T	aco;
@@ -725,3 +848,3 @@
     buf_T	*buf = get_buf(self);
-    char	*line = STR2CSTR(str);
+    char	*line = StringValuePtr(str);
     long	n = NUM2LONG(num);
@@ -892,6 +1015,6 @@
     Check_Type(pos, T_ARRAY);
-    if (RARRAY(pos)->len != 2)
+    if (RARRAY_LEN(pos) != 2)
 	rb_raise(rb_eArgError, "array length must be 2");
-    lnum = RARRAY(pos)->ptr[0];
-    col = RARRAY(pos)->ptr[1];
+    lnum = RARRAY_PTR(pos)[0];
+    col = RARRAY_PTR(pos)[1];
     win->w_cursor.lnum = NUM2LONG(lnum);
@@ -912,3 +1035,3 @@
     }
-    MSG(RSTRING(str)->ptr);
+    MSG(RSTRING_PTR(str));
     return Qnil;

Raspunde prin e-mail lui