pollita         Fri Sep 22 19:54:30 2006 UTC

  Modified files:              
    /php-src/main       php_streams.h 
    /php-src/ext/standard       streamsfuncs.c 
    /php-src/main/streams       streams.c 
  Log:
  Update stream_copy_to_stream() for PHP6
  
http://cvs.php.net/viewvc.cgi/php-src/main/php_streams.h?r1=1.113&r2=1.114&diff_format=u
Index: php-src/main/php_streams.h
diff -u php-src/main/php_streams.h:1.113 php-src/main/php_streams.h:1.114
--- php-src/main/php_streams.h:1.113    Fri Apr 28 19:03:58 2006
+++ php-src/main/php_streams.h  Fri Sep 22 19:54:30 2006
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_streams.h,v 1.113 2006/04/28 19:03:58 fmk Exp $ */
+/* $Id: php_streams.h,v 1.114 2006/09/22 19:54:30 pollita Exp $ */
 
 #ifndef PHP_STREAMS_H
 #define PHP_STREAMS_H
@@ -456,9 +456,12 @@
 #define PHP_STREAM_COPY_ALL            ((size_t)-1)
 
 BEGIN_EXTERN_C()
+PHPAPI size_t _php_stream_ucopy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen, int maxchars STREAMS_DC TSRMLS_DC);
 PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen STREAMS_DC TSRMLS_DC);
-#define php_stream_copy_to_stream(src, dest, maxlen)   
_php_stream_copy_to_stream((src), (dest), (maxlen) STREAMS_CC TSRMLS_CC)
-
+/* Preserve "characters" semantics by having maxlen refer to maxchars in a 
unicode context */
+#define php_stream_copy_to_stream(src, dest, maxlen)   ( ((src)->readbuf_type 
== IS_STRING) \
+               ? _php_stream_copy_to_stream((src), (dest), (maxlen) STREAMS_CC 
TSRMLS_CC) \
+               : _php_stream_ucopy_to_stream((src), (dest), -1, (maxlen) 
STREAMS_CC TSRMLS_CC) )
 
 /* read all data from stream and put into a buffer. Caller must free buffer 
when done.
  * The copy will use mmap if available. */
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/streamsfuncs.c?r1=1.88&r2=1.89&diff_format=u
Index: php-src/ext/standard/streamsfuncs.c
diff -u php-src/ext/standard/streamsfuncs.c:1.88 
php-src/ext/standard/streamsfuncs.c:1.89
--- php-src/ext/standard/streamsfuncs.c:1.88    Fri Sep 22 18:42:33 2006
+++ php-src/ext/standard/streamsfuncs.c Fri Sep 22 19:54:30 2006
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: streamsfuncs.c,v 1.88 2006/09/22 18:42:33 pollita Exp $ */
+/* $Id: streamsfuncs.c,v 1.89 2006/09/22 19:54:30 pollita Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -443,7 +443,7 @@
 }
 /* }}} */
 
-/* {{{ proto long stream_copy_to_stream(resource source, resource dest [, long 
maxlen [, long pos]])
+/* {{{ proto long stream_copy_to_stream(resource source, resource dest [, long 
maxlen [, long pos]]) U
    Reads up to maxlen bytes from source stream and writes them to dest stream. 
*/
 PHP_FUNCTION(stream_copy_to_stream)
 {
http://cvs.php.net/viewvc.cgi/php-src/main/streams/streams.c?r1=1.135&r2=1.136&diff_format=u
Index: php-src/main/streams/streams.c
diff -u php-src/main/streams/streams.c:1.135 
php-src/main/streams/streams.c:1.136
--- php-src/main/streams/streams.c:1.135        Tue Sep 19 20:36:48 2006
+++ php-src/main/streams/streams.c      Fri Sep 22 19:54:30 2006
@@ -19,7 +19,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.135 2006/09/19 20:36:48 pollita Exp $ */
+/* $Id: streams.c,v 1.136 2006/09/22 19:54:30 pollita Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -1568,7 +1568,7 @@
 
                ucnv_resetFromUnicode(conv);
 
-               while ((b = php_stream_read_unicode(stream, inbuf_start, 
sizeof(inbuf_start))) > 0) {
+               while ((b = php_stream_read_unicode(stream, inbuf_start, 8192)) 
> 0) {
                        char *outbuf = outbuf_start;
                        const UChar *inbuf = inbuf_start;
                        UErrorCode status = U_ZERO_ERROR;
@@ -1733,14 +1733,97 @@
        return len;
 }
 
+/* Designed for copying UChars (taking into account both maxlen and maxchars) 
*/
+PHPAPI size_t _php_stream_ucopy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen, int maxchars STREAMS_DC TSRMLS_DC)
+{
+       size_t haveread = 0;
+       php_stream_statbuf ssbuf;
+
+       if (src->readbuf_type == IS_STRING) {
+               /* Called incorrectly, don't do that. */
+               return _php_stream_copy_to_stream(src, dest, maxlen STREAMS_CC 
TSRMLS_CC);
+       }
+
+       if (maxlen == 0 || maxchars == 0) {
+               return 0;
+       }
+
+       if (maxlen == PHP_STREAM_COPY_ALL) {
+               maxlen = 0;
+       }
+
+       if (php_stream_stat(src, &ssbuf) == 0) {
+               /* in the event that the source file is 0 bytes, return 1 to 
indicate success
+                * because opening the file to write had already created a copy 
*/
+               if (ssbuf.sb.st_size == 0
+#ifdef S_ISFIFO
+                && !S_ISFIFO(ssbuf.sb.st_mode)
+#endif
+#ifdef S_ISCHR
+                && !S_ISCHR(ssbuf.sb.st_mode)
+#endif
+               ) {
+                       return 1;
+               }
+       }
+
+       while(1) {
+               UChar buf[CHUNK_SIZE];
+               size_t readchunk = CHUNK_SIZE;
+               size_t didread;
+
+               if (maxlen && (maxlen - haveread) < readchunk) {
+                       readchunk = maxlen - haveread;
+               }
+
+               didread = php_stream_read_unicode_ex(src, buf, readchunk, 
maxchars);
+
+               if (didread) {
+                       /* extra paranoid */
+                       size_t didwrite, towrite;
+                       UChar *writeptr;
+
+                       if (maxchars > 0) {
+                               /* Determine number of chars in this buf */
+                               maxchars -= u_countChar32(buf, didread);
+                       }
+
+                       towrite = didread;
+                       writeptr = buf;
+                       haveread += didread;
+
+                       while(towrite) {
+                               didwrite = php_stream_write_unicode(dest, 
writeptr, towrite);
+                               if (didwrite == 0) {
+                                       return 0;       /* error */
+                               }
+
+                               towrite -= didwrite;
+                               writeptr += didwrite;
+                       }
+               } else {
+                       return haveread;
+               }
+
+               if (maxchars == 0 || maxlen - haveread == 0) {
+                       break;
+               }
+       }
+
+       return haveread;
+}
+
+/* Optimized for copying octets from source stream */
 PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, 
size_t maxlen STREAMS_DC TSRMLS_DC)
 {
-       char buf[CHUNK_SIZE];
-       size_t readchunk;
        size_t haveread = 0;
-       size_t didread;
        php_stream_statbuf ssbuf;
 
+       if (src->readbuf_type == IS_UNICODE) {
+               /* Called incorrectly, don't do that. */
+               return _php_stream_ucopy_to_stream(src, dest, maxlen, -1 
STREAMS_CC TSRMLS_CC);
+       }
+
        if (maxlen == 0) {
                return 0;
        }
@@ -1771,7 +1854,7 @@
                p = php_stream_mmap_range(src, php_stream_tell(src), maxlen, 
PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped);
 
                if (p) {
-                       haveread = php_stream_write(dest, p, mapped);
+                       mapped = php_stream_write(dest, p, mapped);
 
                        php_stream_mmap_unmap(src);
 
@@ -1780,10 +1863,13 @@
        }
 
        while(1) {
-               readchunk = sizeof(buf);
+               char buf[CHUNK_SIZE];
+               size_t readchunk = sizeof(buf);
+               size_t didread;
 
-               if (maxlen && (maxlen - haveread) < readchunk)
+               if (maxlen && (maxlen - haveread) < readchunk) {
                        readchunk = maxlen - haveread;
+               }
 
                didread = php_stream_read(src, buf, readchunk);
 
@@ -1813,8 +1899,8 @@
                        break;
                }
        }
-       return haveread;
 
+       return haveread;
 }
 /* }}} */
 

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

Reply via email to