diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 6fc078e4b5..2aa7dc1274 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,24 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-03-16 13:56 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/contrib/Makefile + + harbour/contrib/hbbzip2 + + harbour/contrib/hbbzip2/hbbzip2.c + + harbour/contrib/hbbzip2/hbbzip2.ch + + harbour/contrib/hbbzip2/Makefile + + added very simple wrapper to BZIP2 compression + Now only buffer compression functions. + HB_BZ2_VERSION() -> + HB_BZ2_COMPRESSBOUND( | ) -> + HB_BZ2_UNCOMPRESSLEN( , [<@nResult>] ) + -> or 0 on error + HB_BZ2_COMPRESS( , [|<@cBuffer>], [<@nResult>], + [] ) -> or NIL on Error + HB_BZ2_UNCOMPRESS( , [|<@cBuffer>], + [<@nResult>] ) -> or NIL + on Error + 2010-03-16 01:15 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + contrib/hbide/resources/arguments.png + contrib/hbide/resources/description.png diff --git a/harbour/contrib/Makefile b/harbour/contrib/Makefile index 4c5af7cbf7..50fcf6bbab 100644 --- a/harbour/contrib/Makefile +++ b/harbour/contrib/Makefile @@ -8,6 +8,7 @@ ROOT := ../ DIRS := \ gtwvg \ hbbtree \ + hbbzip2 \ hbclipsm \ hbct \ hbfoxpro \ diff --git a/harbour/contrib/hbbzip2/Makefile b/harbour/contrib/hbbzip2/Makefile new file mode 100644 index 0000000000..266f6abb86 --- /dev/null +++ b/harbour/contrib/hbbzip2/Makefile @@ -0,0 +1,18 @@ +# +# $Id$ +# + +ROOT := ../../ + +include $(TOP)$(ROOT)config/global.mk + +LIBNAME := hbbzip2 + +C_SOURCES := \ + hbbzip2.c \ + +PRG_HEADERS := \ + hbbzip2.ch + +include $(TOP)$(ROOT)config/header.mk +include $(TOP)$(ROOT)config/lib.mk diff --git a/harbour/contrib/hbbzip2/hbbzip2.c b/harbour/contrib/hbbzip2/hbbzip2.c new file mode 100644 index 0000000000..71c4e8a0d8 --- /dev/null +++ b/harbour/contrib/hbbzip2/hbbzip2.c @@ -0,0 +1,340 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * BZIP2 functions wrapper + * + * Copyright 2010 Przemyslaw Czerpak + * www - http://www.harbour-project.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#include "hbapi.h" + +#include "hbapiitm.h" +#include "hbapierr.h" + +#include + +#include "hbbzip2.ch" + +static HB_SIZE hb_bz2CompressBound( HB_SIZE ulLen ) +{ + return ulLen + ulLen / 100 + 600; +} + +static int hb_bz2Compress( const char * szSrc, HB_SIZE nSrc, + char * szDst, HB_SIZE * pnDst, int iBlockSize ) +{ + bz_stream stream; + int iResult; + + memset( &stream, 0, sizeof( stream ) ); + + stream.next_in = ( char * ) szSrc; + stream.avail_in = ( unsigned int ) nSrc; + + stream.next_out = szDst; + stream.avail_out = *pnDst; + +/* + stream.bzalloc = Z_NULL; + stream.bzfree = Z_NULL; + stream.opaque = NULL; +*/ + + iResult = BZ2_bzCompressInit( &stream, iBlockSize, 0, 0 ); + if( iResult == BZ_OK ) + { + do + iResult = BZ2_bzCompress( &stream, BZ_FINISH ); + while( iResult == BZ_FINISH_OK ); + + if( iResult == BZ_STREAM_END ) + { + *pnDst = ( ( HB_SIZE ) stream.total_out_hi32 << 32 ) | + stream.total_out_lo32; + iResult = BZ_OK; + } + + BZ2_bzCompressEnd( &stream ); + } + + return iResult; +} + +static HB_SIZE hb_bz2UncompressedSize( const char * szSrc, HB_SIZE nLen, + int * piResult ) +{ + char buffer[ 1024 ]; + bz_stream stream; + HB_SIZE nDest = 0; + + memset( &stream, 0, sizeof( stream ) ); + + stream.next_in = ( char * ) szSrc; + stream.avail_in = ( unsigned int ) nLen; + +/* + stream.bzalloc = Z_NULL; + stream.bzfree = Z_NULL; + stream.opaque = NULL; +*/ + + *piResult = BZ2_bzDecompressInit( &stream, 0, 0 ); + if( *piResult == BZ_OK ) + { + do + { + stream.next_out = buffer; + stream.avail_out = sizeof( buffer ); + *piResult = BZ2_bzDecompress( &stream ); + } + while( *piResult == BZ_OK ); + + if( *piResult == BZ_STREAM_END ) + { + nDest = ( ( HB_SIZE ) stream.total_out_hi32 << 32 ) | + stream.total_out_lo32; + *piResult = BZ_OK; + } + BZ2_bzDecompressEnd( &stream ); + } + + return nDest; +} + +static int hb_bz2Uncompress( const char * szSrc, HB_SIZE nSrc, + char * szDst, HB_SIZE * pnDst ) +{ + bz_stream stream; + int iResult; + + memset( &stream, 0, sizeof( stream ) ); + + stream.next_in = ( char * ) szSrc; + stream.avail_in = ( unsigned int ) nSrc; + + stream.next_out = szDst; + stream.avail_out = *pnDst; + +/* + stream.bzalloc = Z_NULL; + stream.bzfree = Z_NULL; + stream.opaque = NULL; +*/ + + iResult = BZ2_bzDecompressInit( &stream, 0, 0 ); + if( iResult == BZ_OK ) + { + do + iResult = BZ2_bzDecompress( &stream ); + while( iResult == BZ_OK ); + + if( iResult == BZ_STREAM_END ) + { + *pnDst = ( ( HB_SIZE ) stream.total_out_hi32 << 32 ) | + stream.total_out_lo32; + iResult = BZ_OK; + } + BZ2_bzDecompressEnd( &stream ); + } + + return iResult; +} + +/* + * HB_BZ2_VERSION() -> + */ +HB_FUNC( HB_BZ2_VERSION ) +{ + hb_retc( BZ2_bzlibVersion() ); +} + +/* + * HB_BZ2_COMPRESSBOUND( | ) -> + */ +HB_FUNC( HB_BZ2_COMPRESSBOUND ) +{ + if( HB_ISCHAR( 1 ) ) + hb_retnint( hb_bz2CompressBound( hb_parclen( 1 ) ) ); + else if( HB_ISNUM( 1 ) ) + hb_retnint( hb_bz2CompressBound( ( HB_SIZE ) hb_parnint( 1 ) ) ); + else + hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +/* + * HB_BZ2_UNCOMPRESSLEN( , [<@nResult>] ) -> or 0 on error + */ +HB_FUNC( HB_BZ2_UNCOMPRESSLEN ) +{ + HB_SIZE ulLen = hb_parclen( 1 ); + int iResult = 0; + + hb_retnint( ulLen ? + hb_bz2UncompressedSize( hb_parc( 1 ), ulLen, &iResult ) : 0 ); + hb_storni( iResult, 2 ); +} + +/* + * HB_BZ2_COMPRESS( , [|<@cBuffer>], [<@nResult>], [] ) + * => or NIL on Error + */ +HB_FUNC( HB_BZ2_COMPRESS ) +{ + const char * szData = hb_parc( 1 ); + if( szData ) + { + HB_SIZE ulLen = hb_parclen( 1 ); + + if( ulLen ) + { + PHB_ITEM pBuffer = HB_ISBYREF( 2 ) ? hb_param( 2, HB_IT_STRING ) : NULL; + HB_SIZE ulDstLen; + char * pDest; + int iResult; + + if( pBuffer ) + { + if( !hb_itemGetWriteCL( pBuffer, &pDest, &ulDstLen ) ) + pDest = NULL; + } + else + { + ulDstLen = HB_ISNUM( 2 ) ? ( HB_SIZE ) hb_parnint( 2 ) : + ( HB_SIZE ) hb_bz2CompressBound( ulLen ); + pDest = ( char * ) hb_xalloc( ulDstLen + 1 ); + } + + if( pDest ) + { + iResult = hb_bz2Compress( szData, ulLen, pDest, &ulDstLen, + hb_parnidef( 4, HB_BZ_COMPRESSION_DEFAULT ) ); + if( !pBuffer ) + { + if( iResult == BZ_OK ) + hb_retclen_buffer( pDest, ulDstLen ); + else + hb_xfree( pDest ); + } + else if( iResult == BZ_OK ) + hb_retclen( pDest, ulDstLen ); + } + else + iResult = BZ_MEM_ERROR; + + hb_storni( iResult, 3 ); + } + else + { + hb_retc_null(); + hb_storni( BZ_OK, 3 ); + } + } + else + hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} + +/* + * HB_BZ2_UNCOMPRESS( , [|<@cBuffer>], [<@nResult>] ) + * => or NIL on Error + */ +HB_FUNC( HB_BZ2_UNCOMPRESS ) +{ + PHB_ITEM pBuffer = HB_ISBYREF( 2 ) ? hb_param( 2, HB_IT_STRING ) : NULL; + const char * szData = hb_parc( 1 ); + + if( szData ) + { + HB_SIZE ulLen = hb_parclen( 1 ); + + if( ulLen ) + { + HB_SIZE ulDstLen; + char * pDest; + int iResult = BZ_OK; + + if( pBuffer ) + { + if( !hb_itemGetWriteCL( pBuffer, &pDest, &ulDstLen ) ) + iResult = BZ_MEM_ERROR; + } + else + { + ulDstLen = HB_ISNUM( 2 ) ? ( HB_SIZE ) hb_parnint( 2 ) : + hb_bz2UncompressedSize( szData, ulLen, &iResult ); + if( iResult == BZ_OK ) + { + pDest = ( char * ) hb_xalloc( ulDstLen + 1 ); + if( !pDest ) + iResult = BZ_MEM_ERROR; + } + } + + if( iResult == BZ_OK ) + { + iResult = hb_bz2Uncompress( szData, ulLen, pDest, &ulDstLen ); + + if( !pBuffer ) + { + if( iResult == BZ_OK ) + hb_retclen_buffer( pDest, ulDstLen ); + else + hb_xfree( pDest ); + } + else if( iResult == BZ_OK ) + hb_retclen( pDest, ulDstLen ); + } + hb_storni( iResult, 3 ); + } + else + { + hb_retc_null(); + hb_storni( BZ_OK, 3 ); + } + } + else + hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); +} diff --git a/harbour/contrib/hbbzip2/hbbzip2.ch b/harbour/contrib/hbbzip2/hbbzip2.ch new file mode 100644 index 0000000000..7f535b9348 --- /dev/null +++ b/harbour/contrib/hbbzip2/hbbzip2.ch @@ -0,0 +1,75 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * BZIP2 header file + * + * Copyright 2010 Przemyslaw Czerpak + * www - http://www.harbour-project.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#ifndef HB_BZIP2_CH_ +#define HB_BZIP2_CH_ + +#define HB_BZ_OK 0 +#define HB_BZ_RUN_OK 1 +#define HB_BZ_FLUSH_OK 2 +#define HB_BZ_FINISH_OK 3 +#define HB_BZ_STREAM_END 4 +#define HB_BZ_SEQUENCE_ERROR (-1) +#define HB_BZ_PARAM_ERROR (-2) +#define HB_BZ_MEM_ERROR (-3) +#define HB_BZ_DATA_ERROR (-4) +#define HB_BZ_DATA_ERROR_MAGIC (-5) +#define HB_BZ_IO_ERROR (-6) +#define HB_BZ_UNEXPECTED_EOF (-7) +#define HB_BZ_OUTBUFF_FULL (-8) +#define HB_BZ_CONFIG_ERROR (-9) + +#define HB_BZ_COMPRESSION_SPEED 1 +#define HB_BZ_COMPRESSION_SIZE 9 +#define HB_BZ_COMPRESSION_DEFAULT 9 + +#endif /* HB_BZIP2_CH_ */