ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ???????????????????????????????????? ???????????????????????????????????? ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ???????????????????????????????????? ???????????????????????????????????? .\" README.EXT.ja - -*- Text -*- created at: Mon Aug 7 16:45:54 JST 1995 Rubyγĥ饤֥κޤ 1μ CѿˤϷꡤǡˤϷޤ󡥤Ǥ顤 ȤХݥ󥿤intѿȡͤȤƼ 갷ޤդRubyѿˤϷʤǡ˷ ΰ㤤ΤᡤCRubyߤѴʤСߤ ǡ򥢥Ǥޤ RubyΥǡVALUEȤCηɽޤVALUEΥǡ ϤΥǡפʬΤäƤޤΥǡפ Τϥǡ(֥)μºݤι¤̣ƤơRuby Υ饹ȤϤޤäΤǤ VALUECˤȤäựΤǡФˤ (1) VALUEΥǡפΤ (2) VALUECΥǡѴ ξɬפǤ(1)˺ȴְäǡѴԤ ơǰץबcore dumpޤ 1.1 ǡ Rubyˤϥ桼ȤǽΤʲΥפޤ T_NIL nil T_OBJECT ̾Υ֥ T_CLASS 饹 T_MODULE ⥸塼 T_FLOAT ư T_STRING ʸ T_REGEXP ɽ T_ARRAY T_FIXNUM Fixnum(31bitĹ) T_HASH Ϣ T_STRUCT (Ruby)¤ T_BIGNUM ¿Ĺ T_FILE T_TRUE T_FALSE T_DATA ǡ T_SYMBOL ܥ ¾ѤƤʲΥפޤ T_ICLASS T_MATCH T_UNDEF T_VARMAP T_SCOPE T_NODE ۤȤɤΥפCι¤ΤǼƤޤ 1.2 VALUEΥǡפå ruby.hǤTYPE()ȤޥƤơVALUEΥǡ פΤ뤳ȤޤTYPE()ޥϾǾҲ𤷤T_XXXX η֤ޤVALUEΥǡפ˱ƽ ˤϡTYPE()ͤʬ뤳Ȥˤʤޤ switch (TYPE(obj)) { case T_FIXNUM: /* FIXNUMν */ break; case T_STRING: /* ʸν */ break; case T_ARRAY: /* ν */ break; default: /* 㳰ȯ */ rb_raise(rb_eTypeError, "not valid value"); break; } ȥǡפåơʤ㳰ȯ ؿѰդƤޤ void Check_Type(VALUE value, int type) δؿvaluetype̵С㳰ȯޤ Ϳ줿VALUEΥǡפɤå 뤿ˤϡδؿȤޤ FIXNUMNIL˴ؤƤϤ®Ƚ̥ޥѰդƤޤ FIXNUM_P(obj) NIL_P(obj) 1.3 VALUECΥǡѴ ǡפT_NIL, T_FALSE, T_TRUEǤǡϤ줾 nil, false, trueǤΥǡפΥ֥ȤϤҤ ĤĤ¸ߤޤ ǡפT_FIXNUMλ31bitΥ FIXNUMCѴ뤿ˤϥޥFIX2INT()פ ޤ줫顤FIXNUM˸¤餺RubyΥǡѴ NUM2INT()פȤޥޤΥޥϥǡ פΥå̵ǻȤޤ(ѴǤʤˤ㳰 ȯ)Ʊͤ˥å̵ǻȤѴޥdouble ФNUM2DBL()פޤ char* Ф硢version 1.6 ǤϡSTR2CSTR()פ ޥȤäƤޤ to_str() ˤۤ Ѵ̤ GC ǽ뤿ᡢversion 1.7 ʹߤǤ obsolete Ȥʤꡢ StringValue() StringValuePtr() Ȥ侩ƤޤStringValue(var) var String Ǥв⤻Ǥʤ var var.to_str() η̤ ֤ޥStringValuePtr(var) Ʊͤ var ֤ Ƥ var ʸɽФ char* ֤ޥǤvar Ƥľ֤Τǡvar lvalue Ǥɬפ ޤ ʳΥǡפбCι¤Τޤб 빽¤ΤΤVALUEϤΤޤޥ㥹(Ѵ)й¤Τ ݥ󥿤ѴǤޤ ¤Τϡstruct RXxxxxפȤ̾ruby.hƤ 㤨ʸϡstruct RStringפǤºݤ˻Ȥǽ Τʸ󤯤餤Ȼפޤ ruby.hǤϹ¤Τإ㥹ȤޥRXXXXX()(ʸ ˤ)Ȥ̾󶡤Ƥޤ(: RSTRING()) 㤨СʸstrĹ뤿ˤϡRSTRING(str)->lenפ ʸstrchar*Ȥ뤿ˤϡRSTRING(str)->ptr Ȥޤξˤϡ줾RARRAY(ary)->lenס RARRAY(ary)->ptrפȤʤޤ Rubyι¤Τľܥ˵ĤʤФʤʤ Ȥϡʸι¤ΤȤϻȤǡľѹ ʤȤǤľѹ硤֥ȤƤ Ȥʤʤäơפ̥Хθˤʤޤ 1.4 CΥǡVALUEѴ VALUEμºݤι¤ * FIXNUMξ 1bitեȤơLSBΩƤ롥 * ¾Υݥ󥿤ξ ΤޤVALUE˥㥹Ȥ롥 ȤʤäƤޤäơLSBåVALUEFIXNUM 狼櫓Ǥ(ݥ󥿤LSBΩäƤʤȤꤷ ) Ǥ顤FIXNUMʳRubyΥ֥Ȥι¤ΤñVALUE ˥㥹ȤVALUEѴޤǤդι¤ ΤVALUE˥㥹Ƚ櫓ǤϤޤ󡥥㥹Ȥ RubyΤäƤ빽¤(ruby.hƤstruct RXxxx Τ)Ǥ FIXNUM˴ؤƤѴޥͳɬפޤC VALUEѴޥϰʲΤΤޤɬפ˱ ƻȤʬƤ INT2FIX() Ȥ31bit˼ޤ뼫 INT2NUM() ǤդVALUE INT2NUM()FIXNUMϰϤ˼ޤʤ硤BignumѴ Ƥޤ(٤) 1.5 RubyΥǡ Ҥ٤̤ꡤRubyι¤Τ򥢥Ƥι ԤȤϴޤ󡥤ǡRubyΥǡˤ RubyѰդƤؿѤƤ ǤϤäȤȤǤʸ/ ؿ򤢤ޤ(ǤϤʤǤ) ʸФؿ rb_str_new(const char *ptr, long len) Rubyʸ롥 rb_str_new2(const char *ptr) Cʸ󤫤Rubyʸ롥δؿεǽ rb_str_new(ptr, strlen(ptr))ƱǤ롥 rb_tainted_str_new(const char *ptr, long len) ޡղä줿Rubyʸ롥 Υǡ˴Ťʸˤϱޡղä٤ Ǥ롥 rb_tainted_str_new2(const char *ptr) Cʸ󤫤ޡղä줿Rubyʸ롥 rb_str_cat(VALUE str, const char *ptr, long len) RubyʸstrlenХȤʸptrɲä롥 Фؿ rb_ary_new() Ǥ0롥 rb_ary_new2(long len) Ǥ0롥lenʬΰ򤢤餫 ƤƤ rb_ary_new3(long n, ...) ǻꤷnǤޤ롥 rb_ary_new4(long n, VALUE *elts) ͿnǤ롥 rb_ary_push(VALUE ary, VALUE val) rb_ary_pop(VALUE ary) rb_ary_shift(VALUE ary) rb_ary_unshift(VALUE ary, VALUE val) ArrayƱ̾Υ᥽åɤƱƯ򤹤ؿ1ɬ ǤʤФʤʤ 2RubyεǽȤ ŪRubyǽ񤱤뤳ȤCǤ񤱤ޤRubyΤΤCǵ ҤƤǤ顤ȤʤǤɡ Rubyγĥ˻ȤȤ¿ͽ¬뵡ǽ濴˾ 𤷤ޤ 2.1 Ruby˵ǽɲä Ruby󶡤ƤؿȤRuby󥿥ץ꥿˿ǽ ɲä뤳ȤǤޤRubyǤϰʲεǽɲäؿ 󶡤Ƥޤ * 饹⥸塼 * ᥽åɡðۥ᥽åɤʤ * ǤϽ˾Ҳ𤷤ޤ 2.1.1 饹/⥸塼 饹⥸塼뤿ˤϡʲδؿȤޤ VALUE rb_define_class(const char *name, VALUE super) VALUE rb_define_module(const char *name) δؿϿ줿饹⥸塼֤ޤ ᥽åɤˤͤɬפʤΤǡۤȤɤξ ͤѿ˳ǼƤɬפǤ礦 饹⥸塼¾Υ饹˥ͥȤ ϰʲδؿȤޤ VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super) VALUE rb_define_module_under(VALUE outer, const char *name) 2.1.2 ᥽å/ðۥ᥽å ᥽åɤðۥ᥽åɤˤϰʲδؿȤޤ void rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc) void rb_define_singleton_method(VALUE object, const char *name, VALUE (*func)(), int argc) ǰΤȡðۥ᥽åɡפȤϡΥ֥ ȤФƤͭʥ᥽åɤǤRubyǤϤ褯Smalltalkˤ 륯饹᥽åɤȤơ饹Фðۥ᥽åɤȤ ޤ δؿ argcȤCδؿϤο( )ޤargc0ʾλϴؿ˰Ϥο ̣ޤ16İʾΰϻȤޤ(פޤ͡ ʤ)ºݤδؿˤƬΰȤselfͿޤ ǡꤷ1¿ĤȤˤʤޤ argcλϰοǤϤʤꤷȤˤʤޤ argc-1λϰϤޤargc-2λϰ RubyȤϤޤ ᥽åɤؿϤ⤦ĤޤҤȤĤprivate åɤؿǡrb_define_method()ƱǤ void rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc) private᥽åɤȤϴؿǤƤӽФȤνʤ᥽ ɤǤ ⤦ҤȤĤϥ⥸塼ؿΤǤ⥸塼ؿ Ȥϥ⥸塼ðۥ᥽åɤǤꡤƱprivate᥽åɤ ⤢ΤǤ򤢤Math⥸塼sqrt()ʤɤ ޤΥ᥽åɤ Math.sqrt(4) ȤǤ include Math sqrt(4) ȤǤȤޤ⥸塼ؿؿϰʲ ̤Ǥ void rb_define_module_function(VALUE module, const char *name, VALUE (*func)(), int argc) ؿŪ᥽å(Kernel⥸塼private method)뤿 δؿϰʲ̤Ǥ void rb_define_global_function(const char *name, VALUE (*func)(), int argc) ᥽åɤ̾뤿δؿϰʲ̤Ǥ void rb_define_alias(VALUE module, const char* new, const char* old); 饹᥽åallocateꤹ뤿δؿ ʲ̤Ǥ void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass)); void rb_undef_alloc_func(VALUE klass); funcϥ饹ȤƼäơƤ줿 󥹤֤ʤƤϤʤޤ󡣤Υ󥹥󥹤ϡ ʤɤޤޤʤǤֶפΤޤޤˤƤۤ 褤Ǥ礦 2.1.3 ĥ饤֥꤬ɬפϤ餫Ƥɤ Ǥ礦ؿĤޤ void rb_define_const(VALUE klass, const char *name, VALUE val) void rb_define_global_const(const char *name, VALUE val) ԤΥ饹/⥸塼°Ρ ԤϥХΤǤ 2.2 RubyεǽCƤӽФ ˡ1.5 RubyΥǡ٤ǰҲ𤷤褦ʴؿ ȤСRubyεǽ¸ƤؿľܸƤӽФȤ ޤ # Τ褦ʴؿΰɽϤޤΤȤޤ󡥥 # 뤷ʤǤ͡ ʳˤRubyεǽƤӽФˡϤĤޤ 2.2.1 RubyΥץeval CRubyεǽƤӽФäȤñˡȤơʸ Ϳ줿RubyΥץɾʲδؿޤ VALUE rb_eval_string(const char *str) ɾϸߤδĶǹԤޤĤޤꡤߤΥѿ ʤɤѤޤ 2.2.2 IDޤϥܥ CʸͳRubyΥ᥽åɤƤӽФȤǤ ˡRuby󥿥ץ꥿ǥ᥽åɤѿ̾ꤹ ˻ȤƤIDˤĤƤޤ礦 IDȤѿ̾᥽å̾ɽǤRubyǤIDб ֥ȤȤƥܥ(Symbol)ꡤ :̻ ǥǤޤC餳뤿ˤϴؿ rb_intern(const char *name) ȤޤRubyȤͿ줿ܥ(ޤʸ )IDѴˤϰʲδؿȤޤ rb_to_id(VALUE symbol) ID饷ܥ뤿ˤϰʲΥޥȤޤ VALUE ID2SYM(ID id) ܥ뤫ID뤿ˤϰʲΥޥȤޤ ID SYM2ID(VALUE symbol) 2.2.3 CRubyΥ᥽åɤƤӽФ CʸͳRubyΥ᥽åɤƤӽФˤϰʲ δؿȤޤ VALUE rb_funcall(VALUE recv, ID mid, int argc, ...) δؿϥ֥recvmidǻꤵ᥽åɤƤӽ ޤ¾˰λλ㤦ʲδؿ⤢ޤ VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) VALUE rb_apply(VALUE recv, ID mid, VALUE args) applyˤϰȤRubyͿޤ 2.2.4 ѿ/򻲾/ CؿȤäƻȡǤΤϡ󥹥 ǤѿϰΤΤCѿȤƥǤ ޤѿ򻲾ȤˡϸƤޤ ֥ȤΥ󥹥ѿ򻲾ȡؿϰʲ Ǥ VALUE rb_ivar_get(VALUE obj, ID id) VALUE rb_ivar_set(VALUE obj, ID id, VALUE val) idrb_intern()ΤȤäƤ 򻲾ȤˤϰʲδؿȤäƤ VALUE rb_const_get(VALUE obj, ID id) 򿷤뤿ˤϡ2.1.3 ٤ǾҲ ƤؿȤäƤ 3RubyCȤξͭ CRubyδ֤ǾͭˡˤĤƲ⤷ޤ 3.1 C黲ȤǤRuby ʲRubyCΥ٥뤫黲ȤǤޤ Qtrue Qfalse ͡QfalseCǤ⵶Ȥߤʤޤ(Ĥޤ0) Qnil C줫鸫nilס 3.2 CRubyǶͭѿ CRubyѿȤäƾͭǤޤͭǤ ѿˤϤĤμबޤΤʤǤäȤɤȤ ȻפΤrb_define_variable()Ǥ void rb_define_variable(const char *name, VALUE *var) δؿRubyCȤǶͭѿޤѿ̾ `$'ǻϤޤʤˤϼưŪɲäޤѿͤ ȼưŪRubyбѿͤѤޤ ޤRuby¦ϹǤʤѿ⤢ޤread only ѿϰʲδؿޤ void rb_define_readonly_variable(const char *name, VALUE *var) ѿ¾hookĤѿǤޤhookդ ѿϰʲδؿѤޤhookդѿ ͤλȤhookǹԤɬפޤ void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)()) δؿCδؿˤähookΤĤ줿ѿ ѿȤ줿ˤϴؿgetterѿͤåȤ ˤϴؿsetterƤФ롥hookꤷʤgetter setter0ꤷޤ # gettersetter0ʤrb_define_variable()Ʊˤʤ롥 줫顤CδؿˤäƼ¸Rubyѿ ؿޤ void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)()) δؿˤä줿RubyѿȤ줿ˤ getterѿͤåȤ줿ˤsetterƤФޤ gettersetterλͤϰʲ̤Ǥ (*getter)(ID id, void *data, struct global_entry* entry); (*setter)(VALUE val, ID id, void *data, struct global_entry* entry); 3.3 CΥǡRuby֥Ȥˤ C줿ǡ(¤)RubyΥ֥ȤȤ 갷礬ꤨޤΤ褦ʾˤϡDataȤ Ruby֥ȤCι¤(ؤΥݥ)򤯤ळȤRuby ֥ȤȤƼ갷褦ˤʤޤ Data֥Ȥƹ¤ΤRuby֥Ȥ˥ץ 뤿ˤϡʲΥޥȤޤ Data_Wrap_Struct(klass, mark, free, ptr) Υޥͤ줿Data֥ȤǤ klassϤData֥ȤΥ饹Ǥptrϥץ벽 Cι¤ΤؤΥݥ󥿤ǤmarkϤι¤ΤRubyΥ֥ ȤؤλȤ˻ȤؿǤΤ褦ʻȤޤޤʤ ˤ0ꤷޤ # Τ褦ʻȤϴޤ freeϤι¤Τ⤦פˤʤä˸ƤФؿǤ ؿ١쥯ƤФޤ줬-1ξϡñ ˳ޤ Cι¤ΤγData֥ȤƱ˹Ԥޥ ưʲΤΤ󶡤Ƥޤ Data_Make_Struct(klass, type, mark, free, sval) Υޥͤ줿Data֥ȤǤ klass, mark, freeData_Wrap_StructƱƯ򤷤ޤtype ϳƤC¤ΤηǤƤ줿¤Τѿsval ޤѿη (type*) Ǥɬפޤ Data֥Ȥݥ󥿤ФΤϰʲΥޥѤ ޤ Data_Get_Struct(obj, type, sval) Cι¤ΤؤΥݥ󥿤ѿsvalޤ DataλȤϤäʬˤΤǡ 򻲾ȤƤ 4 - dbmѥå ޤǤǤȤꤢĥ饤֥ϺϤǤ Rubyextǥ쥯ȥˤǤ˴ޤޤƤdbm饤֥ ʳŪޤ (1) ǥ쥯ȥ % mkdir ext/dbm Ruby 1.1ǤդΥǥ쥯ȥǥʥߥå饤֥ 뤳ȤǤ褦ˤʤޤRubyŪ˥󥯤 RubyŸǥ쥯ȥβextǥ쥯ȥ˳ĥ 饤֥ѤΥǥ쥯ȥɬפޤ̾Ŭ ǹޤ (2) ߷פ ޤʤǤɡɤǽ¸뤫ɤޤ פɬפޤɤʥ饹Ĥ뤫Υ饹ˤ ɤʥ᥽åɤ뤫饹󶡤ʤɤˤĤ߷ ޤ (3) Cɤ ĥ饤֥ΤȤʤCΥ񤭤ޤCΥ ҤȤĤλˤϡ֥饤֥̾.cפ֤ɤǤ礦C Υʣξˤϵդˡ֥饤֥̾.cפȤե ̾򤱤ɬפޤ֥ȥեȥ⥸塼 Ū֥饤֥̾.oפȤե Ȥͤ뤫Ǥ Rubyϳĥ饤֥ɤˡInit_饤֥̾פ ؿưŪ˼¹Ԥޤdbm饤֥ξInit_dbm Ǥδؿǥ饹⥸塼롤᥽åɡʤɤ Ԥޤdbm.cѤޤ -- Init_dbm() { /* DBM饹 */ cDBM = rb_define_class("DBM", rb_cObject); /* DBMEnumerate⥸塼򥤥󥯥롼ɤ */ rb_include_module(cDBM, rb_mEnumerable); /* DBM饹Υ饹᥽åopen(): CǼ */ rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1); /* DBM饹Υ᥽åclose(): Ϥʤ */ rb_define_method(cDBM, "close", fdbm_close, 0); /* DBM饹Υ᥽å[]: 1 */ rb_define_method(cDBM, "[]", fdbm_fetch, 1); : /* DBMǡǼ륤󥹥ѿ̾ΤID */ id_dbm = rb_intern("dbm"); } -- DBM饤֥dbmΥǡб륪֥ȤˤʤϤ 顤CdbmRuby˼ɬפޤ dbm.cǤData_Make_StructʲΤ褦˻ȤäƤޤ -- struct dbmdata { int di_size; DBM *di_dbm; }; obj = Data_Make_Struct(klass, struct dbmdata, 0, free_dbm, dbmp); -- Ǥdbmstruct¤ΤؤΥݥ󥿤Data˥ץ벽Ƥ ޤDBM*ľܥץ벽ʤΤclose()ν ƤΤȤǤ Data֥Ȥdbmstruct¤ΤΥݥ󥿤Ф ˰ʲΥޥȤäƤޤ -- #define GetDBM(obj, dbmp) {\ Data_Get_Struct(obj, struct dbmdata, dbmp);\ if (dbmp->di_dbm == 0) closed_dbm();\ } -- äʣʥޥǤפdbmdata¤ΤΥݥ μФȡcloseƤ뤫ɤΥåޤȤƤ Ǥ DBM饹ˤϤ᥽åɤޤʬह3 μޤҤȤĤϰοΤΤǡ Ƥdelete᥽åɤޤdelete᥽åɤƤ fdbm_delete()ϤΤ褦ˤʤäƤޤ -- static VALUE fdbm_delete(obj, keystr) VALUE obj, keystr; { : } -- οΥפ1self2ʹߤ᥽å ΰȤʤޤ οΤΤCǼΤRubyǼ ΤȤޤdbm饤֥ǡCǼ DBMΥ饹᥽åɤǤopen()ǤƤ fdbm_s_open()ϤʤäƤޤ -- static VALUE fdbm_s_open(argc, argv, klass) int argc; VALUE *argv; VALUE klass; { : if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) { mode = 0666; /* default value */ } : } -- Υפδؿ1Ϳ줿ο2Ϳ 줿äƤˤʤޤself3ȤͿ ޤ Ϳ줿Ϥ뤿δؿopen()ǤȤ Ƥrb_scan_args()Ǥ3˻ꤷեޥåȤ 4ѿʹߤ˻ꤷѿͤƤޤ եޥåȤϡ1ʸܤάǤʤο2ʸܤ άǤο3ʸܤб̵꤬ޤΰ 뤫ɤ򼨤"*"Ǥ2ʸܤ3ʸܤϾάǤ dbm.cǤϡեޥåȤ"11"Ǥ顤Ϻ1 ǡ2ĤޤǵȤ̣ˤʤޤάƤ ѿͤnil(CΥ٥ǤQnil)ˤʤޤ RubyǰΤindexesޤϤ Ǥ -- static VALUE fdbm_indexes(obj, args) VALUE obj, args; { : } -- 1self2RubyǤ ** ջ RubyȶͭϤʤRubyΥ֥ȤǼǽΤ CѿϰʲδؿȤäRuby󥿥ץ꥿ѿ¸ 򶵤ƤƤǤʤGCǥȥ֥򵯤ޤ void rb_global_variable(VALUE *var) (4) extconf.rbѰդ Makefileοˤʤextconf.rbȤե ޤextconf.rbϥ饤֥ΥѥɬפʾΥ ʤɤԤȤŪǤޤ require 'mkmf' extconf.rbƬ֤ޤextconf.rbǤϰʲRuby ȤȤޤ have_library(lib, func): 饤֥¸ߥå have_func(func, header): ؿ¸ߥå have_header(header): إåե¸ߥå create_makefile(target): Makefile ʲѿȤȤǤޤ $CFLAGS: ѥɲŪ˻ꤹե饰(-Oʤ) $CPPFLAGS: ץץåɲŪ˻ꤹե饰(-I-Dʤ) $LDFLAGS: 󥯻ɲŪ˻ꤹե饰(-Lʤ) $objs: 󥯤륪֥ȥե̾Υꥹ ֥ȥեΥꥹȤϡ̾ϥե򸡺 ƼưŪޤmakeǥ褦 Ū˻ꤹɬפޤ 饤֥򥳥ѥ뤹郎·鷺Υ饤֥򥳥 ѥ뤷ʤˤcreate_makefileƤФʤMakefile 줺ѥԤޤ (5) dependѰդ ⤷ǥ쥯ȥdependȤե뤬¸ߤС Makefile¸طåƤޤ % gcc -MM *.c > depend ʤɤǺ뤳Ȥޤä»̵Ǥ礦 (6) Makefile Makefileºݤ뤿ˤ ruby extconf.rb Ȥޤextconf.rb require 'mkmf' ιԤʤˤϥ顼 ˤʤޤΤǡɲä ruby -r mkmf extconf.rb ȤƤ site_ruby ǥ쥯ȥǤʤ vendor_ruby ǥ쥯ȥ˥󥹥ȡ뤹ˤ ʲΤ褦 --vendor ץäƤ ruby extconf.rb --vendor ǥ쥯ȥextʲѰդˤRubyΤmakeλ ưŪMakefileޤΤǡΥƥåפפǤ (7) make ưŪ󥯥饤֥ˤϤξmakeƤ ɬפǤ make install ǥ󥹥ȡ뤵ޤ extʲ˥ǥ쥯ȥѰդϡRubyΥǥ쥯ȥ make¹ԤMakefilemakeɬפˤäƤϤΥ 塼RubyؤΥ󥯤ޤǼưŪ˼¹ԤƤޤ extconf.rb񤭴ʤɤMakefileκɬפʻϤ Rubyǥ쥯ȥmakeƤ ĥ饤֥make installRuby饤֥Υǥ쥯ȥ ˥ԡޤ⤷ĥ饤֥ȶĴƻȤRubyǵ Ҥ줿ץबꡤRuby饤֥֤ˤϡ ĥ饤֥ѤΥǥ쥯ȥβ lib Ȥǥ쥯ȥ ꡤ ĥ .rb Υե֤ƤƱ˥ ȡ뤵ޤ (8) ǥХå ޤǥХåʤưʤǤ礦͡ext/Setup˥ǥ ȥ̾񤯤Ū˥󥯤ΤǥǥХåȤ褦ˤ ޤʬѥ뤬٤ʤޤɡ (9) Ǥ ϤäȤʤꡤʤꡤʤꡤͳˤ ȤRubyκԤϳĥ饤֥˴ؤưڤθ ĥޤ Appendix A. RubyΥɤʬ RubyΥϤĤʬह뤳ȤޤΤ 饤֥ʬϴŪ˳ĥ饤֥Ʊˤʤ ƤޤΥϺޤǤǤۤȤǤ פޤ RubyΥ class.c error.c eval.c gc.c object.c parse.y variable.c 桼ƥƥؿ dln.c regex.c st.c util.c Rubyޥɤμ dmyext.c inits.c main.c ruby.c version.c 饹饤֥ array.c bignum.c compar.c dir.c enum.c file.c hash.c io.c marshal.c math.c numeric.c pack.c prec.c process.c random.c range.c re.c signal.c sprintf.c string.c struct.c time.c Appendix B. ĥѴؿե C줫RubyεǽѤAPIϰʲ̤Ǥ롥 ** VALUE Ruby֥Ȥɽ뷿ɬפ˱ƥ㥹ȤѤ롥 Ȥ߹߷ɽCηruby.h˵ҤƤRǻϤޤ빽¤ ΤǤ롥VALUE򤳤˥㥹Ȥ뤿RǻϤޤ빽¤ ̾ʸˤ̾ΥޥѰդƤ롥 ** ѿ Qnil : nil֥ Qtrue : true֥(Υǥե) Qfalse : false֥ ** CǡΥץ벽 Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval) CǤդΥݥ󥿤򥫥ץ벽Ruby֥Ȥ֤ Υݥ󥿤Ruby饢ʤʤäfreeǻꤷ ؿƤФ롥ޤΥݥ󥿤λؤǡ¾Ruby ȤؤƤ硤mark˻ꤹؿǥޡɬ 롥 Data_Make_Struct(klass, type, mark, free, sval) typeΥmallocѿsval塤򥫥ץ 벽ǡ֤ޥ Data_Get_Struct(data, type, sval) datatypeΥݥ󥿤Фѿsvalޥ ** å TYPE(value) FIXNUM_P(value) NIL_P(value) void Check_Type(VALUE value, int type) void Check_SafeStr(VALUE value) ** Ѵ FIX2INT(value) INT2FIX(i) NUM2INT(value) INT2NUM(i) NUM2DBL(value) rb_float_new(f) StringValue(value) StringValuePtr(value) StringValueCStr(value) rb_str_new2(s) ** 饹/⥸塼 VALUE rb_define_class(const char *name, VALUE super) superΥ֥饹ȤƿRuby饹롥 VALUE rb_define_class_under(VALUE module, const char *name, VALUE super) superΥ֥饹ȤƿRuby饹module Ȥ롥 VALUE rb_define_module(const char *name) Ruby⥸塼롥 VALUE rb_define_module_under(VALUE module, const char *name) Ruby⥸塼moduleȤ롥 void rb_include_module(VALUE klass, VALUE module) ⥸塼򥤥󥯥롼ɤ롥classǤmodule򥤥 롼ɤƤˤϲ⤷ʤ(¿ť󥯥롼ɤζػ) void rb_extend_object(VALUE object, VALUE module) ֥Ȥ⥸塼(Ƥ᥽å)dzĥ롥 ** ѿ void rb_define_variable(const char *name, VALUE *var) RubyCȤǶͭ륰Хѿ롥ѿ̾`$' ϤޤʤˤϼưŪɲä롥nameȤRubyμ̻ ȤƵʤʸ(㤨` ')ޤˤRubyץ फϸʤʤ롥 void rb_define_readonly_variable(const char *name, VALUE *var) RubyCȤǶͭread onlyΥХѿ롥 read onlyǤ뤳Ȱʳrb_define_variable()Ʊ void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)()) ؿˤäƼ¸Rubyѿ롥ѿȤ줿 ˤgetterѿͤåȤ줿ˤsetterƤФ 롥 void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)()) ؿˤähookΤĤ줿Хѿ롥ѿ Ȥ줿ˤgetterؿͤåȤ줿ˤ setterƤФ롥gettersetter0ꤷˤhook ꤷʤΤƱˤʤ롥 void rb_global_variable(VALUE *var) GCΤᡤRubyץफϥʤ, Ruby Ȥޤѿޡ롥 ** void rb_define_const(VALUE klass, const char *name, VALUE val) 롥 void rb_define_global_const(const char *name, VALUE val) 롥 rb_define_const(rb_cObject, name, val) Ʊ̣ ** ᥽å rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ᥽åɤ롥argcselfοargc-1λ, ؿˤϰο(selfޤޤʤ)1, 2 ȤͿ(3self)argc-2λ, 1self, 2args(argsϰޤRuby) Ϳ롥 rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc) private᥽åɤ롥rb_define_method()Ʊ rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ðۥ᥽åɤ롥rb_define_method()Ʊ rb_scan_args(int argc, VALUE *argv, const char *fmt, ...) argc, argvͿ줿ʬ򤹤롥fmtɬܰο, ղðο, Ĥΰ뤫ꤹʸ, " *"ȤǤ롥 2 ܤο"*"Ϥ줾ά ǽǤ롥ɬܰĤʤ0ꤹ롥3 ߤѿؤΥݥ󥿤, Ǥѿ˳Ǽ롥 ղðбͿƤʤѿQnil 롥 ** Ruby᥽åɸƤӽФ VALUE rb_funcall(VALUE recv, ID mid, int narg, ...) ᥽åɸƤӽФʸ󤫤mid뤿ˤrb_intern() Ȥ VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) ᥽åɸƤӽФargc, argvϤ VALUE rb_eval_string(const char *str) ʸRubyץȤȤƥѥ롦¹Ԥ롥 ID rb_intern(const char *name) ʸбID֤ char *rb_id2name(ID id) IDбʸ֤(ǥХå) char *rb_class2name(VALUE klass) 饹֤̾(ǥХå)饹̾ʤˤ, ̤ä̾ĥ饹֤̾ int rb_respond_to(VALUE obj, ID id) objidǼ᥽åɤĤɤ֤ ** 󥹥ѿ VALUE rb_iv_get(VALUE obj, const char *name) objΥ󥹥ѿͤ롥`@'ǻϤޤʤ󥹥 ѿ Rubyץफ饢Ǥʤֱ줿ץ ѿˤʤ롥ʸ̾ĥ饹(ޤ ⥸塼)Υ󥹥ѿȤƼƤ롥 VALUE rb_iv_set(VALUE obj, const char *name, VALUE val) objΥ󥹥ѿval˥åȤ롥 ** 湽¤ VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) func2֥åȤꤷ, func1򥤥ƥ졼ȤƸƤ֡ func1ˤ arg1ȤϤ, func2ˤ1˥ƥ졼 Ϳ줿, 2arg2Ϥ롥 VALUE rb_yield(VALUE val) valͤȤƥƥ졼֥åƤӽФ VALUE rb_rescue(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) ؿfunc1arg1˸ƤӽФfunc1μ¹㳰ȯ ˤ func2arg2ȤƸƤ֡ͤ㳰ȯ ʤäfunc1, 㳰ȯˤfunc2 ͤǤ롥 VALUE rb_ensure(VALUE (*func1)(), VALUE arg1, void (*func2)(), VALUE arg2) ؿfunc1arg1ȤƼ¹Ԥ, ¹Խλ(Ȥ㳰 ȯƤ) func2arg2ȤƼ¹Ԥ롥ͤfunc1 ͤǤ(㳰ȯʤ) ** 㳰顼 void rb_warning(const char *fmt, ...) rb_verboseɸ२顼Ϥ˷ٹɽ롥 printf()Ʊ void rb_raise(rb_eRuntimeError, const char *fmt, ...) RuntimeError㳰ȯ롥printf()Ʊ void rb_raise(VALUE exception, const char *fmt, ...) exceptionǻꤷ㳰ȯ롥fmtʲΰ printf()Ʊ void rb_fatal(const char *fmt, ...) ̿Ū㳰ȯ롥̾㳰ϹԤʤ줺, 󥿡 ץ꥿λ(ensureǻꤵ줿ɤϽλ ¹Ԥ) void rb_bug(const char *fmt, ...) 󥿡ץ꥿ʤɥץΥХǤȯϤΤʤ λƤ֡󥿡ץ꥿ϥפľ˽λ롥 㳰ϰڹԤʤʤ ** Rubyν¹ Ruby򥢥ץꥱˤϰʲΥ󥿥ե Ȥ̾γĥ饤֥ˤɬפʤ void ruby_init() Ruby󥿥ץ꥿νԤʤ void ruby_options(int argc, char **argv) Ruby󥿥ץ꥿Υޥɥ饤νԤʤ void ruby_run() Ruby󥿥ץ꥿¹Ԥ롥 void ruby_script(char *name) RubyΥץ̾($0)ꤹ롥 Appendix C. extconf.rbǻȤؿ extconf.rbǤѲǽʥѥåδؿϰ ̤Ǥ롥 have_macro(macro, headers) إåեheader򥤥󥯥롼ɤƥޥmacro Ƥ뤫ɤå롥ޥƤtrue ֤ have_library(lib, func) ؿfuncƤ饤֥lib¸ߤå롥 饤֥꤬¸ߤtrue֤ find_library(lib, func, path...) ؿfuncƤ饤֥lib¸ߤ -Lpath ɲ ʤå롥饤֥꤬դätrue֤ have_func(func, header) إåեheader򥤥󥯥롼ɤƴؿfunc¸ߤ 롥funcɸǤϥ󥯤ʤ饤֥ΤΤǤ ˤhave_libraryǤΥ饤֥åƤ ؿ¸ߤtrue֤ have_var(var, header) إåեheader򥤥󥯥롼ɤѿvar¸ߤ 롥varɸǤϥ󥯤ʤ饤֥ΤΤǤ ˤhave_libraryǤΥ饤֥åƤ ѿ¸ߤtrue֤ have_header(header) إåե¸ߤå롥إåե뤬¸ߤ true֤ find_header(header, path...) إåեheader¸ߤ -Ipath ɲäʤå 롥إåե뤬դätrue֤ have_struct_member(type, member, header) إåեheader򥤥󥯥롼ɤƷtype˥member ¸ߤ뤫å롥typeƤơmember Ĥtrue֤ have_type(type, header, opt) إåեheader򥤥󥯥롼ɤƷtype¸ߤ뤫 å롥typeƤtrue֤ check_sizeof(type, header) إåեheader򥤥󥯥롼ɤƷtypecharñ̥ Ĵ٤롥typeƤΥ֤ ƤʤȤnil֤ create_makefile(target) ĥ饤֥ѤMakefile롥δؿƤФʤ ФΥ饤֥ϥѥ뤵ʤtargetϥ⥸塼̾ ɽ find_executable(command, path) ޥcommandFile::PATH_SEPARATORǶڤ줿ѥ̾ ꥹpathõpathnilޤϾά줿ϡĶ ѿPATHͤѤ롥¹ԲǽʥޥɤĤä ϥѥޤե̾Ĥʤänil֤ with_config(withval[, default=nil]) ޥɥ饤--with-ǻꤵ줿ץͤ롥 enable_config(config, *defaults) disable_config(config, *defaults) ޥɥ饤--enable-ޤ --disable-ǻꤵ줿ͤ롥 --enable-ꤵƤtrue --disable-ꤵƤfalse֤ ɤꤵƤʤϡ֥åĤǸƤӽФƤ *defaultsyield̡֥åʤʤ*defaults֤ dir_config(target[, default_dir]) dir_config(target[, default_include, default_lib]) ޥɥ饤--with--dir, --with--include, --with--libΤ줫ǻꤵǥ쥯ȥ $CFLAGS $LDFLAGS ɲä롥--with--dir=/path --with--include=/path/include --with--lib=/path/lib Ǥ롥ɲä줿 include ǥ쥯ȥ lib ǥ쥯ȥ ֤ ([include_dir, lib_dir]) pkg_config(pkg) pkg-configޥɤѥåpkgξ롥 pkg-configμºݤΥޥ̾ϡ--with-pkg-configޥ 饤󥪥ץǻǽ /* * Local variables: * fill-column: 60 * end: */