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