[macruby-changes] [3667] MacRuby/branches/icu/string.c
source_changes at macosforge.org
source_changes at macosforge.org
Tue Mar 2 15:45:00 PST 2010
Revision: 3667
http://trac.macosforge.org/projects/ruby/changeset/3667
Author: lsansonetti at apple.com
Date: 2010-03-02 15:44:58 -0800 (Tue, 02 Mar 2010)
Log Message:
-----------
added upcase, swapcase, downcase methods
Modified Paths:
--------------
MacRuby/branches/icu/string.c
Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c 2010-03-02 21:23:07 UTC (rev 3666)
+++ MacRuby/branches/icu/string.c 2010-03-02 23:44:58 UTC (rev 3667)
@@ -2946,33 +2946,42 @@
* Note: case replacement is effective only in ASCII region.
*/
+#define CHAR_ITERATE(str, code) \
+ if (str_try_making_data_uchars(RSTR(str))) { \
+ for (long i = 0, count = BYTES_TO_UCHARS(RSTR(str)->length_in_bytes); \
+ i < count; i++) { \
+ UChar __tmp, c; \
+ __tmp = c = RSTR(str)->data.uchars[i]; \
+ code; \
+ if (__tmp != c) { \
+ RSTR(str)->data.uchars[i] = c; \
+ } \
+ } \
+ } \
+ else { \
+ for (long i = 0, count = RSTR(str)->length_in_bytes; \
+ i < count; i++) { \
+ char __tmp, c; \
+ __tmp = c = RSTR(str)->data.bytes[i]; \
+ code; \
+ if (__tmp != c) { \
+ RSTR(str)->data.bytes[i] = c; \
+ } \
+ } \
+ }
+
static VALUE
rstr_downcase_bang(VALUE str, SEL sel)
{
rstr_modify(str);
bool changed = false;
+ CHAR_ITERATE(str,
+ if (c >= 'A' && c <= 'Z') {
+ c = 'a' + (c - 'A');
+ changed = true;
+ });
- if (str_is_stored_in_uchars(RSTR(str))) {
- for (long i = 0, count = BYTES_TO_UCHARS(RSTR(str)->length_in_bytes);
- i < count; i++) {
- UChar c = RSTR(str)->data.uchars[i];
- if (c >= 'A' && c <= 'Z') {
- RSTR(str)->data.uchars[i] = 'a' + (c - 'A');
- changed = true;
- }
- }
- }
- else {
- for (long i = 0, count = RSTR(str)->length_in_bytes; i < count; i++) {
- char c = RSTR(str)->data.bytes[i];
- if (c >= 'A' && c <= 'Z') {
- RSTR(str)->data.bytes[i] = 'a' + (c - 'A');
- changed = true;
- }
- }
- }
-
return changed ? str : Qnil;
}
@@ -2998,6 +3007,154 @@
/*
* call-seq:
+ * str.upcase! => str or nil
+ *
+ * Upcases the contents of <i>str</i>, returning <code>nil</code> if no changes
+ * were made.
+ * Note: case replacement is effective only in ASCII region.
+ */
+
+static VALUE
+rstr_upcase_bang(VALUE str, SEL sel)
+{
+ rstr_modify(str);
+
+ bool changed = false;
+ CHAR_ITERATE(str,
+ if (c >= 'a' && c <= 'z') {
+ c = 'A' + (c - 'a');
+ changed = true;
+ });
+
+ return changed ? str : Qnil;
+}
+
+/*
+ * call-seq:
+ * str.upcase => new_str
+ *
+ * Returns a copy of <i>str</i> with all lowercase letters replaced with their
+ * uppercase counterparts. The operation is locale insensitive---only
+ * characters ``a'' to ``z'' are affected.
+ * Note: case replacement is effective only in ASCII region.
+ *
+ * "hEllO".upcase #=> "HELLO"
+ */
+
+static VALUE
+rstr_upcase(VALUE str, SEL sel)
+{
+ str = rb_str_new3(str);
+ rstr_upcase_bang(str, 0);
+ return str;
+}
+
+/*
+ * call-seq:
+ * str.swapcase! => str or nil
+ *
+ * Equivalent to <code>String#swapcase</code>, but modifies the receiver in
+ * place, returning <i>str</i>, or <code>nil</code> if no changes were made.
+ * Note: case conversion is effective only in ASCII region.
+ */
+
+static VALUE
+rstr_swapcase_bang(VALUE str, SEL sel)
+{
+ rstr_modify(str);
+
+ bool changed = false;
+ CHAR_ITERATE(str,
+ if (c >= 'A' && c <= 'Z') {
+ c = 'a' + (c - 'A');
+ changed = true;
+ }
+ else if (c >= 'a' && c <= 'z') {
+ c = 'A' + (c - 'a');
+ changed = true;
+ });
+
+ return changed ? str : Qnil;
+}
+
+/*
+ * call-seq:
+ * str.swapcase => new_str
+ *
+ * Returns a copy of <i>str</i> with uppercase alphabetic characters converted
+ * to lowercase and lowercase characters converted to uppercase.
+ * Note: case conversion is effective only in ASCII region.
+ *
+ * "Hello".swapcase #=> "hELLO"
+ * "cYbEr_PuNk11".swapcase #=> "CyBeR_pUnK11"
+ */
+
+static VALUE
+rstr_swapcase(VALUE str, SEL sel)
+{
+ str = rb_str_new3(str);
+ rstr_swapcase_bang(str, 0);
+ return str;
+}
+
+/*
+ * call-seq:
+ * str.capitalize! => str or nil
+ *
+ * Modifies <i>str</i> by converting the first character to uppercase and the
+ * remainder to lowercase. Returns <code>nil</code> if no changes are made.
+ * Note: case conversion is effective only in ASCII region.
+ *
+ * a = "hello"
+ * a.capitalize! #=> "Hello"
+ * a #=> "Hello"
+ * a.capitalize! #=> nil
+ */
+
+static VALUE
+rstr_capitalize_bang(VALUE str, SEL sel)
+{
+ rstr_modify(str);
+
+ bool changed = false;
+ CHAR_ITERATE(str,
+ if (i == 0) {
+ if (c >= 'a' && c <= 'z') {
+ c = 'A' + (c - 'a');
+ changed = true;
+ }
+ }
+ else if (c >= 'A' && c <= 'Z') {
+ c = 'a' + (c - 'A');
+ changed = true;
+ });
+
+ return changed ? str : Qnil;
+}
+
+/*
+ * call-seq:
+ * str.capitalize => new_str
+ *
+ * Returns a copy of <i>str</i> with the first character converted to uppercase
+ * and the remainder to lowercase.
+ * Note: case conversion is effective only in ASCII region.
+ *
+ * "hello".capitalize #=> "Hello"
+ * "HELLO".capitalize #=> "Hello"
+ * "123ABC".capitalize #=> "123abc"
+ */
+
+static VALUE
+rstr_capitalize(VALUE str, SEL sel)
+{
+ str = rb_str_new3(str);
+ rstr_capitalize_bang(str, 0);
+ return str;
+}
+
+/*
+ * call-seq:
* str.ljust(integer, padstr=' ') => new_str
*
* If <i>integer</i> is greater than the length of <i>str</i>, returns a new
@@ -3555,6 +3712,13 @@
rb_objc_define_method(rb_cRubyString, "gsub!", rstr_gsub_bang, -1);
rb_objc_define_method(rb_cRubyString, "downcase", rstr_downcase, 0);
rb_objc_define_method(rb_cRubyString, "downcase!", rstr_downcase_bang, 0);
+ rb_objc_define_method(rb_cRubyString, "upcase", rstr_upcase, 0);
+ rb_objc_define_method(rb_cRubyString, "upcase!", rstr_upcase_bang, 0);
+ rb_objc_define_method(rb_cRubyString, "swapcase", rstr_swapcase, 0);
+ rb_objc_define_method(rb_cRubyString, "swapcase!", rstr_swapcase_bang, 0);
+ rb_objc_define_method(rb_cRubyString, "capitalize", rstr_capitalize, 0);
+ rb_objc_define_method(rb_cRubyString, "capitalize!",
+ rstr_capitalize_bang, 0);
rb_objc_define_method(rb_cRubyString, "ljust", rstr_ljust, -1);
rb_objc_define_method(rb_cRubyString, "rjust", rstr_rjust, -1);
rb_objc_define_method(rb_cRubyString, "center", rstr_center, -1);
@@ -3773,6 +3937,9 @@
{
rb_str_t *str = str_alloc(rb_obj_class(source));
str_replace(str, source);
+ if (OBJ_TAINTED(source)) {
+ OBJ_TAINT(str);
+ }
return (VALUE)str;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100302/e8112d23/attachment.html>
More information about the macruby-changes
mailing list