BZip2Stream.st
author ca
Tue, 25 Jun 2002 10:34:31 +0200
changeset 1060 a59e60d44eb4
parent 1059 b47e4eff5543
child 1061 be824dc5e0e7
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
     1
"{ Package: 'ca:Compress' }"
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
     2
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
     3
CompressionStream subclass:#BZipStream
1060
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
     4
        instanceVariableNames:''
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
     5
        classVariableNames:''
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
     6
        poolDictionaries:''
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
     7
        category:'A-Compress'
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
     8
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
     9
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    10
!BZipStream primitiveDefinitions!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    11
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    12
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    13
/*
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    14
 * includes, defines, structure definitions
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    15
 * and typedefs come here.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    16
 */
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    17
1060
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
    18
#include "bzlib/bzlib.h"
1059
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    19
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    20
typedef enum {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    21
          e_opmode_unspecified
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    22
        , e_opmode_deflate
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    23
        , e_opmode_inflate
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    24
} e_opmode;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    25
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    26
typedef struct {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    27
        bz_stream       stream;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    28
        char *          in_ref;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    29
        char *          out_ref;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    30
        unsigned int    out_total;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    31
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    32
        e_opmode        op_mode;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    33
} zstream_s;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    34
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    35
%}
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    36
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    37
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    38
!BZipStream methodsFor:'low level'!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    39
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    40
zclose
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    41
    "low level close of the zip stream
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    42
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    43
    onStream := mode := nil.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    44
    hitEOF   := true.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    45
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    46
    zstream ifNil:[^ self].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    47
    self unregisterForFinalization.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    48
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    49
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    50
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    51
    if( _zstreamObj != nil )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    52
    {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    53
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    54
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    55
        __INST(zstream) = nil;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    56
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    57
        if( _zstream->stream.state != NULL )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    58
        {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    59
            if( _zstream->op_mode == e_opmode_inflate )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    60
                BZ2_bzDecompressEnd( & _zstream->stream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    61
            else
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    62
                BZ2_bzCompressEnd( & _zstream->stream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    63
        }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    64
        free( _zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    65
    }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    66
%}.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    67
    zstream := nil.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    68
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    69
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    70
zdeflate
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    71
    "low level - deflate
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    72
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    73
    |errorNo|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    74
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    75
    errorNo := nil.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    76
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    77
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    78
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    79
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    80
    if( _zstreamObj != nil )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    81
    {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    82
        int          _errorNo, _action;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    83
        unsigned int _bfsize;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    84
        zstream_s *  _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    85
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    86
        if( _zstream->op_mode != e_opmode_deflate )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    87
            RETURN( nil );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    88
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    89
        _bfsize = _zstream->out_total;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    90
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    91
        if( _zstream->stream.state == NULL )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    92
        {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    93
            _zstream->op_mode = e_opmode_unspecified;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    94
            RETURN( nil );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    95
        }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    96
        _action = (__INST(hitEOF) == true) ? BZ_FINISH : BZ_RUN;        
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    97
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    98
        _zstream->stream.avail_out = _bfsize;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
    99
        _zstream->stream.next_out  = _zstream->out_ref;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   100
        
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   101
        _errorNo = BZ2_bzCompress( & _zstream->stream, _action );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   102
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   103
        if( _errorNo == BZ_STREAM_END )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   104
        {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   105
            _zstream->stream.avail_in = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   106
            _zstream->stream.next_in  = NULL;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   107
            _errorNo = BZ2_bzCompressEnd( & _zstream->stream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   108
        }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   109
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   110
        if(   (_errorNo == BZ_OK)
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   111
           || (_errorNo == BZ_RUN_OK)
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   112
           || (_errorNo == BZ_FINISH_OK)
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   113
          )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   114
        {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   115
            if(   (_zstream->stream.avail_out != _bfsize)
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   116
               || (_zstream->stream.avail_in  != 0)
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   117
              )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   118
              RETURN( true );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   119
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   120
            RETURN( false );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   121
        }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   122
        errorNo = __MKSMALLINT( _errorNo );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   123
    }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   124
%}.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   125
    errorNo ifNil:[
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   126
        zstream ifNil:[self errorNotOpen].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   127
        self invalidArguments.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   128
    ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   129
    self zerror:errorNo.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   130
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   131
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   132
zdeflateInit
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   133
    "low level - open for reading
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   134
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   135
    |errorNo blockSize100k workFactor|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   136
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   137
    errorNo       := nil.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   138
    blockSize100k := BlockSize.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   139
    workFactor    := 30.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   140
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   141
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   142
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   143
    if( (_zstreamObj != nil) && __bothSmallInteger(blockSize100k, workFactor) )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   144
    {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   145
        int         _errorNo;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   146
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   147
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   148
        _zstream->op_mode = e_opmode_deflate;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   149
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   150
        _errorNo = BZ2_bzCompressInit( & _zstream->stream
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   151
                                     , __intVal( blockSize100k ), 0, __intVal( workFactor ) );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   152
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   153
        if( _errorNo == BZ_OK )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   154
            RETURN( self );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   155
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   156
        errorNo = __MKSMALLINT( _errorNo );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   157
    }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   158
%}.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   159
    errorNo ifNil:[
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   160
        zstream ifNil:[ self errorNotOpen ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   161
        self invalidArguments .
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   162
    ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   163
    self zerror:errorNo.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   164
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   165
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   166
zget_avail_out
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   167
    "low level - get the number of available out bytes
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   168
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   169
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   170
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   171
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   172
    if( _zstreamObj != nil )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   173
    {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   174
        unsigned int _count;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   175
        zstream_s *  _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   176
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   177
        _count = _zstream->out_total - _zstream->stream.avail_out;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   178
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   179
        RETURN( __MKSMALLINT (_count) );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   180
    }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   181
%}.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   182
    self errorNotOpen.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   183
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   184
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   185
zinflate
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   186
    "low level - inflate
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   187
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   188
    |errorNo|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   189
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   190
    errorNo := nil.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   191
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   192
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   193
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   194
    if( _zstreamObj != nil )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   195
    {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   196
        int         _errorNo, _count;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   197
        zstream_s * _zstream;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   198
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   199
        _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   200
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   201
        if( _zstream->op_mode != e_opmode_inflate )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   202
            RETURN( nil );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   203
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   204
        if( _zstream->stream.state == NULL )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   205
        {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   206
            _zstream->op_mode = e_opmode_unspecified;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   207
            RETURN( nil );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   208
        }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   209
        if( _zstream->stream.avail_in == 0 )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   210
            RETURN( __MKSMALLINT (0) );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   211
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   212
        _zstream->stream.avail_out = _zstream->out_total;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   213
        _zstream->stream.next_out  = _zstream->out_ref;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   214
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   215
        _errorNo = BZ2_bzDecompress( & _zstream->stream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   216
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   217
        if( _errorNo == BZ_STREAM_END )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   218
            _errorNo = BZ2_bzDecompressEnd( & _zstream->stream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   219
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   220
        if( _errorNo == BZ_OK )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   221
        {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   222
            _count = _zstream->out_total - _zstream->stream.avail_out;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   223
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   224
            RETURN( __MKSMALLINT (_count) );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   225
        }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   226
        errorNo = __MKSMALLINT( _errorNo );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   227
    }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   228
%}.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   229
    errorNo ifNil:[ self errorNotOpen ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   230
    self zerror:errorNo.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   231
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   232
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   233
zinflateInit
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   234
    "low level - inflateInit
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   235
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   236
    |errorNo|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   237
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   238
    errorNo := nil.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   239
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   240
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   241
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   242
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   243
    if( _zstreamObj != nil )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   244
    {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   245
        int         _errorNo;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   246
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   247
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   248
        _zstream->op_mode = e_opmode_inflate;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   249
        _errorNo = BZ2_bzDecompressInit( & _zstream->stream, 0, 1 );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   250
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   251
        if( _errorNo == BZ_OK )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   252
            RETURN( self );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   253
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   254
        _zstream->stream.avail_in = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   255
        errorNo = __MKSMALLINT( _errorNo );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   256
    }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   257
%}.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   258
    errorNo ifNil:[ self errorNotOpen ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   259
    self zerror:errorNo.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   260
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   261
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   262
zopen
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   263
    "low level - opens the zip stream
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   264
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   265
    |outTotal|
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   266
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   267
    outTotal := outputBytes size.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   268
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   269
    zstream_s * _zstream = (zstream_s *) malloc( sizeof(zstream_s) );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   270
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   271
    if( _zstream )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   272
    {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   273
        OBJ     _zobj   = __MKEXTERNALADDRESS( _zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   274
        OBJ     _outObj = __INST( outputBytes );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   275
        OBJ     _inpObj = __INST( inputBytes  );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   276
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   277
        _zstream->in_ref           = (char *) __externalBytesAddress( _inpObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   278
        _zstream->stream.next_in   = NULL;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   279
        _zstream->stream.avail_in  = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   280
        _zstream->stream.total_in_lo32  = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   281
        _zstream->stream.total_in_hi32  = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   282
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   283
        _zstream->out_total        = __intVal( outTotal );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   284
        _zstream->out_ref          = (char *) __externalBytesAddress( _outObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   285
        _zstream->stream.next_out  = _zstream->out_ref;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   286
        _zstream->stream.avail_out = _zstream->out_total;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   287
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   288
        _zstream->stream.total_out_lo32 = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   289
        _zstream->stream.total_out_hi32 = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   290
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   291
        _zstream->stream.bzalloc   = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   292
        _zstream->stream.bzfree    = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   293
        _zstream->stream.opaque    = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   294
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   295
        _zstream->op_mode          = e_opmode_unspecified;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   296
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   297
        __INST (zstream) = _zobj;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   298
        __STORE(self, _zobj);
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   299
    }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   300
%}.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   301
!
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   302
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   303
zset_avail_in:count
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   304
    "set the 'avail_in' and compute the crc
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   305
    "
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   306
%{
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   307
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   308
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   309
    if( (_zstreamObj != nil) && __isSmallInteger(count) )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   310
    {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   311
        int         _count;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   312
        zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   313
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   314
        if( (_count = __intVal( count )) > 0 )
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   315
        {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   316
            char * _in_ref = _zstream->in_ref;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   317
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   318
            _zstream->stream.avail_in = _count;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   319
            _zstream->stream.next_in  = _in_ref;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   320
        } else {
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   321
            _zstream->stream.avail_in = 0;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   322
            _zstream->stream.next_in  = NULL;
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   323
        }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   324
        RETURN( self );
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   325
    }
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   326
%}.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   327
    zstream ifNil:[ self errorNotOpen ].
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   328
    self invalidArguments.
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   329
! !
b47e4eff5543 *** empty log message ***
ca
parents:
diff changeset
   330