pollita Fri Mar 24 19:22:24 2006 UTC Modified files: /php-src/ext/standard streamsfuncs.c /php-src/main php_streams.h /php-src/main/streams streams.c Log: Add php_stream_get_record_unicde() API call. Update stream_get_line() userspace function to handle unicode streams. http://cvs.php.net/viewcvs.cgi/php-src/ext/standard/streamsfuncs.c?r1=1.68&r2=1.69&diff_format=u Index: php-src/ext/standard/streamsfuncs.c diff -u php-src/ext/standard/streamsfuncs.c:1.68 php-src/ext/standard/streamsfuncs.c:1.69 --- php-src/ext/standard/streamsfuncs.c:1.68 Mon Mar 13 04:40:11 2006 +++ php-src/ext/standard/streamsfuncs.c Fri Mar 24 19:22:24 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streamsfuncs.c,v 1.68 2006/03/13 04:40:11 pollita Exp $ */ +/* $Id: streamsfuncs.c,v 1.69 2006/03/24 19:22:24 pollita Exp $ */ #include "php.h" #include "php_globals.h" @@ -1235,18 +1235,15 @@ /* {{{ proto string stream_get_line(resource stream, int maxlen [, string ending]) Read up to maxlen bytes from a stream or until the ending string is found */ -/* UTODO */ PHP_FUNCTION(stream_get_line) { - char *str = NULL; - int str_len; long max_length; zval *zstream; - char *buf; size_t buf_size; php_stream *stream; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|s", &zstream, &max_length, &str, &str_len) == FAILURE) { + zval **delim = NULL; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|Z", &zstream, &max_length, &delim) == FAILURE) { RETURN_FALSE; } @@ -1260,10 +1257,34 @@ php_stream_from_zval(stream, &zstream); - if ((buf = php_stream_get_record(stream, max_length, &buf_size, str, str_len TSRMLS_CC))) { - RETURN_STRINGL(buf, buf_size, 0); + if (php_stream_reads_unicode(stream)) { + UChar *buf; + + if (Z_TYPE_PP(delim) != IS_UNICODE) { + convert_to_unicode_ex(delim); + } + + /* maxchars == maxlength will prevent the otherwise generous maxlen == max_length * 2 + from allocating beyond what's requested */ + buf = php_stream_get_record_unicode(stream, max_length * 2, max_length, &buf_size, Z_USTRVAL_PP(delim), Z_USTRLEN_PP(delim) TSRMLS_CC); + if (!buf) { + RETURN_FALSE; + } + + RETURN_UNICODEL(buf, buf_size, 0); } else { - RETURN_FALSE; + char *buf; + + if (Z_TYPE_PP(delim) != IS_STRING) { + convert_to_string_ex(delim); + } + + buf = php_stream_get_record(stream, max_length, &buf_size, Z_STRVAL_PP(delim), Z_STRLEN_PP(delim) TSRMLS_CC); + if (!buf) { + RETURN_FALSE; + } + + RETURN_STRINGL(buf, buf_size, 0); } } http://cvs.php.net/viewcvs.cgi/php-src/main/php_streams.h?r1=1.107&r2=1.108&diff_format=u Index: php-src/main/php_streams.h diff -u php-src/main/php_streams.h:1.107 php-src/main/php_streams.h:1.108 --- php-src/main/php_streams.h:1.107 Tue Mar 14 21:15:05 2006 +++ php-src/main/php_streams.h Fri Mar 24 19:22:24 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_streams.h,v 1.107 2006/03/14 21:15:05 pollita Exp $ */ +/* $Id: php_streams.h,v 1.108 2006/03/24 19:22:24 pollita Exp $ */ #ifndef PHP_STREAMS_H #define PHP_STREAMS_H @@ -329,6 +329,8 @@ _php_stream_get_line((stream), (buf_type), ZSTR(buf), (maxlen), (maxchars), NULL TSRMLS_CC) PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *returned_len, char *delim, size_t delim_len TSRMLS_DC); +PHPAPI UChar *php_stream_get_record_unicode(php_stream *stream, size_t maxlen, size_t maxchars, size_t *returned_len, UChar *delim, size_t delim_len TSRMLS_DC); + PHPAPI UChar *_php_stream_u_get_line(php_stream *stream, UChar *buf, int32_t *pmax_bytes, int32_t *pmax_chars, int *pis_unicode TSRMLS_DC); #define php_stream_u_get_line(stream, buf, maxlen_buf, maxlen_chars, buf_type) _php_stream_u_get_line((stream), (buf), (maxlen_buf), (maxlen_chars), (buf_type) TSRMLS_CC) http://cvs.php.net/viewcvs.cgi/php-src/main/streams/streams.c?r1=1.109&r2=1.110&diff_format=u Index: php-src/main/streams/streams.c diff -u php-src/main/streams/streams.c:1.109 php-src/main/streams/streams.c:1.110 --- php-src/main/streams/streams.c:1.109 Fri Mar 24 00:19:39 2006 +++ php-src/main/streams/streams.c Fri Mar 24 19:22:24 2006 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c,v 1.109 2006/03/24 00:19:39 pollita Exp $ */ +/* $Id: streams.c,v 1.110 2006/03/24 19:22:24 pollita Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -1171,6 +1171,73 @@ } } +PHPAPI UChar *php_stream_get_record_unicode(php_stream *stream, size_t maxlen, size_t maxchars, size_t *returned_len, UChar *delim, size_t delim_len TSRMLS_DC) +{ + UChar *e, *buf; + size_t toread; + int skip = 0; + + if (!php_stream_reads_unicode(stream)) { + return NULL; + } + + php_stream_fill_read_buffer(stream, maxlen TSRMLS_CC); + + if (delim_len == 0 || !delim) { + toread = maxlen; + } else { + if (delim_len == 1) { + e = u_memchr(stream->readbuf.u + stream->readpos, *delim, stream->writepos - stream->readpos); + } else { + e = u_strFindFirst(stream->readbuf.u + stream->readpos, stream->writepos - stream->readpos, delim, delim_len); + } + + if (!e) { + toread = maxlen; + } else { + toread = e - (stream->readbuf.u + stream->readpos); + skip = 1; + } + } + + if (toread > maxlen && maxlen > 0) { + toread = maxlen; + } + + if (U16_IS_SURROGATE(stream->readbuf.u[stream->readpos + toread - 1]) && + U16_IS_SURROGATE_LEAD(stream->readbuf.u[stream->readpos + toread - 1])) { + /* Don't orphan */ + toread--; + } + + if (maxchars > 0) { + size_t ulen = u_countChar32(stream->readbuf.u + stream->readpos, toread); + + if (maxchars > ulen) { + int i = 0; + UChar *s = stream->readbuf.u + stream->readpos; + + U16_FWD_N(s, i, toread, maxchars); + toread = i; + } + } + + buf = eumalloc(toread + 1); + *returned_len = php_stream_read_unicode(stream, buf, toread); + + if (*returned_len >= 0) { + if (skip) { + stream->readpos += delim_len; + stream->position += delim_len; + } + buf[*returned_len] = 0; + return buf; + } else { + efree(buf); + return NULL; + } +} + /* Writes a buffer directly to a stream, using multiple of the chunk size */ static size_t _php_stream_write_buffer(php_stream *stream, int buf_type, zstr buf, int buflen TSRMLS_DC) {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php