1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/*
* Ruby extenstion library for libhangul.
*
* * Author: Gyoung-Yoon Noh <nohmad@sub-port.net>
* * License: Same as libhangul.
*/
#include <locale.h>
#include "ruby.h"
#include "hangul.h"
static void
rbhic_free(HangulInputContext *hic)
{
hangul_ic_delete(hic);
}
static VALUE
rbhic_alloc(VALUE klass)
{
setlocale(LC_CTYPE, "");
HangulInputContext *hic = hangul_ic_new("2");
return Data_Wrap_Struct(klass, 0, rbhic_free, hic);
}
static VALUE
rbhic_initialize(int argc, VALUE *argv, VALUE self)
{
HangulInputContext *hic;
Data_Get_Struct(self, HangulInputContext, hic);
VALUE keyboard;
rb_scan_args(argc, argv, "01", &keyboard);
if (argc > 0) {
Check_Type(keyboard, T_STRING);
hangul_ic_select_keyboard(hic, RSTRING_PTR(keyboard));
}
return self;
}
static VALUE
rbhic_process(VALUE self, VALUE ch)
{
Check_Type(ch, T_FIXNUM);
HangulInputContext *hic;
Data_Get_Struct(self, HangulInputContext, hic);
bool ret = hangul_ic_process(hic, NUM2CHR(ch));
return ret ? Qtrue : Qfalse;
}
static VALUE
rbhic_preedit_string(VALUE self)
{
}
static VALUE
rbhic_commit_string(VALUE self)
{
HangulInputContext *hic;
Data_Get_Struct(self, HangulInputContext, hic);
char cbuf[64] = { '\0', };
wchar_t *wstr = (wchar_t *) hangul_ic_get_commit_string(hic);
int len = wcstombs(cbuf, wstr, sizeof(cbuf));
if (strlen(cbuf) > 0)
return rb_str_new(cbuf, len);
else
return Qnil;
}
static VALUE
rbhic_backspace(VALUE self)
{
}
static VALUE
rbhic_reset(VALUE self)
{
HangulInputContext *hic;
Data_Get_Struct(self, HangulInputContext, hic);
hangul_ic_reset(hic);
return Qnil;
}
static VALUE
rbhic_flush(VALUE self)
{
HangulInputContext *hic;
Data_Get_Struct(self, HangulInputContext, hic);
hangul_ic_flush(hic);
return Qnil;
}
void
Init_hangul(void)
{
/* ::Hangul module. */
VALUE rb_mHangul;
rb_mHangul = rb_define_module("Hangul");
/* Hangul::InputContext class. */
VALUE rb_cInputContext;
rb_cInputContext = rb_define_class_under(rb_mHangul, "InputContext", rb_cObject);
rb_define_alloc_func(rb_cInputContext, rbhic_alloc);
/* Hangul::InputContext methods. */
rb_define_method(rb_cInputContext, "initialize", rbhic_initialize, -1);
rb_define_method(rb_cInputContext, "process", rbhic_process, 1);
rb_define_method(rb_cInputContext, "commit_string", rbhic_commit_string, 0);
rb_define_method(rb_cInputContext, "preedit_string", rbhic_preedit_string, 0);
rb_define_method(rb_cInputContext, "backspace", rbhic_backspace, 0);
rb_define_method(rb_cInputContext, "flush", rbhic_flush, 0);
rb_define_method(rb_cInputContext, "reset", rbhic_reset, 0);
}
|