module ChiseValue; end
module TableAccessModule; end
- class DataSource
+ class DataSource_R
NONE = 0
Berkeley_DB = 1
+ DB_DIR = "/cygdrive/c/chise/chise-db"
- def initialize(type=Berkeley_DB, loc=nil, subtype=0, modemask=0755)
+ def initialize(type=Berkeley_DB, loc=DB_DIR, subtype=0, modemask=0755)
@type = type
loc = Config.instance.db_dir if loc.nil?
@location = loc.path
@fdb = {}
@cdb = {}
end
- attr_reader :type, :location, :subtype, :modemask
+ attr_reader :type, :subtype, :modemask
+
+ def close() end
def get_feature(f)
- @fdb[f] = FeatureTable.new(self, f) if @fdb[f].nil?
+ @fdb[f] = Feature.new(self, f) if @fdb[f].nil?
@fdb[f]
end
def get_ccs(ccs)
- @cdb[ccs] = CCSTable.new(self, ccs) if @cdb[ccs].nil?
+ @cdb[ccs] = CCS.new(self, ccs) if @cdb[ccs].nil?
@cdb[ccs]
end
- def each_feature
- each_entry("character/feature") {|f| yield(f) }
- end
-
- def each_ccs
- each_entry("character/by_feature") {|f| yield(f) }
+ def each_feature_name
+ each_entry("character/feature") {|f| yield f }
end
def load_feature(name, cid)
@name = name
dbdir = dir + cat + keytype
- #qp dbdir.to_s
- #FileUtils.mkdir_p(dbdir.to_s) unless dbdir.directory?
- #qp dbdir.to_s, "2"
path = dbdir + name.path.escape.escape_win_filename
- #qp path.basename.to_s, amask, mmask
-# if /test/ =~ path.to_s
-# qp path.to_s, amask
-# end
if amask == BDB::RDONLY
- #raise unless path.exist?
- #raise unless FileTest.exist?(path.to_s)
- v = FileTest.exist?(path.to_s)
- #return unless v
- raise unless v
+ raise unless FileTest.exist?(path.to_s)
end
-# @db = BDB::Hash.open(path.to_s, nil, amask, mmask)
@db = BDB::Hash.open(path.to_s, nil, amask)
at_exit {
close
begin
@db.sync
@db.close
- #p ["AttributeTable: close", @name]
rescue => e
- #p e
+ p e
end
end
@db = AttributeTable.new(@ds.location, @category, @keyvalue,
@name, @access, @ds.modemask)
rescue => e
- #qp e
@db = nil
end
- #raise if @db.nil?
end
end
- class FeatureTable
+ class Feature_R
include ChiseValue
include TableAccessModule
def get_value(cid)
setup_db
return nil if @db.nil?
- parse_value(@db.get(format_char_id(cid)))
+ @db.get(format_char_id(cid))
end
def set_value(cid, value)
@db.put(format_char_id(cid), value)
end
- def each
+ def each_char
setup_db
raise "@db is nil." if @db.nil?
@db.each {|k, v|
end
end
- class CCSTable
+ class CCS_R
include ChiseValue
include TableAccessModule
setup_db
raise "@db is nil." if @db.nil?
@db.each {|k, v|
- yield(parse_value(k), parse_c_string(v))
+ yield(k, parse_c_string(v))
}
end
end
module ChiseValue
- def parse_value(v)
- return v if v.nil?
- #return v if v.kind_of?(Integer)
- return v.to_i if /\A\d+\Z/ =~ v # number?
- return $1 if /\A"(.+)"\Z/ =~ v # remove surrounding "
- #return v.sub(/\A\?/, "") if v =~ /\A\?/ # remove ? in the head
- #return parse_sexp(v) if v =~ /\A\(.+\)\Z/ # parse sexp # not yet
- v
- end
-
def parse_c_string(str)
return nil if str.nil?
#include "ruby.h"
#include "chise.h"
-static VALUE mCHISE, cDS, cCCS, cFEATURE, cVALUE;
+static VALUE mCHISE, cDS, cCCS, cFEATURE;
typedef struct {
CHISE_DS *ds;
CHISE_CCS_Table *ccs;
} RB_CHISE_CCS;
-typedef struct {
- CHISE_Value value;
-} RB_CHISE_VALUE;
-
static VALUE fds_new(VALUE klass, VALUE type, VALUE location, VALUE dbtype, VALUE mode){
RB_CHISE_DS *rds;
VALUE tdata = Data_Make_Struct(klass, RB_CHISE_DS, 0, free, rds);
- rds->ds = CHISE_DS_open((CHISE_DS_Type)NUM2INT(type), RSTRING(rb_str_to_str(location))->ptr, NUM2INT(dbtype), NUM2INT(mode));
- if (rds->ds == NULL){
- return Qnil;
- }
+ rds->ds = CHISE_DS_open((CHISE_DS_Type)NUM2INT(type), STR2CSTR(location), NUM2INT(dbtype), NUM2INT(mode));
+ if (rds->ds == NULL) return Qnil;
return tdata;
}
return Qnil;
}
-static VALUE fds_get_feature(VALUE obj, VALUE feature){
- RB_CHISE_DS *rds;
- RB_CHISE_FEATURE *rfeature;
- VALUE vfeature;
- int status;
- Data_Get_Struct(obj, RB_CHISE_DS, rds);
- vfeature = Data_Make_Struct(cFEATURE, RB_CHISE_FEATURE, 0, free, rfeature);
- rfeature->feature = chise_ds_get_feature(rds->ds, RSTRING(rb_str_to_str(feature))->ptr);
- return vfeature;
+static int name_map_func(CHISE_DS *ds, unsigned char *name){
+ rb_yield(rb_str_new2(name));
+ return 0; // important
}
-static VALUE fds_get_ccs(VALUE obj, VALUE ccs){
+static VALUE fds_each_feature_name(VALUE obj){
RB_CHISE_DS *rds;
- RB_CHISE_CCS *rccs;
- VALUE vccs;
- int status;
Data_Get_Struct(obj, RB_CHISE_DS, rds);
- vccs = Data_Make_Struct(cCCS, RB_CHISE_CCS, 0, free, rccs);
- rccs->ccs = chise_ds_get_ccs(rds->ds, RSTRING(rb_str_to_str(ccs))->ptr);
- if (rccs->ccs == NULL){
- return Qnil;
- }
- return vccs;
+ chise_ds_foreach_char_feature_name(rds->ds, &name_map_func);
+ return Qnil;
}
-static VALUE fds_decode_char(VALUE obj, VALUE ccs, VALUE code_point){
+static VALUE fds_get_feature(VALUE obj, VALUE name){
RB_CHISE_DS *rds;
- CHISE_Char_ID char_id;
+ RB_CHISE_FEATURE *rfeature;
Data_Get_Struct(obj, RB_CHISE_DS, rds);
- char_id = chise_ds_decode_char(rds->ds, RSTRING(rb_str_to_str(ccs))->ptr, NUM2INT(code_point));
- return INT2NUM(char_id);
+ VALUE vfeature = Data_Make_Struct(cFEATURE, RB_CHISE_FEATURE, 0, free, rfeature);
+ rfeature->feature = chise_ds_get_feature(rds->ds, STR2CSTR(name));
+ return vfeature;
}
-static int name_map_func(CHISE_DS *ds, unsigned char *name){
- rb_yield(rb_str_new2(name));
- return 0; // important
+static VALUE ffeature_setup_db(VALUE obj, VALUE writable){
+ RB_CHISE_FEATURE *rfeature;
+ Data_Get_Struct(obj, RB_CHISE_FEATURE, rfeature);
+ int status = chise_feature_setup_db(rfeature->feature, NUM2INT(writable));
+ if (status) return Qnil;
+ return Qtrue;
}
-static VALUE fds_each_feature_name(VALUE obj){
- RB_CHISE_DS *rds;
- Data_Get_Struct(obj, RB_CHISE_DS, rds);
- chise_ds_foreach_char_feature_name(rds->ds, &name_map_func);
- return Qnil;
+static VALUE ffeature_sync(VALUE obj){
+ RB_CHISE_FEATURE *rfeature;
+ Data_Get_Struct(obj, RB_CHISE_FEATURE, rfeature);
+ int status = chise_feature_sync(rfeature->feature);
+ if (status) return Qnil;
+ return Qtrue;
+}
+
+static VALUE ffeature_set_value(VALUE obj, VALUE cid, VALUE value){
+ RB_CHISE_FEATURE *rfeature;
+ Data_Get_Struct(obj, RB_CHISE_FEATURE, rfeature);
+ int status = chise_char_set_feature_value((CHISE_Char_ID)NUM2INT(cid), rfeature->feature, STR2CSTR(value));
+ if (status) return Qnil;
+ return Qtrue;
}
-static VALUE ffeature_get_value(VALUE obj, VALUE char_id){
+static VALUE ffeature_get_value(VALUE obj, VALUE cid){
RB_CHISE_FEATURE *rfeature;
- RB_CHISE_VALUE *rvalue;
- VALUE vvalue;
- int status;
+ CHISE_Value valdatum;
Data_Get_Struct(obj, RB_CHISE_FEATURE, rfeature);
- vvalue = Data_Make_Struct(cVALUE, RB_CHISE_VALUE, 0, free, rvalue);
- status = chise_char_load_feature_value((CHISE_Char_ID)NUM2INT(char_id), rfeature->feature, &rvalue->value);
- if (status)
- return Qnil;
- return vvalue;
+ int status = chise_char_load_feature_value((CHISE_Char_ID)NUM2INT(cid), rfeature->feature, &valdatum);
+ if (status) return Qnil;
+ return rb_str_new(valdatum.data, valdatum.size);
+}
+
+static VALUE fds_load_feature(VALUE obj, VALUE cid, VALUE name){
+ RB_CHISE_DS *rds;
+ CHISE_Value valdatum;
+ Data_Get_Struct(obj, RB_CHISE_DS, rds);
+ int status = chise_ds_load_char_feature_value(rds->ds, NUM2INT(cid), STR2CSTR(name), &valdatum);
+ if (status) return Qnil;
+ return rb_str_new(valdatum.data, valdatum.size);
}
static int feature_map_func(CHISE_Char_ID cid, CHISE_Feature_Table *db, CHISE_Value *valdatum){
- RB_CHISE_VALUE *rvalue;
- VALUE vvalue;
- VALUE var;
- vvalue = Data_Make_Struct(cVALUE, RB_CHISE_VALUE, 0, free, rvalue);
- memcpy(&rvalue->value, valdatum, sizeof(CHISE_Value));
- var = rb_ary_new3(2, INT2NUM(cid), vvalue);
- rb_yield(var);
+ VALUE vstr = rb_str_new(valdatum->data, valdatum->size);
+ rb_yield(rb_assoc_new(INT2NUM(cid), vstr));
return 0;
}
return Qnil;
}
-static VALUE fccs_decode(VALUE obj, VALUE code_point){
+static VALUE fds_get_ccs(VALUE obj, VALUE ccs){
+ RB_CHISE_DS *rds;
+ RB_CHISE_CCS *rccs;
+ Data_Get_Struct(obj, RB_CHISE_DS, rds);
+ VALUE vccs = Data_Make_Struct(cCCS, RB_CHISE_CCS, 0, free, rccs);
+ rccs->ccs = chise_ds_get_ccs(rds->ds, STR2CSTR(ccs));
+ if (rccs->ccs == NULL) return Qnil;
+ return vccs;
+}
+
+static VALUE fds_decode_char(VALUE obj, VALUE ccs, VALUE code_point){
+ RB_CHISE_DS *rds;
+ Data_Get_Struct(obj, RB_CHISE_DS, rds);
+ CHISE_Char_ID cid = chise_ds_decode_char(rds->ds, STR2CSTR(ccs), NUM2INT(code_point));
+ return INT2NUM(cid);
+}
+
+static VALUE fccs_setup_db(VALUE obj, VALUE writable){
RB_CHISE_CCS *rccs;
Data_Get_Struct(obj, RB_CHISE_CCS, rccs);
- CHISE_Char_ID char_id;
- char_id = chise_ccs_decode(rccs->ccs, NUM2INT(code_point));
- return INT2NUM(char_id);
+ int status = chise_ccs_setup_db(rccs->ccs, NUM2INT(writable));
+ if (status) return Qnil;
+ return Qtrue;
}
-static VALUE fvalue_to_s(VALUE obj){
- RB_CHISE_VALUE *rvalue;
- Data_Get_Struct(obj, RB_CHISE_VALUE, rvalue);
- return rb_str_new(chise_value_to_c_string(&rvalue->value), chise_value_size(&rvalue->value));
+static VALUE fccs_sync(VALUE obj){
+ RB_CHISE_CCS *rccs;
+ Data_Get_Struct(obj, RB_CHISE_CCS, rccs);
+ int status = chise_ccs_sync(rccs->ccs);
+ if (status) return Qnil;
+ return Qtrue;
+}
+
+static VALUE fccs_set(VALUE obj, VALUE code_point, VALUE cid){
+ RB_CHISE_CCS *rccs;
+ Data_Get_Struct(obj, RB_CHISE_CCS, rccs);
+ int status = chise_ccs_set_decoded_char(rccs->ccs, NUM2INT(code_point), (CHISE_Char_ID)NUM2INT(cid));
+ if (status) return Qnil;
+ return Qtrue;
+}
+
+static VALUE fccs_decode(VALUE obj, VALUE code_point){
+ RB_CHISE_CCS *rccs;
+ Data_Get_Struct(obj, RB_CHISE_CCS, rccs);
+ CHISE_Char_ID cid = chise_ccs_decode(rccs->ccs, NUM2INT(code_point));
+ return INT2NUM(cid);
}
void Init_libchise_c(){
mCHISE = rb_define_module("CHISE");
- rb_define_const(mCHISE, "DB_DIR", rb_str_new2(chise_system_db_dir));
- cDS = rb_define_class_under(mCHISE, "DataSource", rb_cObject);
- rb_define_singleton_method(cDS, "new", fds_new, 4);
- rb_define_method(cDS, "close", fds_close, 0);
+ cDS = rb_define_class_under(mCHISE, "DataSource_C", rb_cObject);
rb_define_const(cDS, "NONE", INT2FIX(CHISE_DS_NONE));
rb_define_const(cDS, "Berkeley_DB", INT2FIX(CHISE_DS_Berkeley_DB));
-
+ rb_define_const(cDS, "DB_DIR", rb_str_new2(chise_system_db_dir));
+ rb_define_singleton_method(cDS, "new", fds_new, 4);
+ rb_define_method(cDS, "close", fds_close, 0);
+ rb_define_method(cDS, "each_feature_name", fds_each_feature_name, 0);
rb_define_method(cDS, "get_feature", fds_get_feature, 1);
+ rb_define_method(cDS, "load_feature", fds_load_feature, 2);
rb_define_method(cDS, "get_ccs", fds_get_ccs, 1);
rb_define_method(cDS, "decode_char", fds_decode_char, 2);
- rb_define_method(cDS, "each_feature_name", fds_each_feature_name, 0);
- cFEATURE = rb_define_class_under(mCHISE, "Feature", rb_cObject);
+ cFEATURE = rb_define_class_under(mCHISE, "Feature_C", rb_cObject);
+ rb_define_method(cFEATURE, "setup_db", ffeature_setup_db, 1);
+ rb_define_method(cFEATURE, "sync", ffeature_sync, 0);
+ rb_define_method(cFEATURE, "set_value", ffeature_set_value, 2);
rb_define_method(cFEATURE, "get_value", ffeature_get_value, 1);
rb_define_method(cFEATURE, "each_char", ffeature_each_char, 0);
- cCCS = rb_define_class_under(mCHISE, "CCS", rb_cObject);
+ cCCS = rb_define_class_under(mCHISE, "CCS_C", rb_cObject);
+ rb_define_method(cCCS, "setup_db", fccs_setup_db, 1);
+ rb_define_method(cCCS, "sync", fccs_sync, 0);
+ rb_define_method(cCCS, "set", fccs_set, 2);
rb_define_method(cCCS, "decode", fccs_decode, 1);
-
- cVALUE = rb_define_class_under(mCHISE, "Value", rb_cObject);
- rb_define_method(cVALUE, "to_s", fvalue_to_s, 0);
}