pollita Tue Jul 20 01:26:33 2004 EDT Added files: /php-src/ext/bz2 bz2_filter.c /php-src/ext/bz2/tests bz2_filter_compress.phpt bz2_filter_decompress.phpt
Modified files: /php-src/ext/bz2 bz2.c config.m4 php_bz2.h config.w32 bz2.dsp /php-src NEWS Log: Add bz2 stream filter support
http://cvs.php.net/diff.php/php-src/ext/bz2/bz2.c?r1=1.6&r2=1.7&ty=u Index: php-src/ext/bz2/bz2.c diff -u php-src/ext/bz2/bz2.c:1.6 php-src/ext/bz2/bz2.c:1.7 --- php-src/ext/bz2/bz2.c:1.6 Thu Jan 8 03:14:18 2004 +++ php-src/ext/bz2/bz2.c Tue Jul 20 01:26:33 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: bz2.c,v 1.6 2004/01/08 08:14:18 andi Exp $ */ +/* $Id: bz2.c,v 1.7 2004/07/20 05:26:33 pollita Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -243,13 +243,14 @@ PHP_MINIT_FUNCTION(bz2) { php_register_url_stream_wrapper("compress.bzip2", &php_stream_bzip2_wrapper TSRMLS_CC); - + php_stream_filter_register_factory("bzip2.*", &php_bz2_filter_factory TSRMLS_CC); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(bz2) { php_unregister_url_stream_wrapper("compress.bzip2" TSRMLS_CC); + php_stream_filter_unregister_factory("bzip2.*" TSRMLS_CC); return SUCCESS; } @@ -258,6 +259,8 @@ { php_info_print_table_start(); php_info_print_table_row(2, "BZip2 Support", "Enabled"); + php_info_print_table_row(2, "Stream Wrapper support", "compress.bz2://"); + php_info_print_table_row(2, "Stream Filter support", "bzip2.decompress, bzip2.compress"); php_info_print_table_row(2, "BZip2 Version", (char *) BZ2_bzlibVersion()); php_info_print_table_end(); } http://cvs.php.net/diff.php/php-src/ext/bz2/config.m4?r1=1.3&r2=1.4&ty=u Index: php-src/ext/bz2/config.m4 diff -u php-src/ext/bz2/config.m4:1.3 php-src/ext/bz2/config.m4:1.4 --- php-src/ext/bz2/config.m4:1.3 Wed Jan 21 00:04:30 2004 +++ php-src/ext/bz2/config.m4 Tue Jul 20 01:26:33 2004 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4,v 1.3 2004/01/21 05:04:30 sniper Exp $ +dnl $Id: config.m4,v 1.4 2004/07/20 05:26:33 pollita Exp $ dnl PHP_ARG_WITH(bz2, for BZip2 support, @@ -35,6 +35,6 @@ -L$BZIP_DIR/lib ]) - PHP_NEW_EXTENSION(bz2, bz2.c, $ext_shared) + PHP_NEW_EXTENSION(bz2, bz2.c bz2_filter.c, $ext_shared) PHP_SUBST(BZ2_SHARED_LIBADD) fi http://cvs.php.net/diff.php/php-src/ext/bz2/php_bz2.h?r1=1.5&r2=1.6&ty=u Index: php-src/ext/bz2/php_bz2.h diff -u php-src/ext/bz2/php_bz2.h:1.5 php-src/ext/bz2/php_bz2.h:1.6 --- php-src/ext/bz2/php_bz2.h:1.5 Mon Jan 12 11:30:55 2004 +++ php-src/ext/bz2/php_bz2.h Tue Jul 20 01:26:33 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_bz2.h,v 1.5 2004/01/12 16:30:55 martin Exp $ */ +/* $Id: php_bz2.h,v 1.6 2004/07/20 05:26:33 pollita Exp $ */ #ifndef PHP_BZ2_H #define PHP_BZ2_H @@ -62,8 +62,15 @@ #define php_stream_bz2open_from_BZFILE(bz, mode, innerstream) _php_stream_bz2open_from_BZFILE((bz), (mode), (innerstream) STREAMS_CC TSRMLS_CC) #define php_stream_bz2open(wrapper, path, mode, options, opened_path) _php_stream_bz2open((wrapper), (path), (mode), (options), (opened_path), NULL STREAMS_CC TSRMLS_CC) +php_stream_filter_factory php_bz2_filter_factory; extern php_stream_ops php_stream_bz2io_ops; #define PHP_STREAM_IS_BZIP2 &php_stream_bz2io_ops + +/* 400kb */ +#define PHP_BZ2_FILTER_DEFAULT_BLOCKSIZE 4 + +/* BZ2 Internal Default */ +#define PHP_BZ2_FILTER_DEFAULT_WORKFACTOR 0 #endif http://cvs.php.net/diff.php/php-src/ext/bz2/config.w32?r1=1.3&r2=1.4&ty=u Index: php-src/ext/bz2/config.w32 diff -u php-src/ext/bz2/config.w32:1.3 php-src/ext/bz2/config.w32:1.4 --- php-src/ext/bz2/config.w32:1.3 Wed Apr 14 09:56:18 2004 +++ php-src/ext/bz2/config.w32 Tue Jul 20 01:26:33 2004 @@ -1,4 +1,4 @@ -// $Id: config.w32,v 1.3 2004/04/14 13:56:18 edink Exp $ +// $Id: config.w32,v 1.4 2004/07/20 05:26:33 pollita Exp $ // vim:ft=javascript ARG_WITH("bz2", "BZip2", "no"); @@ -6,7 +6,7 @@ if (PHP_BZ2 != "no") { if (CHECK_LIB("libbz2.lib", "bz2", PHP_BZ2) && CHECK_HEADER_ADD_INCLUDE("bzlib.h", "CFLAGS_BZ2")) { - EXTENSION("bz2", "bz2.c"); + EXTENSION("bz2", "bz2.c bz2_filter.c"); AC_DEFINE('HAVE_BZ2', 1, 'Have BZ2 library'); // BZ2 extension does this slightly differently from others if (PHP_BZ2_SHARED) { http://cvs.php.net/diff.php/php-src/ext/bz2/bz2.dsp?r1=1.2&r2=1.3&ty=u Index: php-src/ext/bz2/bz2.dsp diff -u php-src/ext/bz2/bz2.dsp:1.2 php-src/ext/bz2/bz2.dsp:1.3 --- php-src/ext/bz2/bz2.dsp:1.2 Sat Jan 17 07:59:12 2004 +++ php-src/ext/bz2/bz2.dsp Tue Jul 20 01:26:33 2004 @@ -1,108 +1,112 @@ -# Microsoft Developer Studio Project File - Name="bz2" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=bz2 - Win32 Debug_TS -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "bz2.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "bz2.mak" CFG="bz2 - Win32 Debug_TS" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "bz2 - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "bz2 - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "bz2 - Win32 Release_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release_TS" -# PROP BASE Intermediate_Dir "Release_TS" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release_TS" -# PROP Intermediate_Dir "Release_TS" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BZ2_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\..\php_build\includes" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "COMPILE_DL_BZ2" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_BZ2=1 /D "PHP_BZ2_EXPORTS" /FR /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x407 /d "NDEBUG" -# ADD RSC /l 0x407 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 libbz2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php5ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_bz2.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" /libpath:"..\..\..\php_build\release" - -!ELSEIF "$(CFG)" == "bz2 - Win32 Debug_TS" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug_TS" -# PROP BASE Intermediate_Dir "Debug_TS" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug_TS" -# PROP Intermediate_Dir "Debug_TS" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BZ2_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\..\php_build\includes" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "COMPILE_DL_BZ2" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_BZ2=1 /D "PHP_BZ2_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x407 /d "_DEBUG" -# ADD RSC /l 0x407 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 php5ts_debug.lib libbz2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_bz2.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" /libpath:"..\..\..\php_build\release" - -!ENDIF - -# Begin Target - -# Name "bz2 - Win32 Release_TS" -# Name "bz2 - Win32 Debug_TS" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\bz2.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\php_bz2.h -# End Source File -# End Group -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="bz2" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=bz2 - Win32 Debug_TS +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "bz2.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "bz2.mak" CFG="bz2 - Win32 Debug_TS" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "bz2 - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "bz2 - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "bz2 - Win32 Release_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release_TS" +# PROP BASE Intermediate_Dir "Release_TS" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_TS" +# PROP Intermediate_Dir "Release_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BZ2_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\..\php_build\includes" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "COMPILE_DL_BZ2" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_BZ2=1 /D "PHP_BZ2_EXPORTS" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 libbz2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php5ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_bz2.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" /libpath:"..\..\..\php_build\release" + +!ELSEIF "$(CFG)" == "bz2 - Win32 Debug_TS" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug_TS" +# PROP BASE Intermediate_Dir "Debug_TS" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug_TS" +# PROP Intermediate_Dir "Debug_TS" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BZ2_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\..\php_build\includes" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "COMPILE_DL_BZ2" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D HAVE_BZ2=1 /D "PHP_BZ2_EXPORTS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 php5ts_debug.lib libbz2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_bz2.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" /libpath:"..\..\..\php_build\release" + +!ENDIF + +# Begin Target + +# Name "bz2 - Win32 Release_TS" +# Name "bz2 - Win32 Debug_TS" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\bz2.c +# End Source File +# Begin Source File + +SOURCE=.\bz2_filter.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\php_bz2.h +# End Source File +# End Group +# End Target +# End Project http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1767&r2=1.1768&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.1767 php-src/NEWS:1.1768 --- php-src/NEWS:1.1767 Mon Jul 19 10:55:34 2004 +++ php-src/NEWS Tue Jul 20 01:26:33 2004 @@ -6,6 +6,7 @@ - Fixed bug #29109 (SoapFault exception: [WSDL] Out of memory). (Dmitry) - Fixed bug #29061 (soap extension segfaults). (Dmitry) - Added zlib stream filter suport. (Sara) +- Added bz2 stream filter support. (Sara) - Changed the implementation of TRUE, FALSE, and NULL from constants to keywords. (Marcus) - Fixed ZTS destruction. (Marcus) http://cvs.php.net/co.php/php-src/ext/bz2/bz2_filter.c?r=1.1&p=1 Index: php-src/ext/bz2/bz2_filter.c +++ php-src/ext/bz2/bz2_filter.c /* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2004 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. | +----------------------------------------------------------------------+ | Authors: Sara Golemon ([EMAIL PROTECTED]) | +----------------------------------------------------------------------+ */ /* $Id: bz2_filter.c,v 1.1 2004/07/20 05:26:33 pollita Exp $ */ #include "php.h" #include "php_bz2.h" /* {{{ data structure */ typedef struct _php_bz2_filter_data { int persistent; bz_stream strm; char *inbuf; size_t inbuf_len; char *outbuf; size_t outbuf_len; } php_bz2_filter_data; /* }}} */ /* {{{ Memory management wrappers */ static void *php_bz2_alloc(void *opaque, int items, int size) { return (void *)pemalloc(items * size, ((php_bz2_filter_data*)opaque)->persistent); } static void php_bz2_free(void *opaque, void *address) { pefree((void *)address, ((php_bz2_filter_data*)opaque)->persistent); } /* }}} */ /* {{{ bzip2.decompress filter implementation */ static php_stream_filter_status_t php_bz2_decompress_filter( php_stream *stream, php_stream_filter *thisfilter, php_stream_bucket_brigade *buckets_in, php_stream_bucket_brigade *buckets_out, size_t *bytes_consumed, int flags TSRMLS_DC) { php_bz2_filter_data *data; php_stream_bucket *bucket; size_t consumed = 0; int status; php_stream_filter_status_t exit_status = PSFS_FEED_ME; bz_stream *streamp; if (!thisfilter || !thisfilter->abstract) { /* Should never happen */ return PSFS_ERR_FATAL; } data = (php_bz2_filter_data *)(thisfilter->abstract); streamp = &(data->strm); while (buckets_in->head) { size_t bin = 0, desired; bucket = php_stream_bucket_make_writeable(buckets_in->head TSRMLS_CC); while (bin < bucket->buflen) { desired = bucket->buflen - bin; if (desired > data->inbuf_len) { desired = data->inbuf_len; } memcpy(data->strm.next_in, bucket->buf + bin, desired); data->strm.avail_in = desired; status = BZ2_bzDecompress(&(data->strm)); if (status != BZ_OK && status != BZ_STREAM_END) { /* Something bad happened */ php_stream_bucket_delref(bucket TSRMLS_CC); return PSFS_ERR_FATAL; } desired -= data->strm.avail_in; /* desired becomes what we consumed this round through */ data->strm.next_in = data->inbuf; data->strm.avail_in = 0; consumed += desired; bin += desired; if (data->strm.avail_out < data->outbuf_len) { php_stream_bucket *out_bucket; size_t bucketlen = data->outbuf_len - data->strm.avail_out; out_bucket = php_stream_bucket_new(stream, estrndup(data->outbuf, bucketlen), bucketlen, 1, 0 TSRMLS_CC); php_stream_bucket_append(buckets_out, out_bucket TSRMLS_CC); data->strm.avail_out = data->outbuf_len; data->strm.next_out = data->outbuf; exit_status = PSFS_PASS_ON; } } php_stream_bucket_delref(bucket TSRMLS_CC); } if (flags & PSFS_FLAG_FLUSH_CLOSE) { /* Spit it out! */ status = BZ_OK; while (status == BZ_OK) { status = BZ2_bzDecompress(&(data->strm)); if (data->strm.avail_out < data->outbuf_len) { size_t bucketlen = data->outbuf_len - data->strm.avail_out; bucket = php_stream_bucket_new(stream, estrndup(data->outbuf, bucketlen), bucketlen, 1, 0 TSRMLS_CC); php_stream_bucket_append(buckets_out, bucket TSRMLS_CC); data->strm.avail_out = data->outbuf_len; data->strm.next_out = data->outbuf; exit_status = PSFS_PASS_ON; } } } if (bytes_consumed) { *bytes_consumed = consumed; } return exit_status; } static void php_bz2_decompress_dtor(php_stream_filter *thisfilter TSRMLS_DC) { if (thisfilter && thisfilter->abstract) { php_bz2_filter_data *data = thisfilter->abstract; BZ2_bzDecompressEnd(&(data->strm)); pefree(data->inbuf, data->persistent); pefree(data->outbuf, data->persistent); pefree(data, data->persistent); } } static php_stream_filter_ops php_bz2_decompress_ops = { php_bz2_decompress_filter, php_bz2_decompress_dtor, "bzip2.decompress" }; /* }}} */ /* {{{ bzip2.compress filter implementation */ static php_stream_filter_status_t php_bz2_compress_filter( php_stream *stream, php_stream_filter *thisfilter, php_stream_bucket_brigade *buckets_in, php_stream_bucket_brigade *buckets_out, size_t *bytes_consumed, int flags TSRMLS_DC) { php_bz2_filter_data *data; php_stream_bucket *bucket; size_t consumed = 0; int status; php_stream_filter_status_t exit_status = PSFS_FEED_ME; bz_stream *streamp; if (!thisfilter || !thisfilter->abstract) { /* Should never happen */ return PSFS_ERR_FATAL; } data = (php_bz2_filter_data *)(thisfilter->abstract); streamp = &(data->strm); while (buckets_in->head) { size_t bin = 0, desired; bucket = php_stream_bucket_make_writeable(buckets_in->head TSRMLS_CC); while (bin < bucket->buflen) { desired = bucket->buflen - bin; if (desired > data->inbuf_len) { desired = data->inbuf_len; } memcpy(data->strm.next_in, bucket->buf + bin, desired); data->strm.avail_in = desired; status = BZ2_bzCompress(&(data->strm), flags & PSFS_FLAG_FLUSH_CLOSE ? BZ_FINISH : (flags & PSFS_FLAG_FLUSH_INC ? BZ_FLUSH : BZ_RUN)); if (status != BZ_RUN_OK && status != BZ_FLUSH_OK && status != BZ_FINISH_OK) { /* Something bad happened */ php_stream_bucket_delref(bucket TSRMLS_CC); return PSFS_ERR_FATAL; } desired -= data->strm.avail_in; /* desired becomes what we consumed this round through */ data->strm.next_in = data->inbuf; data->strm.avail_in = 0; consumed += desired; bin += desired; if (data->strm.avail_out < data->outbuf_len) { php_stream_bucket *out_bucket; size_t bucketlen = data->outbuf_len - data->strm.avail_out; out_bucket = php_stream_bucket_new(stream, estrndup(data->outbuf, bucketlen), bucketlen, 1, 0 TSRMLS_CC); php_stream_bucket_append(buckets_out, out_bucket TSRMLS_CC); data->strm.avail_out = data->outbuf_len; data->strm.next_out = data->outbuf; exit_status = PSFS_PASS_ON; } } php_stream_bucket_delref(bucket TSRMLS_CC); } if (flags & PSFS_FLAG_FLUSH_CLOSE) { /* Spit it out! */ status = BZ_OUTBUFF_FULL; while (status == BZ_OUTBUFF_FULL) { status = BZ2_bzCompress(&(data->strm), BZ_FINISH); if (data->strm.avail_out < data->outbuf_len) { size_t bucketlen = data->outbuf_len - data->strm.avail_out; bucket = php_stream_bucket_new(stream, estrndup(data->outbuf, bucketlen), bucketlen, 1, 0 TSRMLS_CC); php_stream_bucket_append(buckets_out, bucket TSRMLS_CC); data->strm.avail_out = data->outbuf_len; data->strm.next_out = data->outbuf; exit_status = PSFS_PASS_ON; } } } if (bytes_consumed) { *bytes_consumed = consumed; } return exit_status; } static void php_bz2_compress_dtor(php_stream_filter *thisfilter TSRMLS_DC) { if (thisfilter && thisfilter->abstract) { php_bz2_filter_data *data = thisfilter->abstract; BZ2_bzCompressEnd(&(data->strm)); pefree(data->inbuf, data->persistent); pefree(data->outbuf, data->persistent); pefree(data, data->persistent); } } static php_stream_filter_ops php_bz2_compress_ops = { php_bz2_compress_filter, php_bz2_compress_dtor, "bzip2.compress" }; /* }}} */ /* {{{ bzip2.* common factory */ static php_stream_filter *php_bz2_filter_create(const char *filtername, zval *filterparams, int persistent TSRMLS_DC) { php_stream_filter_ops *fops = NULL; php_bz2_filter_data *data; int status; /* Create this filter */ data = pecalloc(1, sizeof(php_bz2_filter_data), persistent); /* Circular reference */ data->strm.opaque = (void *) data; data->strm.bzalloc = php_bz2_alloc; data->strm.bzfree = php_bz2_free; data->persistent = persistent; data->strm.avail_out = data->outbuf_len = data->inbuf_len = 2048; data->strm.next_in = data->inbuf = (char *) pemalloc(data->inbuf_len, persistent); data->strm.avail_in = 0; data->strm.next_out = data->outbuf = (char *) pemalloc(data->outbuf_len, persistent); if (strcasecmp(filtername, "bzip2.decompress") == 0) { int smallFootprint = 0; if (filterparams) { zval **tmpzval = NULL; if (Z_TYPE_P(filterparams) == IS_ARRAY || Z_TYPE_P(filterparams) == IS_OBJECT) { zend_hash_find(HASH_OF(filterparams), "small", sizeof("small"), (void **) &tmpzval); } else { tmpzval = &filterparams; } if (tmpzval) { SEPARATE_ZVAL(tmpzval); convert_to_boolean_ex(tmpzval); smallFootprint = Z_LVAL_PP(tmpzval); zval_ptr_dtor(tmpzval); } } status = BZ2_bzDecompressInit(&(data->strm), 0, smallFootprint); fops = &php_bz2_decompress_ops; } else if (strcasecmp(filtername, "bzip2.compress") == 0) { int blockSize100k = PHP_BZ2_FILTER_DEFAULT_BLOCKSIZE; int workFactor = PHP_BZ2_FILTER_DEFAULT_WORKFACTOR; if (filterparams) { zval **tmpzval; if (Z_TYPE_P(filterparams) == IS_ARRAY || Z_TYPE_P(filterparams) == IS_OBJECT) { if (zend_hash_find(HASH_OF(filterparams), "blocks", sizeof("blocks"), (void**) &tmpzval) == SUCCESS) { /* How much memory to allocate (1 - 9) x 100kb */ SEPARATE_ZVAL(tmpzval); convert_to_long_ex(tmpzval); if (Z_LVAL_PP(tmpzval) < 1 || Z_LVAL_PP(tmpzval) > 9) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter given for number of blocks to allocate. (%ld)", Z_LVAL_PP(tmpzval)); } else { blockSize100k = Z_LVAL_PP(tmpzval); } zval_ptr_dtor(tmpzval); } if (zend_hash_find(HASH_OF(filterparams), "work", sizeof("work"), (void**) &tmpzval) == SUCCESS) { /* Work Factor (0 - 250) */ SEPARATE_ZVAL(tmpzval); convert_to_long_ex(tmpzval); if (Z_LVAL_PP(tmpzval) < 0 || Z_LVAL_PP(tmpzval) > 250) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter given for work factor. (%ld)", Z_LVAL_PP(tmpzval)); } else { workFactor = Z_LVAL_PP(tmpzval); } zval_ptr_dtor(tmpzval); } } } status = BZ2_bzCompressInit(&(data->strm), blockSize100k, 0, workFactor); fops = &php_bz2_compress_ops; } else { status = BZ_DATA_ERROR; } if (status != BZ_OK) { /* Unspecified (probably strm) error, let stream-filter error do its own whining */ pefree(data->strm.next_in, persistent); pefree(data->strm.next_out, persistent); pefree(data, persistent); return NULL; } return php_stream_filter_alloc(fops, data, persistent); } php_stream_filter_factory php_bz2_filter_factory = { php_bz2_filter_create }; /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */ http://cvs.php.net/co.php/php-src/ext/bz2/tests/bz2_filter_compress.phpt?r=1.1&p=1 Index: php-src/ext/bz2/tests/bz2_filter_compress.phpt +++ php-src/ext/bz2/tests/bz2_filter_compress.phpt --TEST-- bzip2.compress (with convert.base64-encode) --SKIPIF-- <?php if (!extension_loaded("bz2")) print "skip"; ?> --FILE-- <?php /* $Id: bz2_filter_compress.phpt,v 1.1 2004/07/20 05:26:33 pollita Exp $ */ $text = 'I am the very model of a modern major general, I\'ve information vegetable, animal, and mineral.'; $fp = fopen('php://stdout', 'w'); stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE); stream_filter_append($fp, 'convert.base64-encode', STREAM_FILTER_WRITE); fwrite($fp, $text); fclose($fp); ?> --EXPECT-- QlpoNDFBWSZTWRN6QG0AAAoVgECFACA395UgIABIintI1N6mpowIQ0E1MTTAQGYTNcRyMZm5kgW3ib7hVboE7Tmqj3ToGZ5G3q1ZauD2G58hibSck8KS95EEAbx1Cn+LuSKcKEgJvSA2gA== http://cvs.php.net/co.php/php-src/ext/bz2/tests/bz2_filter_decompress.phpt?r=1.1&p=1 Index: php-src/ext/bz2/tests/bz2_filter_decompress.phpt +++ php-src/ext/bz2/tests/bz2_filter_decompress.phpt --TEST-- bzip2.decompress (with convert.base64-decode) --SKIPIF-- <?php if (!extension_loaded("bz2")) print "skip"; ?> --FILE-- <?php /* $Id: bz2_filter_decompress.phpt,v 1.1 2004/07/20 05:26:33 pollita Exp $ */ $text = 'QlpoNDFBWSZTWRN6QG0AAAoVgECFACA395UgIABIintI1N6mpowIQ0E1MTTAQGYTNcRyMZm5kgW3ib7hVboE7Tmqj3ToGZ5G3q1ZauD2G58hibSck8KS95EEAbx1Cn+LuSKcKEgJvSA2gA=='; $fp = fopen('php://stdout', 'w'); stream_filter_append($fp, 'convert.base64-decode', STREAM_FILTER_WRITE); stream_filter_append($fp, 'bzip2.decompress', STREAM_FILTER_WRITE); fwrite($fp, $text); fclose($fp); ?> --EXPECT-- I am the very model of a modern major general, I've information vegetable, animal, and mineral.
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php