[macruby-changes] [3666] MacRuby/branches/icu

source_changes at macosforge.org source_changes at macosforge.org
Tue Mar 2 13:23:07 PST 2010


Revision: 3666
          http://trac.macosforge.org/projects/ruby/changeset/3666
Author:   lsansonetti at apple.com
Date:     2010-03-02 13:23:07 -0800 (Tue, 02 Mar 2010)
Log Message:
-----------
added Symbol#<=>, fixed some bugs in String#<=>

Modified Paths:
--------------
    MacRuby/branches/icu/string.c
    MacRuby/branches/icu/symbol.c

Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c	2010-03-02 20:38:40 UTC (rev 3665)
+++ MacRuby/branches/icu/string.c	2010-03-02 21:23:07 UTC (rev 3666)
@@ -843,53 +843,39 @@
 	return 0;
     }
 
-    if (self->length_in_bytes == 0) {
-	if (str->length_in_bytes == 0) {
-	    // both strings are empty
-	    return 0;
-	}
-	else {
-	    // only self is empty
-	    goto bad_length;
-	}
+    if (self->length_in_bytes == 0 && str->length_in_bytes == 0) {
+	// both strings are empty
+	return 0;
     }
-    else if (str->length_in_bytes == 0) {
-	// only str is empty
-	goto bad_length;
+
+    if (str_compatible_encoding(self, str) == NULL) {
+	// incompatible encodings
+	return -1;
     }
 
-    if (str_compatible_encoding(self, str) != NULL) {
-	if (str_is_stored_in_uchars(self) == str_is_stored_in_uchars(str)) {
-	    if (self->length_in_bytes != str->length_in_bytes) {
-		goto bad_length;
-	    }
-	    else {
-		return memcmp(self->data.bytes, str->data.bytes,
-			self->length_in_bytes);
-	    }
+    if (str_is_stored_in_uchars(self) != str_is_stored_in_uchars(str)) {
+	// one is in uchars and the other is in binary
+	if (!str_try_making_data_uchars(self)
+		|| !str_try_making_data_uchars(str)) {
+	    // one is in uchars but the other one can't be converted in
+	    // uchars
+	    return -1;
 	}
-	else { // one is in uchars and the other is in binary
-	    if (!str_try_making_data_uchars(self)
-		    || !str_try_making_data_uchars(str)) {
-		// one is in uchars but the other one can't be converted in
-		// uchars
-		return -1;
-	    }
-	    if (self->length_in_bytes != str->length_in_bytes) {
-		goto bad_length;
-	    }
-	    else {
-		return memcmp(self->data.bytes, str->data.bytes,
-			self->length_in_bytes);
-	    }
-	}
     }
-    else { // incompatible encodings
-	return -1;
-    }
 
-bad_length:
-    return self->length_in_bytes > str->length_in_bytes ? 1 : -1;
+    const long min_len = self->length_in_bytes < str->length_in_bytes
+	? self->length_in_bytes : str->length_in_bytes;
+
+    const int res = memcmp(self->data.bytes, str->data.bytes, min_len);
+
+    if (res == 0) {
+	if (self->length_in_bytes == str->length_in_bytes) {
+	    return 0;
+	}
+	return self->length_in_bytes > str->length_in_bytes
+	    ? 1 : -1;
+    }
+    return res > 1 ? 1 : -1;
 }
 
 static long
@@ -1931,7 +1917,6 @@
  * Two strings are equal if they have the same length and content.
  */
 
-
 static VALUE
 rstr_eql(VALUE self, SEL sel, VALUE other)
 {
@@ -4216,3 +4201,9 @@
 	abort(); // TODO
     }
 }
+
+int
+rb_str_cmp(VALUE str1, VALUE str2)
+{
+    return str_compare(str_need_string(str1), str_need_string(str2));
+}

Modified: MacRuby/branches/icu/symbol.c
===================================================================
--- MacRuby/branches/icu/symbol.c	2010-03-02 20:38:40 UTC (rev 3665)
+++ MacRuby/branches/icu/symbol.c	2010-03-02 21:23:07 UTC (rev 3666)
@@ -234,6 +234,23 @@
 }
 
 /*
+ * call-seq:
+ *
+ *   str <=> other       => -1, 0, +1 or nil
+ *
+ * Compares _sym_ with _other_ in string form.
+ */
+
+static VALUE
+rsym_cmp(VALUE sym, SEL sel, VALUE other)
+{
+    if (TYPE(other) != T_SYMBOL) {
+	return Qnil;
+    }
+    return INT2FIX(rb_str_cmp(RSYM(sym)->str, RSYM(other)->str));
+}
+
+/*
  *  call-seq:
  *     sym == obj   => true or false
  *  
@@ -370,6 +387,7 @@
 	    rsym_all_symbols, 0);
 
     rb_objc_define_method(rb_cSymbol, "==", rsym_equal, 1);
+    rb_objc_define_method(rb_cSymbol, "<=>", rsym_cmp, 1);
     rb_objc_define_method(rb_cSymbol, "eql?", rsym_equal, 1);
     //rb_objc_define_method(rb_cSymbol, "<=>", rsym_cmp, 1);
     rb_objc_define_method(rb_cSymbol, "inspect", rsym_inspect, 0);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100302/5d09d22a/attachment-0001.html>


More information about the macruby-changes mailing list