pollita         Mon Feb 17 21:53:24 2003 EDT

  Modified files:              
    /php4/main/streams  php_stream_filter_api.h 
    /php4/ext/standard  file.c 
  Log:
  Fix stream_filter_(ap|pre)pend to allow attaching on the read and/or write chains.  
Automagically decide what to do if noone tells us.
  
  
Index: php4/main/streams/php_stream_filter_api.h
diff -u php4/main/streams/php_stream_filter_api.h:1.1 
php4/main/streams/php_stream_filter_api.h:1.2
--- php4/main/streams/php_stream_filter_api.h:1.1       Mon Feb 17 20:22:21 2003
+++ php4/main/streams/php_stream_filter_api.h   Mon Feb 17 21:53:23 2003
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_stream_filter_api.h,v 1.1 2003/02/18 01:22:21 wez Exp $ */
+/* $Id: php_stream_filter_api.h,v 1.2 2003/02/18 02:53:23 pollita Exp $ */
 
 /* The filter API works on the principle of "Bucket-Brigades".  This is
  * partially inspired by the Apache 2 method of doing things, although
@@ -33,6 +33,10 @@
  * The first filter in the chain is invoked on the brigade and (depending on
  * it's return value), the next filter is invoked and so on.
  * */
+
+#define PHP_STREAM_FILTER_READ 0x0001
+#define PHP_STREAM_FILTER_WRITE        0x0002
+#define PHP_STREAM_FILTER_ALL  (PHP_STREAM_FILTER_READ | PHP_STREAM_FILTER_WRITE)
 
 typedef struct _php_stream_bucket                      php_stream_bucket;
 typedef struct _php_stream_bucket_brigade      php_stream_bucket_brigade;
Index: php4/ext/standard/file.c
diff -u php4/ext/standard/file.c:1.305 php4/ext/standard/file.c:1.306
--- php4/ext/standard/file.c:1.305      Mon Feb 17 20:22:21 2003
+++ php4/ext/standard/file.c    Mon Feb 17 21:53:24 2003
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: file.c,v 1.305 2003/02/18 01:22:21 wez Exp $ */
+/* $Id: file.c,v 1.306 2003/02/18 02:53:24 pollita Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -179,6 +179,10 @@
        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_WARN",   
PHP_STREAM_NOTIFY_SEVERITY_WARN, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_ERR",    
PHP_STREAM_NOTIFY_SEVERITY_ERR,  CONST_CS | CONST_PERSISTENT);
 
+       REGISTER_LONG_CONSTANT("STREAM_FILTER_READ",                    
+PHP_STREAM_FILTER_READ,                         CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("STREAM_FILTER_WRITE",                   
+PHP_STREAM_FILTER_WRITE,                        CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("STREAM_FILTER_ALL",                             
+PHP_STREAM_FILTER_ALL,                          CONST_CS | CONST_PERSISTENT);
+
        REGISTER_LONG_CONSTANT("FILE_USE_INCLUDE_PATH", PHP_FILE_USE_INCLUDE_PATH, 
CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("FILE_IGNORE_NEW_LINES", PHP_FILE_IGNORE_NEW_LINES, 
CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("FILE_SKIP_EMPTY_LINES", PHP_FILE_SKIP_EMPTY_LINES, 
CONST_CS | CONST_PERSISTENT);
@@ -1252,31 +1256,60 @@
        zval *zstream;
        php_stream *stream;
        char *filtername, *filterparams = NULL;
-       int filternamelen, filterparamslen = 0;
+       int filternamelen, filterparamslen = 0, read_write = 0;
        php_stream_filter *filter;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s", &zstream,
-                               &filtername, &filternamelen, &filterparams, 
&filterparamslen) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|ls", &zstream,
+                               &filtername, &filternamelen, &read_write, 
+&filterparams, &filterparamslen) == FAILURE) {
                RETURN_FALSE;
        }
 
        php_stream_from_zval(stream, &zstream);
-       
-       filter = php_stream_filter_create(filtername, filterparams, filterparamslen, 
php_stream_is_persistent(stream) TSRMLS_CC);
-       if (filter == NULL) {
-               RETURN_FALSE;
+
+       if ((read_write & PHP_STREAM_FILTER_ALL) == 0) {
+               /* Chain not specified.
+                * Examine stream->mode to determine which filters are needed
+                * There's no harm in attaching a filter to an unused chain,
+                * but why waste the memory and clock cycles? 
+                */
+               if (strchr(stream->mode, 'r') || strchr(stream->mode, '+')) {
+                       read_write |= PHP_STREAM_FILTER_READ;
+               }
+               if (strchr(stream->mode, 'w') || strchr(stream->mode, '+') || 
+strchr(stream->mode, 'a')) {
+                       read_write |= PHP_STREAM_FILTER_WRITE;
+               }
        }
 
-       if (append) { 
-               php_stream_filter_append(&stream->readfilters, filter);
-       } else {
-               php_stream_filter_prepend(&stream->readfilters, filter);
+       if (read_write & PHP_STREAM_FILTER_READ) {
+               filter = php_stream_filter_create(filtername, filterparams, 
+filterparamslen, php_stream_is_persistent(stream) TSRMLS_CC);
+               if (filter == NULL) {
+                       RETURN_FALSE;
+               }
+
+               if (append) { 
+                       php_stream_filter_append(&stream->readfilters, filter);
+               } else {
+                       php_stream_filter_prepend(&stream->readfilters, filter);
+               }
+       }
+
+       if (read_write & PHP_STREAM_FILTER_WRITE) {
+               filter = php_stream_filter_create(filtername, filterparams, 
+filterparamslen, php_stream_is_persistent(stream) TSRMLS_CC);
+               if (filter == NULL) {
+                       RETURN_FALSE;
+               }
+
+               if (append) { 
+                       php_stream_filter_append(&stream->writefilters, filter);
+               } else {
+                       php_stream_filter_prepend(&stream->writefilters, filter);
+               }
        }
 
        RETURN_TRUE;
 }
 
-/* {{{ proto bool stream_filter_prepend(resource stream, string filtername[, string 
filterparams])
+/* {{{ proto bool stream_filter_prepend(resource stream, string filtername[, int 
+read_write[, string filterparams]])
    Prepend a filter to a stream */
 PHP_FUNCTION(stream_filter_prepend)
 {
@@ -1284,7 +1317,7 @@
 }
 /* }}} */
 
-/* {{{ proto bool stream_filter_append(resource stream, string filtername[, string 
filterparams])
+/* {{{ proto bool stream_filter_append(resource stream, string filtername[, int 
+read_write[, string filterparams]])
    Append a filter to a stream */
 PHP_FUNCTION(stream_filter_append)
 {



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

Reply via email to