helly           Wed Jul 16 11:13:23 2003 EDT

  Added files:                 
    /spl        spl_directory.c 

  Modified files:              
    /spl        config.m4 php_spl.c php_spl.h spl_functions.c spl_functions.h 
  Log:
  Add directory iterator class
  
Index: spl/config.m4
diff -u spl/config.m4:1.3 spl/config.m4:1.4
--- spl/config.m4:1.3   Tue Jul  8 19:11:36 2003
+++ spl/config.m4       Wed Jul 16 11:13:22 2003
@@ -1,4 +1,4 @@
-dnl $Id: config.m4,v 1.3 2003/07/08 23:11:36 helly Exp $
+dnl $Id: config.m4,v 1.4 2003/07/16 15:13:22 helly Exp $
 dnl config.m4 for extension SPL
 
 PHP_ARG_ENABLE(spl, enable SPL suppport,
@@ -39,5 +39,5 @@
 
 if test "$PHP_SPL" != "no"; then
     AC_DEFINE(HAVE_SPL, 1, [Whether you want SPL (Standard Php Library) support]) 
-    PHP_NEW_EXTENSION(spl, php_spl.c spl_functions.c spl_engine.c spl_foreach.c 
spl_array.c, $ext_shared)
+    PHP_NEW_EXTENSION(spl, php_spl.c spl_functions.c spl_engine.c spl_foreach.c 
spl_array.c spl_directory.c, $ext_shared)
 fi
Index: spl/php_spl.c
diff -u spl/php_spl.c:1.10 spl/php_spl.c:1.11
--- spl/php_spl.c:1.10  Wed Jul 16 05:48:36 2003
+++ spl/php_spl.c       Wed Jul 16 11:13:23 2003
@@ -136,6 +136,8 @@
        REGISTER_SPL_IMPLEMENT(array_access, array_read);
        REGISTER_SPL_INTF_FUNC(array_access, set);
 
+       PHP_MINIT(spl_directory)(INIT_FUNC_ARGS_PASSTHRU);
+
        return SUCCESS;
 }
 /* }}} */
Index: spl/php_spl.h
diff -u spl/php_spl.h:1.7 spl/php_spl.h:1.8
--- spl/php_spl.h:1.7   Wed Jul 16 05:48:36 2003
+++ spl/php_spl.h       Wed Jul 16 11:13:23 2003
@@ -95,6 +95,8 @@
 PHP_FUNCTION(class_parents);
 PHP_FUNCTION(class_implements);
 
+PHP_MINIT_FUNCTION(spl_directory);
+
 #endif /* PHP_SPL_H */
 
 /*
Index: spl/spl_functions.c
diff -u spl/spl_functions.c:1.12 spl/spl_functions.c:1.13
--- spl/spl_functions.c:1.12    Tue Jun 17 16:18:10 2003
+++ spl/spl_functions.c Wed Jul 16 11:13:23 2003
@@ -49,11 +49,11 @@
 /* }}} */
 
 /* {{{ spl_register_std_class */
-void spl_register_std_class(zend_class_entry ** ppce, char * class_name, void * 
obj_ctor TSRMLS_DC)
+void spl_register_std_class(zend_class_entry ** ppce, char * class_name, void * 
obj_ctor, function_entry * function_list TSRMLS_DC)
 {
        zend_class_entry ce;
        
-       INIT_CLASS_ENTRY(ce, class_name, NULL);
+       INIT_CLASS_ENTRY(ce, class_name, function_list);
        ce.name_length = strlen(class_name);
        *ppce = zend_register_internal_class(&ce TSRMLS_CC);
 
Index: spl/spl_functions.h
diff -u spl/spl_functions.h:1.4 spl/spl_functions.h:1.5
--- spl/spl_functions.h:1.4     Tue Jun 17 16:18:10 2003
+++ spl/spl_functions.h Wed Jul 16 11:13:23 2003
@@ -24,7 +24,10 @@
 typedef zend_object_value (*create_object_func_t)(zend_class_entry *class_type 
TSRMLS_DC);
 
 #define REGISTER_SPL_STD_CLASS(class_name, obj_ctor) \
-       spl_register_std_class(&spl_ce_ ## class_name, "spl_" # class_name, obj_ctor 
TSRMLS_CC);
+       spl_register_std_class(&spl_ce_ ## class_name, "spl_" # class_name, obj_ctor, 
NULL TSRMLS_CC);
+
+#define REGISTER_SPL_STD_CLASS_EX(class_name, obj_ctor, funcs) \
+       spl_register_std_class(&spl_ce_ ## class_name, "spl_" # class_name, obj_ctor, 
funcs TSRMLS_CC);
 
 #define REGISTER_SPL_INTERFACE(class_name) \
        spl_register_interface(&spl_ce_ ## class_name, "spl_" # class_name TSRMLS_CC);
@@ -43,7 +46,7 @@
 
 void spl_destroy_class(zend_class_entry ** ppce);
 
-void spl_register_std_class(zend_class_entry ** ppce, char * class_name, 
create_object_func_t ctor TSRMLS_DC);
+void spl_register_std_class(zend_class_entry ** ppce, char * class_name, 
create_object_func_t ctor, function_entry * function_list TSRMLS_DC);
 
 void spl_register_interface(zend_class_entry ** ppce, char * class_name TSRMLS_DC);
 
@@ -57,10 +60,10 @@
 int spl_add_classes(zend_class_entry ** ppce, zval *list TSRMLS_DC);
 
 #define SPL_CLASS_FE(class_name, function_name, arg_types) \
-       PHP_NAMED_FE( function_name, spl_ ## class_name ## function_name, arg_types)
+       PHP_NAMED_FE( function_name, spl_ ## class_name ## _ ## function_name, 
arg_types)
 
 #define SPL_CLASS_FUNCTION(class_name, function_name) \
-       PHP_NAMED_FUNCTION(spl_ ## class_name ## function_name)
+       PHP_NAMED_FUNCTION(spl_ ## class_name ## _ ## function_name)
 
 #endif /* PHP_FUNCTIONS_H */
 

Index: spl/spl_directory.c
+++ spl/spl_directory.c
/*
   +----------------------------------------------------------------------+
   | PHP Version 4                                                        |
   +----------------------------------------------------------------------+
   | Copyright (c) 1997-2003 The PHP Group                                |
   +----------------------------------------------------------------------+
   | This source file is subject to version 3.0 of the PHP license,       |
   | that is bundled with this package in the file LICENSE, and is        |
   | available through the world-wide-web at the following url:           |
   | http://www.php.net/license/3_0.txt.                                  |
   | If you did not receive a copy of the PHP license and are unable to   |
   | obtain it through the world-wide-web, please send a note to          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Author: Marcus Boerger <[EMAIL PROTECTED]>                               |
   +----------------------------------------------------------------------+
 */

/* $Id: spl_directory.c,v 1.1 2003/07/16 15:13:23 helly Exp $ */

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif

#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "zend_compile.h"
#include "zend_execute_locks.h"
#include "zend_default_classes.h"

#include "php_spl.h"
#include "spl_functions.h"
#include "spl_engine.h"
#include "spl_foreach.h"

#include "php.h"
#include "fopen_wrappers.h"

SPL_CLASS_FUNCTION(dir, __construct);
SPL_CLASS_FUNCTION(dir, rewind);
SPL_CLASS_FUNCTION(dir, current);
SPL_CLASS_FUNCTION(dir, next);
SPL_CLASS_FUNCTION(dir, has_more);
SPL_CLASS_FUNCTION(dir, get_path);

static zend_function_entry spl_dir_class_functions[] = {
        SPL_CLASS_FE(dir, __construct,   NULL)
        SPL_CLASS_FE(dir, rewind,        NULL)
        SPL_CLASS_FE(dir, current,       NULL)
        SPL_CLASS_FE(dir, next,          NULL)
        SPL_CLASS_FE(dir, has_more,      NULL)
        SPL_CLASS_FE(dir, get_path,      NULL)
        {NULL, NULL, NULL}
};

static zend_object_handlers spl_dir_handlers;
static zend_class_entry *spl_ce_dir;

typedef struct _spl_dir_object {
        zend_object       std;
        php_stream        *dirp;
        php_stream_dirent entry;
        char              *path;
} spl_dir_object;

/* {{{ spl_dir_object_dtor */
static void spl_dir_object_dtor(void *object, zend_object_handle handle TSRMLS_DC)
{
        spl_dir_object *intern = (spl_dir_object *)object;

        zend_hash_destroy(intern->std.properties);
        FREE_HASHTABLE(intern->std.properties);

        if (intern->path) {
                efree(intern->path);
        }
        if (intern->dirp) {
                php_stream_close(intern->dirp);
        }
        efree(object);
}
/* }}} */

/* {{{ spl_dir_object_clone */
static void spl_dir_object_clone(void *object, void **object_clone TSRMLS_DC)
{
        /* TODO */
}
/* }}} */

/* {{{ spl_dir_object_new */
static zend_object_value spl_dir_object_new(zend_class_entry *class_type TSRMLS_DC)
{
        zend_object_value retval;
        spl_dir_object *intern;
        zval *tmp;

        intern = emalloc(sizeof(spl_dir_object));
        memset(intern, 0, sizeof(spl_dir_object));
        intern->std.ce = class_type;

        ALLOC_HASHTABLE(intern->std.properties);
        zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
        zend_hash_copy(intern->std.properties, &class_type->default_properties, 
(copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));

        retval.handle = zend_objects_store_put(intern, spl_dir_object_dtor, 
spl_dir_object_clone TSRMLS_CC);
        retval.handlers = &spl_dir_handlers;
        return retval;
}
/* }}} */

/* {{{ spl_dir_get_ce */
static zend_class_entry *spl_dir_get_ce(zval *object TSRMLS_DC)
{
        return spl_ce_dir;
}
/* }}} */

/* {{{ PHP_MINIT_FUNCTION(spl_directory) */
PHP_MINIT_FUNCTION(spl_directory)
{
        REGISTER_SPL_STD_CLASS_EX(dir, spl_dir_object_new, spl_dir_class_functions);
        REGISTER_SPL_IMPLEMENT(dir, sequence);
        memcpy(&spl_dir_handlers, zend_get_std_object_handlers(), 
sizeof(zend_object_handlers));
        spl_dir_handlers.get_class_entry = spl_dir_get_ce;

        return SUCCESS;
}
/* }}} */

/* {{{ proto void __construct(string path)
 Cronstructs a new dir iterator from a path. */
SPL_CLASS_FUNCTION(dir, __construct)
{
        zval *object = getThis();
        spl_dir_object *intern;
        char *path;
        long len;

/* exceptions do not work yet
        php_set_error_handling(EH_THROW, zend_exception_get_default() TSRMLS_CC);*/

        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &path, &len) == 
FAILURE) {
                return;
        }

        intern = (spl_dir_object*)zend_object_store_get_object(object TSRMLS_CC);
        intern->dirp = php_stream_opendir(path, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);

        intern->path = estrdup(path);

        if (intern->dirp == NULL) {
                /* throw exception: should've been already happened */
                intern->entry.d_name[0] = '\0';
        } else {
                if (!php_stream_readdir(intern->dirp, &intern->entry)) {
                        intern->entry.d_name[0] = '\0';
                }
        }

        php_set_error_handling(EH_NORMAL, NULL TSRMLS_CC);
}
/* }}} */

/* {{{ proto void rewind()
   Rewind dir back to the start */
SPL_CLASS_FUNCTION(dir, rewind)
{
        zval *object = getThis();
        spl_dir_object *intern = (spl_dir_object*)zend_object_store_get_object(object 
TSRMLS_CC);

        if (intern->dirp) {
                php_stream_rewinddir(intern->dirp);
        }
        if (!intern->dirp || !php_stream_readdir(intern->dirp, &intern->entry)) {
                intern->entry.d_name[0] = '\0';
        }
}
/* }}} */

/* {{{ proto string current()
   Return current dir entry */
SPL_CLASS_FUNCTION(dir, current)
{
        zval *object = getThis();
        spl_dir_object *intern = (spl_dir_object*)zend_object_store_get_object(object 
TSRMLS_CC);

        if (intern->dirp) {
                RETURN_STRING(intern->entry.d_name, 1);
        } else {
                RETURN_FALSE;
        }
}
/* }}} */

/* {{{ proto void next()
   Move to next entry */
SPL_CLASS_FUNCTION(dir, next)
{
        zval *object = getThis();
        spl_dir_object *intern = (spl_dir_object*)zend_object_store_get_object(object 
TSRMLS_CC);

        if (intern->dirp && php_stream_readdir(intern->dirp, &intern->entry)) {
                RETURN_TRUE;
        } else {
                intern->entry.d_name[0] = '\0';
                RETURN_FALSE;
        }
}
/* }}} */

/* {{{ proto string has_more()
   Check whether dir contains more entries */
SPL_CLASS_FUNCTION(dir, has_more)
{
        zval *object = getThis();
        spl_dir_object *intern = (spl_dir_object*)zend_object_store_get_object(object 
TSRMLS_CC);

        RETURN_BOOL(intern->entry.d_name[0] != '\0');
}
/* }}} */

/* {{{ proto string get_path()
   Return directory path */
SPL_CLASS_FUNCTION(dir, get_path)
{
        zval *object = getThis();
        spl_dir_object *intern = (spl_dir_object*)zend_object_store_get_object(object 
TSRMLS_CC);

        RETURN_STRING(intern->path, 1);
}
/* }}} */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: sw=4 ts=4 fdm=marker
 * vim<600: sw=4 ts=4
 */

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

Reply via email to