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;