[macruby-changes] [948] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Mon Mar 16 21:58:28 PDT 2009


Revision: 948
          http://trac.macosforge.org/projects/ruby/changeset/948
Author:   lsansonetti at apple.com
Date:     2009-03-16 21:58:27 -0700 (Mon, 16 Mar 2009)
Log Message:
-----------
rewrote rb_file_expand_path() in objc

Modified Paths:
--------------
    MacRuby/branches/experimental/file.c
    MacRuby/branches/experimental/objc.m

Modified: MacRuby/branches/experimental/file.c
===================================================================
--- MacRuby/branches/experimental/file.c	2009-03-17 04:58:06 UTC (rev 947)
+++ MacRuby/branches/experimental/file.c	2009-03-17 04:58:27 UTC (rev 948)
@@ -16,6 +16,7 @@
 #include "ruby/signal.h"
 #include "ruby/util.h"
 #include "dln.h"
+#include "objc.h"
 
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
@@ -2367,16 +2368,6 @@
     return (char *)path;
 }
 
-#define nextdirsep rb_path_next
-static char *
-rb_path_next(const char *s)
-{
-    while (*s && !isdirsep(*s)) {
-	s = CharNext(s);
-    }
-    return (char *)s;
-}
-
 #define skipprefix(path) (path)
 
 #define strrdirsep rb_path_last_separator
@@ -2421,187 +2412,8 @@
     return chompdirsep(path);
 }
 
-#define BUFCHECK(cond) do {\
-    long bdiff = p - buf;\
-    if (cond) {\
-	do {buflen *= 2;} while (cond);\
-	rb_bytestring_resize(result, buflen);\
-	buf = (char *)rb_bytestring_byte_pointer(result);\
-	p = buf + bdiff;\
-	pend = buf + buflen;\
-    }\
-} while (0)
-
-#define BUFINIT() (\
-    p = buf = (char *)rb_bytestring_byte_pointer(result),\
-    buflen = rb_bytestring_length(result),\
-    pend = p + buflen)
-
-#define SET_EXTERNAL_ENCODING()
-
 static int is_absolute_path(const char*);
 
-static VALUE
-file_expand_path(VALUE fname, VALUE dname, VALUE result)
-{
-    const char *s, *b;
-    char *buf, *p, *pend, *root;
-    long buflen, dirlen;
-    int tainted;
-
-    FilePathValue(fname);
-    s = StringValuePtr(fname);
-    BUFINIT();
-    tainted = OBJ_TAINTED(fname);
-
-    if (s[0] == '~') {
-	if (isdirsep(s[1]) || s[1] == '\0') {
-	    char *dir = getenv("HOME");
-
-	    if (!dir) {
-		rb_raise(rb_eArgError, "couldn't find HOME environment -- expanding `%s'", s);
-	    }
-	    dirlen = strlen(dir);
-	    BUFCHECK(dirlen > buflen);
-	    strcpy(buf, dir);
-	    p = buf + strlen(dir);
-	    s++;
-	    tainted = 1;
-	    SET_EXTERNAL_ENCODING();
-	}
-	else {
-#ifdef HAVE_PWD_H
-	    struct passwd *pwPtr;
-	    s++;
-#endif
-	    s = nextdirsep(b = s);
-	    BUFCHECK(bdiff + (s-b) >= buflen);
-	    memcpy(p, b, s-b);
-	    p += s-b;
-	    *p = '\0';
-#ifdef HAVE_PWD_H
-	    pwPtr = getpwnam(buf);
-	    if (!pwPtr) {
-		endpwent();
-		rb_raise(rb_eArgError, "user %s doesn't exist", buf);
-	    }
-	    dirlen = strlen(pwPtr->pw_dir);
-	    BUFCHECK(dirlen > buflen);
-	    strcpy(buf, pwPtr->pw_dir);
-	    p = buf + strlen(pwPtr->pw_dir);
-	    endpwent();
-#endif
-	}
-    }
-    else if (!is_absolute_path(s)) {
-	if (!NIL_P(dname)) {
-	    long n;
-	    file_expand_path(dname, Qnil, result);
-	    BUFINIT();
-	    n = RSTRING_LEN(result);
-	    BUFCHECK(n + 2 > buflen);
-	}
-	else {
-	    char *dir = my_getcwd();
-
-	    tainted = 1;
-	    dirlen = strlen(dir);
-	    BUFCHECK(dirlen > buflen);
-	    strcpy(buf, dir);
-	    xfree(dir);
-	    SET_EXTERNAL_ENCODING();
-	}
-	p = chompdirsep(skiproot(buf));
-    }
-    else {
-	b = s;
-	do s++; while (isdirsep(*s));
-	p = buf + (s - b);
-	BUFCHECK(bdiff >= buflen);
-	memset(buf, '/', p - buf);
-    }
-    if (p > buf && p[-1] == '/')
-	--p;
-    else {
-	++buflen;
-	BUFCHECK(bdiff >= buflen);
-	*p = '/';
-    }
-
-    p[1] = 0;
-    root = skipprefix(buf);
-
-    b = s;
-    while (*s) {
-	switch (*s) {
-	  case '.':
-	    if (b == s++) {	/* beginning of path element */
-		switch (*s) {
-		  case '\0':
-		    b = s;
-		    break;
-		  case '.':
-		    if (*(s+1) == '\0' || isdirsep(*(s+1))) {
-			/* We must go back to the parent */
-			char *n;
-			*p = '\0';
-			if (!(n = strrdirsep(root))) {
-			    *p = '/';
-			}
-			else {
-			    p = n;
-			}
-			b = ++s;
-		    }
-		    break;
-		  case '/':
-		    b = ++s;
-		    break;
-		  default:
-		    /* ordinary path element, beginning don't move */
-		    break;
-		}
-	    }
-	    break;
-	  case '/':
-	    if (s > b) {
-		long rootdiff = root - buf;
-		BUFCHECK(bdiff + (s-b+1) >= buflen);
-		root = buf + rootdiff;
-		memcpy(++p, b, s-b);
-		p += s-b;
-		*p = '/';
-	    }
-	    b = ++s;
-	    break;
-	  default:
-	    s = CharNext(s);
-	    break;
-	}
-    }
-
-    if (s > b) {
-	BUFCHECK(bdiff + (s-b) >= buflen);
-	memcpy(++p, b, s-b);
-	p += s-b;
-    }
-    if (p == skiproot(buf) - 1) p++;
-
-    if (tainted) {
-	OBJ_TAINT(result);
-    }
-    rb_bytestring_resize(result, p - buf);
-    return result;
-}
-
-VALUE
-rb_file_expand_path(VALUE fname, VALUE dname)
-{
-    VALUE bstr = rb_bytestring_new();
-    rb_bytestring_resize(bstr, MAXPATHLEN + 2);
-    return file_expand_path(fname, dname, bstr);
-}
-
 /*
  *  call-seq:
  *     File.expand_path(file_name [, dir_string] ) -> abs_file_name

Modified: MacRuby/branches/experimental/objc.m
===================================================================
--- MacRuby/branches/experimental/objc.m	2009-03-17 04:58:06 UTC (rev 947)
+++ MacRuby/branches/experimental/objc.m	2009-03-17 04:58:27 UTC (rev 948)
@@ -1581,6 +1581,19 @@
     return true;
 }
 
+VALUE
+rb_file_expand_path(VALUE fname, VALUE dname)
+{
+    NSString *res = [(NSString *)fname stringByExpandingTildeInPath];
+    if (![res isAbsolutePath]) {
+	NSString *dir = dname != Qnil
+	    	? (NSString *)dname
+		: [[NSFileManager defaultManager] currentDirectoryPath];
+	res = [dir stringByAppendingPathComponent:res];
+    }
+    return (VALUE)[res mutableCopy];
+}
+
 void
 rb_objc_alias(VALUE klass, ID name, ID def)
 {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090316/4506b9d9/attachment-0001.html>


More information about the macruby-changes mailing list