diff options
author | Yukihiro Matsumoto <matz@ruby-lang.org> | 1995-04-10 18:36:06 +0900 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2019-08-17 22:09:32 +0900 |
commit | b2420d8ffa4d347a75efbbdc376f4ce65c0eb172 (patch) | |
tree | bd40c44d9155d9cb10232a0e962dc1cc221c2c8b /assoc.c | |
parent | 11e21a36bc935088f88a7cd1548f8c74c3bf6099 (diff) |
version 0.73v0_73
https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.73.tar.gz
Mon Apr 10 18:36:06 1995 Yukihiro Matsumoto (matz@ix-02)
* version 0.73
Fri Apr 7 13:51:08 1995 Yukihiro Matsumoto (matz@ix-02)
* cons.c->assoc.c: consの余計な機能は外してpairとしての機能だけを
残した.enumerableをincludeするのもやめた.
* string.c(esub): 文字列置換イテレータ.perlのs///eの相当する.
Diffstat (limited to 'assoc.c')
-rw-r--r-- | assoc.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/assoc.c b/assoc.c new file mode 100644 index 0000000000..ef20c0216b --- /dev/null +++ b/assoc.c @@ -0,0 +1,150 @@ +/************************************************ + + assoc.c - + + $Author: matz $ + $Date: 1995/01/10 10:30:37 $ + created at: Fri Jan 6 10:10:36 JST 1995 + + Copyright (C) 1995 Yukihiro Matsumoto + +************************************************/ + +#include "ruby.h" + +static VALUE C_Assoc; + +static ID eq; + +VALUE rb_to_a(); + +VALUE +assoc_new(car, cdr) + VALUE car, cdr; +{ + NEWOBJ(assoc, struct RAssoc); + OBJSETUP(assoc, C_Assoc, T_ASSOC); + + assoc->car = car; + assoc->cdr = cdr; + + return (VALUE)assoc; +} + +static VALUE +Fassoc_car(assoc) + struct RAssoc *assoc; +{ + return assoc->car; +} + +static VALUE +Fassoc_cdr(assoc) + struct RAssoc *assoc; +{ + return assoc->cdr; +} + +static VALUE +Fassoc_set_car(assoc, val) + struct RAssoc *assoc; + VALUE val; +{ + return assoc->car = val; +} + +static VALUE +Fassoc_set_cdr(assoc, val) + struct RAssoc *assoc; + VALUE val; +{ + return assoc->cdr = val; +} + +static VALUE +Fassoc_equal(assoc1, assoc2) + struct RAssoc *assoc1, *assoc2; +{ + if (TYPE(assoc2) != T_ASSOC) return FALSE; + if (!rb_equal(assoc1->car, assoc2->car)) return FALSE; + return rb_equal(assoc1->cdr, assoc2->cdr); +} + +static VALUE +Fassoc_hash(assoc) + struct RAssoc *assoc; +{ + static ID hash; + int key; + + if (!hash) hash = rb_intern("hash"); + key = rb_funcall(assoc->car, hash, 0, 0); + key ^= rb_funcall(assoc->cdr, hash, 0, 0); + return INT2FIX(key); +} + +static VALUE +Fassoc_to_s(assoc) + struct RAssoc *assoc; +{ + VALUE str1, str2; + static ID to_s; + + if (!to_s) to_s = rb_intern("to_s"); + + str1 = rb_funcall(assoc->car, to_s, 0); + assoc = RASSOC(assoc->cdr); + while (assoc) { + if (TYPE(assoc) != T_ASSOC) { + str2 = rb_funcall(assoc, to_s, 0); + str_cat(str1, RSTRING(str2)->ptr, RSTRING(str2)->len); + break; + } + str2 = rb_funcall(assoc->car, to_s, 0); + str_cat(str1, RSTRING(str2)->ptr, RSTRING(str2)->len); + assoc = RASSOC(assoc->cdr); + } + + return str1; +} + +static VALUE +Fassoc_inspect(assoc) + struct RAssoc *assoc; +{ + VALUE str1, str2; + static ID inspect; + + if (!inspect) inspect = rb_intern("_inspect"); + + str1 = rb_funcall(assoc->car, inspect, 0, 0); + str2 = rb_funcall(assoc->cdr, inspect, 0, 0); + str_cat(str1, "::", 2); + str_cat(str1, RSTRING(str2)->ptr, RSTRING(str2)->len); + + return str1; +} + +extern VALUE C_Kernel; + +Init_Assoc() +{ + C_Assoc = rb_define_class("Assoc", C_Object); + + rb_undef_method(CLASS_OF(C_Assoc), "new"); + rb_undef_method(C_Assoc, "clone"); + + rb_define_method(C_Assoc, "car", Fassoc_car, 0); + rb_define_method(C_Assoc, "cdr", Fassoc_cdr, 0); + + rb_define_method(C_Assoc, "car=", Fassoc_set_car, 1); + rb_define_method(C_Assoc, "cdr=", Fassoc_set_cdr, 1); + + rb_define_method(C_Assoc, "==", Fassoc_equal, 1); + rb_define_method(C_Assoc, "hash", Fassoc_hash, 0); + + rb_define_method(C_Assoc, "to_s", Fassoc_to_s, 0); + rb_define_method(C_Assoc, "_inspect", Fassoc_inspect, 0); + + rb_define_method(C_Kernel, "::", assoc_new, 1); +} |