summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-struct/src/struct.c
diff options
context:
space:
mode:
authorYukihiro Matz Matsumoto <[email protected]>2013-03-19 11:58:31 +0900
committerYukihiro Matz Matsumoto <[email protected]>2013-03-19 11:58:31 +0900
commitdc2e1c1ce8ae6da16532337b85ea1064db8d0624 (patch)
treefc389b0c1bc23dea76e92c5747a8905a31966844 /mrbgems/mruby-struct/src/struct.c
parent5217d889633fc556458b2327c30ba483e02ce6d7 (diff)
parent6ab9c389c43bdad2311b384852a1f448e56a527c (diff)
downloadmruby-dc2e1c1ce8ae6da16532337b85ea1064db8d0624.tar.gz
mruby-dc2e1c1ce8ae6da16532337b85ea1064db8d0624.zip
Merge branch 'pr-add-new-api-mrb_true_or_false_value' of https://github.com/monaka/mruby into monaka-pr-add-new-api-mrb_true_or_false_value
Diffstat (limited to 'mrbgems/mruby-struct/src/struct.c')
-rw-r--r--mrbgems/mruby-struct/src/struct.c67
1 files changed, 46 insertions, 21 deletions
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index b1ee9579f..f8f170cf6 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -691,21 +691,34 @@ mrb_struct_equal(mrb_state *mrb, mrb_value s)
mrb_value s2;
mrb_value *ptr, *ptr2;
mrb_int i, len;
+ mrb_bool equal_p;
mrb_get_args(mrb, "o", &s2);
- if (mrb_obj_equal(mrb, s, s2)) return mrb_true_value();
- if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct")) return mrb_false_value();
- if (mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) return mrb_false_value();
- if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
+ if (mrb_obj_equal(mrb, s, s2)) {
+ equal_p = 1;
+ }
+ else if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct") ||
+ mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
+ equal_p = 0;
+ }
+ else if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
mrb_bug("inconsistent struct"); /* should never happen */
+ equal_p = 0; /* This substuture is just to suppress warnings. never called. */
}
- ptr = RSTRUCT_PTR(s);
- ptr2 = RSTRUCT_PTR(s2);
- len = RSTRUCT_LEN(s);
- for (i=0; i<len; i++) {
- if (!mrb_equal(mrb, ptr[i], ptr2[i])) return mrb_false_value();
+ else {
+ ptr = RSTRUCT_PTR(s);
+ ptr2 = RSTRUCT_PTR(s2);
+ len = RSTRUCT_LEN(s);
+ equal_p = 1;
+ for (i=0; i<len; i++) {
+ if (!mrb_equal(mrb, ptr[i], ptr2[i])) {
+ equal_p = 0;
+ break;
+ }
+ }
}
- return mrb_true_value();
+
+ return mrb_true_or_false_value(equal_p);
}
/* 15.2.18.4.12(x) */
@@ -722,22 +735,34 @@ mrb_struct_eql(mrb_state *mrb, mrb_value s)
mrb_value s2;
mrb_value *ptr, *ptr2;
mrb_int i, len;
+ mrb_bool eql_p;
mrb_get_args(mrb, "o", &s2);
- if (mrb_obj_equal(mrb, s, s2)) return mrb_true_value();
- if (strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s2)), "Struct")) return mrb_false_value();
- if (mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) return mrb_false_value();
- if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
+ if (mrb_obj_equal(mrb, s, s2)) {
+ eql_p = 1;
+ }
+ else if (strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s2)), "Struct") ||
+ mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
+ eql_p = 0;
+ }
+ else if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
mrb_bug("inconsistent struct"); /* should never happen */
+ eql_p = 0; /* This substuture is just to suppress warnings. never called. */
}
-
- ptr = RSTRUCT_PTR(s);
- ptr2 = RSTRUCT_PTR(s2);
- len = RSTRUCT_LEN(s);
- for (i=0; i<len; i++) {
- if (!mrb_eql(mrb, ptr[i], ptr2[i])) return mrb_false_value();
+ else {
+ ptr = RSTRUCT_PTR(s);
+ ptr2 = RSTRUCT_PTR(s2);
+ len = RSTRUCT_LEN(s);
+ eql_p = 1;
+ for (i=0; i<len; i++) {
+ if (!mrb_eql(mrb, ptr[i], ptr2[i])) {
+ eql_p = 0;
+ break;
+ }
+ }
}
- return mrb_true_value();
+
+ return mrb_true_or_false_value(eql_p);
}
/*