From 853387668205b88d98b244fa3cc27fad041e4e2e Mon Sep 17 00:00:00 2001 From: "Sunrim KIM (keen)" <3han5chou7@gmail.com> Date: Tue, 27 May 2014 21:35:19 +0900 Subject: [PATCH 1/4] vectors, blobs, strings with equal contets are equal --- src/bool.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/bool.c b/src/bool.c index fa56fa31..ef497362 100644 --- a/src/bool.c +++ b/src/bool.c @@ -6,6 +6,9 @@ #include "picrin.h" #include "picrin/pair.h" +#include "picrin/vector.h" +#include "picrin/blob.h" +#include "picrin/string.h" bool pic_equal_p(pic_state *pic, pic_value x, pic_value y) @@ -22,6 +25,27 @@ pic_equal_p(pic_state *pic, pic_value x, pic_value y) case PIC_TT_PAIR: return pic_equal_p(pic, pic_car(pic, x), pic_car(pic, y)) && pic_equal_p(pic, pic_cdr(pic, x), pic_cdr(pic, y)); + case PIC_TT_BLOB: { + int i; + struct pic_blob *v1 = pic_blob_ptr(x), *v2 = pic_blob_ptr(y); + for(i = 0; i < v1->len; ++i){ + if(v1->data[i] != v2->data[i]) + return false; + } + return true; + } + case PIC_TT_VECTOR:{ + size_t i; + struct pic_vector *v1 = pic_vec_ptr(x), *v2 = pic_vec_ptr(y); + + for(i = 0; i < v1->len; ++i){ + if(! pic_equal_p(pic, v1->data[i], v2->data[i])) + return false; + } + return true; + } + case PIC_TT_STRING: + return pic_strcmp(pic_str_ptr(x), pic_str_ptr(y)) == 0; default: return false; } From 49a4808a2262926b866207094000763d89758742 Mon Sep 17 00:00:00 2001 From: "Sunrim KIM (keen)" <3han5chou7@gmail.com> Date: Wed, 28 May 2014 02:55:19 +0900 Subject: [PATCH 2/4] check length before compare contents --- src/bool.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/bool.c b/src/bool.c index ef497362..904a21d6 100644 --- a/src/bool.c +++ b/src/bool.c @@ -28,6 +28,9 @@ pic_equal_p(pic_state *pic, pic_value x, pic_value y) case PIC_TT_BLOB: { int i; struct pic_blob *v1 = pic_blob_ptr(x), *v2 = pic_blob_ptr(y); + if(v1->len != v2->len){ + return false; + } for(i = 0; i < v1->len; ++i){ if(v1->data[i] != v2->data[i]) return false; @@ -38,6 +41,9 @@ pic_equal_p(pic_state *pic, pic_value x, pic_value y) size_t i; struct pic_vector *v1 = pic_vec_ptr(x), *v2 = pic_vec_ptr(y); + if(v1->len != v2->len){ + return false; + } for(i = 0; i < v1->len; ++i){ if(! pic_equal_p(pic, v1->data[i], v2->data[i])) return false; From 2fb97d16edb606dcb2d0f17bc3133e78aee6eea4 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 28 Jun 2014 19:23:06 +0900 Subject: [PATCH 3/4] style fix --- src/bool.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/bool.c b/src/bool.c index 904a21d6..07ddcffc 100644 --- a/src/bool.c +++ b/src/bool.c @@ -23,29 +23,29 @@ pic_equal_p(pic_state *pic, pic_value x, pic_value y) return false; switch (type) { case PIC_TT_PAIR: - return pic_equal_p(pic, pic_car(pic, x), pic_car(pic, y)) - && pic_equal_p(pic, pic_cdr(pic, x), pic_cdr(pic, y)); + return pic_equal_p(pic, pic_car(pic, x), pic_car(pic, y)) && pic_equal_p(pic, pic_cdr(pic, x), pic_cdr(pic, y)); case PIC_TT_BLOB: { int i; - struct pic_blob *v1 = pic_blob_ptr(x), *v2 = pic_blob_ptr(y); - if(v1->len != v2->len){ + struct pic_blob *u = pic_blob_ptr(x), *v = pic_blob_ptr(y); + + if(u->len != v->len){ return false; } - for(i = 0; i < v1->len; ++i){ - if(v1->data[i] != v2->data[i]) + for(i = 0; i < u->len; ++i){ + if(u->data[i] != v->data[i]) return false; } return true; } - case PIC_TT_VECTOR:{ + case PIC_TT_VECTOR: { size_t i; - struct pic_vector *v1 = pic_vec_ptr(x), *v2 = pic_vec_ptr(y); - - if(v1->len != v2->len){ + struct pic_vector *u = pic_vec_ptr(x), *v = pic_vec_ptr(y); + + if(u->len != v->len){ return false; } - for(i = 0; i < v1->len; ++i){ - if(! pic_equal_p(pic, v1->data[i], v2->data[i])) + for(i = 0; i < u->len; ++i){ + if(! pic_equal_p(pic, u->data[i], v->data[i])) return false; } return true; From 5ba0402221f053c8ccd1dca2338ab0995d22d593 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 28 Jun 2014 19:23:24 +0900 Subject: [PATCH 4/4] fix type warning (int and size_t) --- src/bool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bool.c b/src/bool.c index 07ddcffc..bb4fae82 100644 --- a/src/bool.c +++ b/src/bool.c @@ -25,7 +25,7 @@ pic_equal_p(pic_state *pic, pic_value x, pic_value y) case PIC_TT_PAIR: return pic_equal_p(pic, pic_car(pic, x), pic_car(pic, y)) && pic_equal_p(pic, pic_cdr(pic, x), pic_cdr(pic, y)); case PIC_TT_BLOB: { - int i; + size_t i; struct pic_blob *u = pic_blob_ptr(x), *v = pic_blob_ptr(y); if(u->len != v->len){