Hi,

These patches adds Downcase, upcase and titlecase but only
works for [A-Za-z] so maybe they should not be added.

/Stefan

Index: ops/string.ops
===================================================================
RCS file: /cvs/public/parrot/ops/string.ops,v
retrieving revision 1.22
diff -u -r1.22 string.ops
--- ops/string.ops      22 Apr 2004 09:17:38 -0000      1.22
+++ ops/string.ops      29 Apr 2004 05:36:53 -0000
@@ -502,11 +502,32 @@
 =cut
 
 inline op upcase(out STR, in STR) :base_core {
-  goto NEXT();
+    STRING *res;
+    STRING *str = $2;
+    int str_len = string_length(interpreter, str);
+    int i;
+    char *s;
+
+    res = string_copy(interpreter, str);
+    s = res->strstart;
+    for (i = 0; i < str_len; i++) {
+        if (s[i] >= 97 && s[i] <= 122)
+            s[i] -= 32;
+    }
+    $1 = res;
+    goto NEXT();
 }
 
 inline op upcase(inout STR) :base_core {
-  goto NEXT();
+    STRING *str = $1;
+    int str_len = string_length(interpreter, str);
+    int i;
+    char * s = str->strstart;
+    for (i = 0; i < str_len; i++) {
+        if (s[i] >= 97 && s[i] <= 122)
+            s[i] -= 32;
+    }
+    goto NEXT();
 }
 
 =item B<downcase>(out STR, in STR)
@@ -520,10 +541,32 @@
 =cut
 
 inline op downcase(out STR, in STR) :base_core {
-  goto NEXT();
+    STRING *res;
+    STRING *str = $2;
+    int str_len = string_length(interpreter, str);
+    int i;
+    char *s;
+
+    res = string_copy(interpreter, str);
+    s = res->strstart;
+    for (i = 0; i < str_len; i++) {
+        if (s[i] >= 65 && s[i] <= 90)
+            s[i] += 32;
+    }
+    $1 = res;
+    goto NEXT();
 }
 
 inline op downcase(inout STR) :base_core {
+    STRING *str = $1;
+    int str_len = string_length(interpreter, str);
+    int i;
+    char * s = str->strstart;
+
+    for (i = 0; i < str_len; i++) {
+        if (s[i] >= 65 && s[i] <= 90)
+            s[i] += 32;
+    }
   goto NEXT();
 }
 
@@ -538,13 +581,58 @@
 =cut
 
 inline op titlecase(out STR, in STR) :base_core {
-  $1 = string_titlecase(interpreter, $2);
-  goto NEXT();
+    STRING *res;
+    STRING *str = $2;
+    int str_len = string_length(interpreter, str);
+    int i, word_char = 0;
+    char *s;
+
+    res = string_copy(interpreter, str);
+    s = res->strstart;
+
+    for (i = 0; i < str_len; i++) {
+        if (word_char && s[i] >= 65 && s[i] <= 90) {
+            s[i] += 32;
+            word_char = 1;
+        }
+        else if (!word_char && s[i] >= 97 && s[i] <= 122) {
+            s[i] -= 32;
+            word_char = 1;
+        }
+        else if (s[i] > 122 || s[i] < 65 || (s[i] > 90 && s[i] < 97)) {
+            word_char = 0;
+        }
+        else {
+            word_char = 1;
+        }
+    }
+    $1 = res;
+    goto NEXT();
 }
 
 inline op titlecase(inout STR) :base_core {
-  string_titlecase_inplace(interpreter, $1);
-  goto NEXT();
+    STRING *str = $1;
+    int str_len = string_length(interpreter, str);
+    int i, word_char = 0;
+    char * s = str->strstart;
+
+    for (i = 0; i < str_len; i++) {
+        if (word_char && s[i] >= 65 && s[i] <= 90) {
+            s[i] += 32;
+            word_char = 1;
+        }
+        else if (!word_char && s[i] >= 97 && s[i] <= 122) {
+            s[i] -= 32;
+            word_char = 1;
+        }
+        else if (s[i] > 122 || s[i] < 65 || (s[i] > 90 && s[i] < 97)) {
+            word_char = 0;
+        }
+        else {
+            word_char = 1;
+        }
+    }
+    goto NEXT();
 }
 
 ###############################################################################


Index: t/op/string.t
===================================================================
RCS file: /cvs/public/parrot/t/op/string.t,v
retrieving revision 1.74
diff -u -r1.74 string.t
--- t/op/string.t       16 Apr 2004 12:48:32 -0000      1.74
+++ t/op/string.t       29 Apr 2004 05:36:53 -0000
@@ -16,7 +16,7 @@
 
 =cut
 
-use Parrot::Test tests => 132;
+use Parrot::Test tests => 133;
 use Test::More;
 
 output_is( <<'CODE', <<OUTPUT, "set_s_s|sc" );
@@ -2461,6 +2461,36 @@
 CODE
 ok 1
 ok 2
+OUTPUT
+
+output_is( <<'CODE', <<OUTPUT, "Case mangling");
+        set S1, "STR_TEST"
+        downcase S0, S1
+        print S0
+        print "\n"
+        upcase S2, S0
+        print S2
+        print "\n"
+        titlecase S3, S0
+        print S3
+        print "\n"
+        upcase S3
+        print S3
+        print "\n"
+        downcase S3
+        print S3
+        print "\n"
+        titlecase S3
+        print S3
+        print "\n"
+        end
+CODE
+str_test
+STR_TEST
+Str_Test
+STR_TEST
+str_test
+Str_Test
 OUTPUT
 
 1;

Reply via email to