helly           Mon Mar  7 17:18:41 2005 EDT

  Modified files:              
    /php-src/ext/spl    spl_directory.c 
  Log:
  - Add more methods
  - Avoid exceptions in iterator access
  - Do not read in rewind8) or next() instead read in iteration if neccessary
  - Correctly count line numer on reading
  
  
http://cvs.php.net/diff.php/php-src/ext/spl/spl_directory.c?r1=1.33&r2=1.34&ty=u
Index: php-src/ext/spl/spl_directory.c
diff -u php-src/ext/spl/spl_directory.c:1.33 
php-src/ext/spl/spl_directory.c:1.34
--- php-src/ext/spl/spl_directory.c:1.33        Mon Mar  7 03:04:47 2005
+++ php-src/ext/spl/spl_directory.c     Mon Mar  7 17:18:40 2005
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: spl_directory.c,v 1.33 2005/03/07 08:04:47 helly Exp $ */
+/* $Id: spl_directory.c,v 1.34 2005/03/07 22:18:40 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
@@ -919,6 +919,29 @@
        return SUCCESS;
 } /* }}} */
 
+static void spl_file_object_read_line(zval * this_ptr, spl_file_object 
*intern, int silent TSRMLS_DC) /* {{{ */
+{
+       zval *retval;
+
+       /* if overloaded call the function, otherwise do it directly */
+       if (intern->func_getCurr->common.scope != spl_ce_File) {
+               zend_call_method_with_0_params(&getThis(), 
Z_OBJCE_P(getThis()), &intern->func_getCurr, "getCurrentLine", &retval);
+               if (retval) {
+                       if (Z_TYPE_P(retval) == IS_STRING) {
+                               intern->current_line = 
estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
+                               intern->current_line_len = Z_STRLEN_P(retval);
+                       } else {
+                               MAKE_STD_ZVAL(intern->current_zval);
+                               ZVAL_ZVAL(intern->current_zval, retval, 1, 0);
+                       }
+                       zval_ptr_dtor(&retval);
+                       intern->current_line_num++;
+               }
+       } else {
+               spl_file_object_read(intern, silent TSRMLS_CC);
+       }
+} /* }}} */
+
 static int spl_file_object_open(spl_file_object *intern, int use_include_path, 
int silent TSRMLS_DC) /* {{{ */
 {
        intern->context = php_stream_context_from_zval(intern->zcontext, 0);
@@ -977,29 +1000,12 @@
 SPL_METHOD(File, rewind)
 {
        spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-       zval *retval;
 
        if (-1 == php_stream_rewind(intern->stream)) {
                zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, 
"Cannot rewind file %s", intern->file_name);
        } else {
                intern->current_line_num = 0;
-               /* if overloaded call the function, otherwise do it directly */
-               if (intern->func_getCurr->common.scope != spl_ce_File) {
-                       zend_call_method_with_0_params(&getThis(), 
Z_OBJCE_P(getThis()), &intern->func_getCurr, "getCurrentLine", &retval);
-                       spl_file_object_free_line(intern TSRMLS_CC);
-                       if (retval) {
-                               if (Z_TYPE_P(retval) == IS_STRING) {
-                                       intern->current_line = 
estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
-                                       intern->current_line_len = 
Z_STRLEN_P(retval);
-                               } else {
-                                       MAKE_STD_ZVAL(intern->current_zval);
-                                       ZVAL_ZVAL(intern->current_zval, retval, 
1, 0);
-                               }
-                               zval_ptr_dtor(&retval);
-                       }
-               } else {
-                       spl_file_object_read(intern, 0 TSRMLS_CC);
-               }
+               spl_file_object_free_line(intern TSRMLS_CC);
        }
 } /* }}} */
 
@@ -1039,6 +1045,7 @@
        if (spl_file_object_read(intern, 0 TSRMLS_CC) == FAILURE) {
                RETURN_FALSE;
        }
+       intern->current_line_num++;
        RETURN_STRINGL(intern->current_line, intern->current_line_len, 1);
 } /* }}} */
 
@@ -1048,6 +1055,9 @@
 {
        spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
+       if (!intern->current_line) {
+               spl_file_object_read_line(getThis(), intern, 1 TSRMLS_CC);
+       }
        if (intern->current_line) {
                RETURN_STRINGL(intern->current_line, intern->current_line_len, 
1);
        } else if (intern->current_zval) {
@@ -1062,6 +1072,9 @@
 {
        spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
+       if (!intern->current_line) {
+               spl_file_object_read_line(getThis(), intern, 1 TSRMLS_CC);
+       }
        RETURN_LONG(intern->current_line_num);
 } /* }}} */
 
@@ -1071,24 +1084,7 @@
 {
        spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
 
-       /* if overloaded call the function, otherwise do it directly */
-       if (intern->func_getCurr->common.scope != spl_ce_File) {
-               zval *retval;
-               zend_call_method_with_0_params(&getThis(), 
Z_OBJCE_P(getThis()), &intern->func_getCurr, "getCurrentLine", &retval);
-               spl_file_object_free_line(intern TSRMLS_CC);
-               if (retval) {
-                       if (Z_TYPE_P(retval) == IS_STRING) {
-                               intern->current_line = 
estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
-                               intern->current_line_len = Z_STRLEN_P(retval);
-                       } else {
-                               MAKE_STD_ZVAL(intern->current_zval);
-                               ZVAL_ZVAL(intern->current_zval, retval, 1, 0);
-                       }
-                       zval_ptr_dtor(&retval);
-               }
-       } else {
-               spl_file_object_read(intern, 1 TSRMLS_CC);
-       }
+       spl_file_object_free_line(intern TSRMLS_CC);
 } /* }}} */
 
 /* {{{ proto void setFlags()
@@ -1223,9 +1219,158 @@
        FileFunctionCall(fgetcsv, arg2);
 
        zval_ptr_dtor(&arg2);
+       intern->current_line_num++;
 }
 /* }}} */
 
+/* {{{ proto bool File::flock(int operation [, int &wouldblock])
+   Portable file locking */
+FileFunction(flock)
+/* }}} */
+
+/* {{{ proto bool File::fflush()
+   Flush the file */
+SPL_METHOD(File, fflush)
+{
+       spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       RETURN_BOOL(!php_stream_flush(intern->stream));
+} /* }}} */
+
+
+/* {{{ proto int File::ftell()
+   Return current file position */
+SPL_METHOD(File, ftell)
+{
+       spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);  
+       long ret = php_stream_tell(intern->stream);
+
+       if (ret == -1) {
+               RETURN_FALSE;
+       } else {
+               RETURN_LONG(ret);
+       }
+} /* }}} */
+
+/* {{{ proto int File::fseek(int pos [, int whence = SEEK_SET])
+   Return current file position */
+SPL_METHOD(File, fseek)
+{
+       spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       long pos, whence = SEEK_SET;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &pos, 
&whence) == FAILURE) {
+               return;
+       }
+
+       spl_file_object_free_line(intern TSRMLS_CC);
+       RETURN_LONG(php_stream_seek(intern->stream, pos, whence));
+} /* }}} */
+
+/* {{{ proto int File::fgetc()
+   Get a character form the file */
+SPL_METHOD(File, fgetc)
+{
+       spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       char buf[2];
+       int result;
+
+       result = php_stream_getc(intern->stream);
+
+       if (result == EOF) {
+               RETVAL_FALSE;
+       } else {
+               buf[0] = result;
+               buf[1] = '\0';
+
+               RETURN_STRINGL(buf, 1, 1);
+       }
+} /* }}} */
+
+/* {{{ proto string File::fgetss([string allowable_tags])
+   Get a line from file pointer and strip HTML tags */
+SPL_METHOD(File, fgetss)
+{
+       spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       zval *arg2 = NULL;
+       MAKE_STD_ZVAL(arg2);
+       ZVAL_LONG(arg2, intern->max_line_len);
+
+       FileFunctionCall(fgetss, arg2);
+
+       zval_ptr_dtor(&arg2);
+} /* }}} */
+
+/* {{{ proto int File::fpassthru()
+   Output all remaining data from a file pointer */
+SPL_METHOD(File, fpassthru)
+{
+       spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+       RETURN_LONG(php_stream_passthru(intern->stream));
+} /* }}} */
+
+/* {{{ proto bool File::fscanf(string format [, string ...])
+   Implements a mostly ANSI compatible fscanf() */
+FileFunction(fscanf)
+/* }}} */
+
+/* {{{ proto int fwrite(string str [, int length])
+   Binary-safe file write */
+SPL_METHOD(File, fwrite)
+{
+       spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       char *str;
+       int str_len;
+       int ret;
+       long length;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &str, 
&str_len, &length) == FAILURE) {
+               return;
+       }
+
+       if (ZEND_NUM_ARGS() < 2) {
+               str_len = MAX(0, MIN(length, str_len));
+       }
+       if (!str_len) {
+               RETURN_LONG(0);
+       }
+
+       if (PG(magic_quotes_runtime)) {
+               str = estrndup(str, str_len);
+               php_stripslashes(str, &str_len TSRMLS_CC);
+               ret = php_stream_write(intern->stream, str, str_len);
+               efree(str);
+               RETURN_LONG(ret);
+       }
+
+       RETURN_LONG(php_stream_write(intern->stream, str, str_len));
+} /* }}} */
+
+/* {{{ proto bool File::fstat()
+   Stat() on a filehandle */
+FileFunction(fstat)
+/* }}} */
+
+/* {{{ proto bool File::ftruncate(int size)
+   Truncate file to 'size' length */
+SPL_METHOD(File, ftruncate)
+{
+       spl_file_object *intern = 
(spl_file_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+       long size;
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &size) == 
FAILURE) {
+               return;
+       }
+
+       if (!php_stream_truncate_supported(intern->stream)) {
+               zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, 
"Can't truncate file %s", intern->file_name);
+               RETURN_FALSE;
+       }
+       
+       RETURN_BOOL(0 == php_stream_truncate_set_size(intern->stream, size));
+} /* }}} */
+
 static
 ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object___construct, 0, 0, 1)
        ZEND_ARG_INFO(0, file_name)
@@ -1258,6 +1403,17 @@
        SPL_ME(File, valid,          NULL, ZEND_ACC_PUBLIC)
        SPL_ME(File, fgets,          arginfo_file_object_fgetcsv, 
ZEND_ACC_PUBLIC)
        SPL_ME(File, fgetcsv,        NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, flock,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, fflush,         NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, ftell,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, fseek,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, fgetc,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, fpassthru,      NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, fgetss,         NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, fscanf,         NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, fwrite,         NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, fstat,          NULL, ZEND_ACC_PUBLIC)
+       SPL_ME(File, ftruncate,      NULL, ZEND_ACC_PUBLIC)
        SPL_ME(File, current,        NULL, ZEND_ACC_PUBLIC)
        SPL_ME(File, key,            NULL, ZEND_ACC_PUBLIC)
        SPL_ME(File, next,           NULL, ZEND_ACC_PUBLIC)

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

Reply via email to