https://github.com/hogelog/kakasi-ruby
ruby用のkakasiモジュールはそのままではruby1.9ではコンパイルが通りません
そこで↓を参考に修正
http://www.metareal.org/2007/06/14/ruby-extension-struct-rstring-macros/
パッチ
diff -u kakasi-ruby-master/kakasi.c kakasi-ruby-master-1.9/kakasi.c --- kakasi-ruby-master/kakasi.c 2013-04-19 10:14:17.000000000 +0900 +++ kakasi-ruby-master-1.9/kakasi.c 2013-04-19 10:08:46.000000000 +0900 @@ -3,24 +3,28 @@ * Copyright (c) 1999-2002 GOTO Kentaro */ - #include#include "ruby.h" #include "libkakasi.h" - #define OPTMAX 1024 #define min(x,y) ((x)<(y) ? (x) : (y)) +// 130419 for 1.9 +#ifndef RSTRING_PTR +#define RSTRING_PTR(s) (RSTRING(s)->ptr) +#endif +#ifndef RSTRING_LEN +#define RSTRING_LEN(s) (RSTRING(s)->len) +#endif + static char const rcsid[] = "$kNotwork: kakasi.c,v 1.3 2002/09/28 05:21:37 gotoken Exp $"; - static int dic_closed = 1, len = 0; static char prev_opt_ptr[OPTMAX]; - static VALUE rb_kakasi_kakasi(obj, opt, src) VALUE obj, opt, src; @@ -30,45 +34,36 @@ char *buf, *opt_ptr, *t; VALUE dst; - Check_Type(src, T_STRING); - /* return "" immediately if source str is empty */ - if (RSTRING(src)->len == 0) + if(RSTRING_LEN(src)==0) return rb_str_new2(""); - Check_Type(opt, T_STRING); - /* initialize kakasi iff opt != previous opt */ - if (0 == len || 0 != strncmp(RSTRING(opt)->ptr, prev_opt_ptr, - min(RSTRING(opt)->len, len))) { - strncpy(prev_opt_ptr, RSTRING(opt)->ptr, RSTRING(opt)->len); - len = RSTRING(opt)->len; - + if (0 == len || 0 != strncmp(RSTRING_PTR(opt), prev_opt_ptr, + min(RSTRING_LEN(opt), len))) { + strncpy(prev_opt_ptr, RSTRING_PTR(opt), RSTRING_LEN(opt)); + len = RSTRING_LEN(opt); if (len + 1 > OPTMAX) { rb_raise(rb_eArgError, "too long 1st arg (should be < 1023)"); } - if (!dic_closed) { kakasi_close_kanwadict(); dic_closed = 1; } - - argv = opts = ALLOCA_N(char*, RSTRING(opt)->len); + argv = opts = ALLOCA_N(char*, RSTRING_LEN(opt)); *opts++ = "kakasi"; argc++; - - opt_ptr = ALLOCA_N(char, 1 + RSTRING(opt)->len); - strncpy(opt_ptr, RSTRING(opt)->ptr, RSTRING(opt)->len); - opt_ptr[RSTRING(opt)->len] = '\0'; - + opt_ptr = ALLOCA_N(char, 1 + RSTRING_LEN(opt)); + strncpy(opt_ptr, RSTRING_PTR(opt), RSTRING_LEN(opt)); + opt_ptr[RSTRING_LEN(opt)] = '\0'; if (*opts++ = strtok(opt_ptr, " \t")) { argc++; @@ -77,42 +72,37 @@ argc++; } } - - + if (0 != kakasi_getopt_argv(argc, argv)) rb_raise(rb_eRuntimeError, "failed to initialize kakasi"); dic_closed = 0; } - dst = rb_str_new2(""); - while (i < RSTRING(src)->len) { - if (*(RSTRING(src)->ptr + i) != '\0') { - buf = kakasi_do((RSTRING(src)->ptr + i)); + while (i < RSTRING_LEN(src)) { + if (*(RSTRING_PTR(src) + i) != '\0') { + buf = kakasi_do((RSTRING_PTR(src) + i)); rb_str_concat(dst, rb_str_new2(buf)); if (*buf) free(buf); - while (*(RSTRING(src)->ptr + i) != '\0') { + while (*(RSTRING_PTR(src) + i) != '\0') { i++; } } - if (i == RSTRING(src)->len) { + if (i == RSTRING_LEN(src)) { break; } rb_str_concat(dst, rb_str_new("\0", 1)); i++; } - return dst; } - void Init_kakasi() { VALUE mKakasi = rb_define_module("Kakasi"); - rb_define_module_function(mKakasi, "kakasi", rb_kakasi_kakasi, 2); rb_define_const(mKakasi, "KAKASI_VERSION", rb_str_new2("2002-09-28")); }
と思って作成していたらすでに修正している人がいました。_| ̄|○