From b2420d8ffa4d347a75efbbdc376f4ce65c0eb172 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 10 Apr 1995 18:36:06 +0900 Subject: version 0.73 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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の相当する. --- assoc.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 assoc.c (limited to 'assoc.c') 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); +} -- cgit v1.2.3