[macruby-changes] [3700] MacRuby/branches/icu
source_changes at macosforge.org
source_changes at macosforge.org
Thu Mar 4 17:51:43 PST 2010
Revision: 3700
http://trac.macosforge.org/projects/ruby/changeset/3700
Author: lsansonetti at apple.com
Date: 2010-03-04 17:51:40 -0800 (Thu, 04 Mar 2010)
Log Message:
-----------
fixed File.join
Modified Paths:
--------------
MacRuby/branches/icu/file.c
MacRuby/branches/icu/include/ruby/intern.h
MacRuby/branches/icu/string.c
Modified: MacRuby/branches/icu/file.c
===================================================================
--- MacRuby/branches/icu/file.c 2010-03-05 00:47:47 UTC (rev 3699)
+++ MacRuby/branches/icu/file.c 2010-03-05 01:51:40 UTC (rev 3700)
@@ -19,6 +19,7 @@
#include "dln.h"
#include "objc.h"
#include "vm.h"
+#include "encoding.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@ -2567,7 +2568,8 @@
rb_file_s_split(VALUE klass, SEL sel, VALUE path)
{
FilePathStringValue(path); /* get rid of converting twice */
- return rb_assoc_new(rb_file_s_dirname(Qnil, 0, path), rb_file_s_basename(0,0,1,&path));
+ return rb_assoc_new(rb_file_s_dirname(Qnil, 0, path),
+ rb_file_s_basename(0,0,1,&path));
}
static VALUE separator;
@@ -2575,46 +2577,41 @@
static VALUE
rb_file_join(VALUE ary, VALUE sep)
{
+ assert(rb_str_chars_len(sep) == 1);
+ UChar sep_char = rb_str_get_uchar(sep, 0);
VALUE res = rb_str_new(NULL, 0);
- const long count = RARRAY_LEN(ary);
- if (count > 0) {
- for (long i = 0; i < count; i++) {
- VALUE tmp = RARRAY_AT(ary, i);
- switch (TYPE(tmp)) {
- case T_STRING:
- break;
+ for (long i = 0, count = RARRAY_LEN(ary); i < count; i++) {
+ VALUE tmp = RARRAY_AT(ary, i);
+ switch (TYPE(tmp)) {
+ case T_STRING:
+ break;
- case T_ARRAY:
- tmp = rb_file_join(tmp, sep);
- break;
+ case T_ARRAY:
+ tmp = rb_file_join(tmp, sep);
+ break;
- default:
- FilePathStringValue(tmp);
- }
+ default:
+ FilePathStringValue(tmp);
+ }
- if (i > 0 && !NIL_P(sep)) {
-#if 0
-// TODO: we should probably mimic what 1.9 does here instead of this
- if (CFStringHasSuffix(res, sep_cf)) {
- if (CFStringHasPrefix(tmp_cf, sep_cf)) {
- // Remove trailing slash from res if tmp starts with a
- // slash.
- CFStringDelete(res,
- CFRangeMake(CFStringGetLength(res) - 1, 1));
- }
+ if (i > 0 && !NIL_P(sep)) {
+ const long res_len = rb_str_chars_len(res);
+ const long tmp_len = rb_str_chars_len(tmp);
+
+ if (res_len > 0
+ && rb_str_get_uchar(res, res_len - 1) == sep_char) {
+ if (tmp_len > 0 && rb_str_get_uchar(tmp, 0) == sep_char) {
+ rb_str_delete(res, res_len - 1, 1);
}
- else if (!CFStringHasPrefix(tmp_cf, sep_cf)) {
- CFStringAppend(res, sep_cf);
- }
-#endif
- rb_str_concat(res, sep);
}
-
- rb_str_concat(res, tmp);
+ else if (tmp_len == 0
+ || rb_str_get_uchar(tmp, 0) != sep_char) {
+ rb_str_concat(res, sep);
+ }
}
+ rb_str_concat(res, tmp);
}
-
return res;
}
Modified: MacRuby/branches/icu/include/ruby/intern.h
===================================================================
--- MacRuby/branches/icu/include/ruby/intern.h 2010-03-05 00:47:47 UTC (rev 3699)
+++ MacRuby/branches/icu/include/ruby/intern.h 2010-03-05 01:51:40 UTC (rev 3700)
@@ -595,6 +595,7 @@
int rb_str_casecmp(VALUE, VALUE);
VALUE rb_str_equal(VALUE str1, VALUE str2);
void rb_str_update(VALUE, long, long, VALUE);
+void rb_str_delete(VALUE str, long beg, long len);
VALUE rb_str_split(VALUE, const char*);
void rb_str_associate(VALUE, VALUE);
VALUE rb_str_associated(VALUE);
Modified: MacRuby/branches/icu/string.c
===================================================================
--- MacRuby/branches/icu/string.c 2010-03-05 00:47:47 UTC (rev 3699)
+++ MacRuby/branches/icu/string.c 2010-03-05 01:51:40 UTC (rev 3700)
@@ -5614,6 +5614,17 @@
}
}
+void
+rb_str_delete(VALUE str, long beg, long len)
+{
+ if (IS_RSTR(str)) {
+ str_delete(RSTR(str), beg, len, false);
+ }
+ else {
+ abort(); // TODO
+ }
+}
+
int
rb_str_cmp(VALUE str1, VALUE str2)
{
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100304/30467c89/attachment.html>
More information about the macruby-changes
mailing list