helly           Mon Oct 10 17:06:57 2005 EDT

  Modified files:              
    /php-src/ext/spl    spl.php spl_directory.c 
  Log:
  - Finalize work on SplFileInfo and derived for now (add missing get*Info())
  - Update docu
  
  
http://cvs.php.net/diff.php/php-src/ext/spl/spl.php?r1=1.60&r2=1.61&ty=u
Index: php-src/ext/spl/spl.php
diff -u php-src/ext/spl/spl.php:1.60 php-src/ext/spl/spl.php:1.61
--- php-src/ext/spl/spl.php:1.60        Sat Oct  8 14:57:15 2005
+++ php-src/ext/spl/spl.php     Mon Oct 10 17:06:54 2005
@@ -749,10 +749,18 @@
         */
        function getFilename(); 
 
+       /** @return SplFileInfo created for the file
+        */
+       function getFileInfo();
+
        /** @return The current entries path and file name.
         */
        function getPathname(); 
 
+       /** @return SplFileInfo created for the path
+        */
+       function getPathInfo();
+
        /** @return The current entry's permissions.
         */
        function getPerms();
@@ -898,6 +906,19 @@
        /** @return a RecursiveDirectoryIterator for the current entry.
         */
        function getChildren(); 
+
+       /** @return sub path only (without main path)
+        */
+       function getSubPath();
+
+       /** @return the current sub path
+        */
+       function getSubPathname();
+
+       /** @return SplFileInfo created for the current sub path
+        */
+       function getSubPathInfo();
+
 }
 
 /** @ingroup SPL
http://cvs.php.net/diff.php/php-src/ext/spl/spl_directory.c?r1=1.51&r2=1.52&ty=u
Index: php-src/ext/spl/spl_directory.c
diff -u php-src/ext/spl/spl_directory.c:1.51 
php-src/ext/spl/spl_directory.c:1.52
--- php-src/ext/spl/spl_directory.c:1.51        Sat Oct  8 14:57:16 2005
+++ php-src/ext/spl/spl_directory.c     Mon Oct 10 17:06:54 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.c,v 1.51 2005/10/08 18:57:16 helly Exp $ */
+/* $Id: spl_directory.c,v 1.52 2005/10/10 21:06:54 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -265,7 +265,49 @@
 }
 /* }}} */
 
-static void spl_filesystem_object_create_type(int ht, spl_filesystem_object 
*source, int type, zval *return_value TSRMLS_DC) /* {{{ */
+void spl_filesystem_info_set_filename(spl_filesystem_object *intern, char 
*path, int len, int use_copy TSRMLS_DC) /* {{{ */
+{
+       char *p1, *p2;
+
+       intern->file_name = use_copy ? estrndup(path, len) : path;
+       intern->file_name_len = len;
+
+       p1 = strrchr(path, '/');
+       p2 = strrchr(path, '\\');
+       if (p1 || p2) {
+               intern->path_len = (p1 > p2 ? p1 : p2) - path;
+       } else {
+               intern->path_len = 0;
+       }
+       intern->path = estrndup(path, intern->path_len);
+} /* }}} */
+
+static spl_filesystem_object * 
spl_filesystem_object_create_info(spl_filesystem_object *source, char 
*file_path, int file_path_len, int use_copy, zval *return_value TSRMLS_DC) /* 
{{{ */
+{
+       spl_filesystem_object *intern;
+       
+       if (!file_path || !file_path_len) {
+               zend_throw_exception_ex(U_CLASS_ENTRY(spl_ce_RuntimeException), 
0 TSRMLS_CC, "Cannot create SplFileInfo for empty path");
+               if (file_path && !use_copy)
+               {
+                       efree(file_path);
+               }
+               return NULL;
+       }
+
+       php_set_error_handling(EH_THROW, U_CLASS_ENTRY(spl_ce_RuntimeException) 
TSRMLS_CC);
+
+       return_value->value.obj = 
spl_filesystem_object_new_ex(spl_ce_SplFileInfo, &intern TSRMLS_CC);
+       Z_TYPE_P(return_value) = IS_OBJECT;
+
+       spl_filesystem_info_set_filename(intern, file_path, file_path_len, 
use_copy TSRMLS_CC);
+       
+       php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+       
+       return intern;
+} /* }}} */
+
+static spl_filesystem_object * spl_filesystem_object_create_type(int ht, 
spl_filesystem_object *source, int type, zval *return_value TSRMLS_DC) /* {{{ */
 {
        spl_filesystem_object *intern;
        zend_bool use_include_path = 0;
@@ -280,7 +322,7 @@
                if (!source->u.dir.entry.d_name[0]) {
                        
zend_throw_exception_ex(U_CLASS_ENTRY(spl_ce_RuntimeException), 0 TSRMLS_CC, 
"Could not open file");
                        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
-                       return;
+                       return NULL;
                }
        }
 
@@ -292,8 +334,6 @@
                spl_filesystem_object_get_file_name(source TSRMLS_CC);
                intern->file_name = estrndup(source->file_name, 
source->file_name_len);
                intern->file_name_len = source->file_name_len;
-       
-               php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                break;
        case SPL_FS_FILE:
                return_value->value.obj = 
spl_filesystem_object_new_ex(spl_ce_SplFileObject, &intern TSRMLS_CC);
@@ -306,27 +346,29 @@
                intern->u.file.open_mode = "r";
                intern->u.file.open_mode_len = 1;
        
-               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sbr", 
+               if (ht && zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"|sbr", 
                                &intern->u.file.open_mode, 
&intern->u.file.open_mode_len, 
                                &use_include_path, &intern->u.file.zcontext) == 
FAILURE) {
                        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                        intern->u.file.open_mode = NULL;
                        zval_dtor(return_value);
                        Z_TYPE_P(return_value) = IS_NULL;
-                       return;
+                       return NULL;
                }
        
                if (spl_filesystem_file_open(intern, use_include_path, 0 
TSRMLS_CC) == FAILURE) {
                        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                        zval_dtor(return_value);
                        Z_TYPE_P(return_value) = IS_NULL;
-                       return;
+                       return NULL;
                }
        case SPL_FS_DIR:        
+               php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
                zend_throw_exception_ex(U_CLASS_ENTRY(spl_ce_RuntimeException), 
0 TSRMLS_CC, "Operation not supported");
-               break;
+               return NULL;
        }
        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
+       return NULL;
 } /* }}} */
 
 /* {{{ proto void DirectoryIterator::__construct(string path [, int flags])
@@ -532,7 +574,7 @@
 SPL_METHOD(SplFileInfo, __construct)
 {
        spl_filesystem_object *intern;
-       char *path, *p1, *p2;
+       char *path;
        int len;
 
        php_set_error_handling(EH_THROW, U_CLASS_ENTRY(spl_ce_RuntimeException) 
TSRMLS_CC);
@@ -544,18 +586,8 @@
 
        intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() 
TSRMLS_CC);
        
-       intern->file_name = estrndup(path, len);
-       intern->file_name_len = len;
-
-       p1 = strrchr(path, '/');
-       p2 = strrchr(path, '\\');
-       if (p1 || p2) {
-               intern->path_len = (p1 > p2 ? p1 : p2) - path;
-       } else {
-               intern->path_len = 0;
-       }
-       intern->path = estrndup(path, intern->path_len);
-
+       spl_filesystem_info_set_filename(intern, path, len, 1 TSRMLS_CC);
+       
        /* intern->type = SPL_FS_INFO; already set */
 
        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
@@ -657,7 +689,7 @@
        spl_filesystem_object_create_type(ht, intern, SPL_FS_FILE, return_value 
TSRMLS_CC);
 }
 
-/* {{{ proto SplFileObject SplFileInfo::getFileInfo()
+/* {{{ proto SplFileInfo SplFileInfo::getFileInfo()
    Get/copy file info */
 SPL_METHOD(SplFileInfo, getFileInfo)
 {
@@ -666,6 +698,15 @@
        spl_filesystem_object_create_type(ht, intern, SPL_FS_INFO, return_value 
TSRMLS_CC);
 }
 
+/* {{{ proto SplFileInfo SplFileInfo::getPathInfo()
+   Get/copy file info */
+SPL_METHOD(SplFileInfo, getPathInfo)
+{
+       spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       spl_filesystem_object_create_info(intern, intern->path, 
intern->path_len, 1, return_value TSRMLS_CC);
+}
+
 /* {{{ proto void RecursiveDirectoryIterator::rewind()
    Rewind dir back to the start */
 SPL_METHOD(RecursiveDirectoryIterator, rewind)
@@ -787,6 +828,23 @@
 }
 /* }}} */
 
+/* {{{ proto SplFileInfo RecursiveDirectoryIterator::getSubPathInfo()
+   Create SplFileInfo for sub path */
+SPL_METHOD(RecursiveDirectoryIterator, getSubPathInfo)
+{
+       spl_filesystem_object *intern = 
(spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       char *sub_name;
+       int len;
+
+       if (intern->u.dir.sub_path) {
+               len = spprintf(&sub_name, 0, "%s/%s", intern->u.dir.sub_path, 
intern->u.dir.entry.d_name);
+               spl_filesystem_object_create_info(intern, sub_name, len, 0, 
return_value TSRMLS_CC);
+       } else {
+               spl_filesystem_object_create_info(intern, intern->path, 
intern->path_len, 1, return_value TSRMLS_CC);
+       }
+}
+/* }}} */
+
 /* define an overloaded iterator structure */
 typedef struct {
        zend_object_iterator  intern;
@@ -1083,6 +1141,7 @@
        SPL_ME(SplFileInfo,       isDir,         NULL, ZEND_ACC_PUBLIC)
        SPL_ME(SplFileInfo,       isLink,        NULL, ZEND_ACC_PUBLIC)
        SPL_ME(SplFileInfo,       getFileInfo,   NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(SplFileInfo,       getPathInfo,   NULL, ZEND_ACC_PUBLIC)
        SPL_ME(SplFileInfo,       openFile,      arginfo_info_openFile, 
ZEND_ACC_PUBLIC)
        SPL_MA(SplFileInfo,       __toString, SplFileInfo, getPathname, NULL, 
ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
@@ -1117,6 +1176,7 @@
        SPL_ME(RecursiveDirectoryIterator, getChildren,   NULL, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveDirectoryIterator, getSubPath,    NULL, ZEND_ACC_PUBLIC)
        SPL_ME(RecursiveDirectoryIterator, getSubPathname,NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(RecursiveDirectoryIterator, getSubPathInfo,NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to