diff options
Diffstat (limited to 'assoc.c')
-rw-r--r-- | assoc.c | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/assoc.c b/assoc.c deleted file mode 100644 index f3172b3ca0..0000000000 --- a/assoc.c +++ /dev/null @@ -1,150 +0,0 @@ -/************************************************ - - assoc.c - - - $Author: matz $ - $Date: 1995/01/10 10:30:37 $ - created at: Fri Jan 6 10:10:36 JST 1995 - - Copyright (C) 1993-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); -} |