ZipStream.st
author Stefan Vogel <sv@exept.de>
Tue, 06 May 2003 18:19:20 +0200
changeset 1195 9d887847d1b6
parent 1193 7688148ec90c
child 1197 c86e858c2893
permissions -rw-r--r--
Add BZipStream and ZipStream
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
1044
c73aee830691 initial checkin
ca
parents:
diff changeset
     2
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
     3
CompressionStream subclass:#ZipStream
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1061
diff changeset
     4
	instanceVariableNames:''
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1061
diff changeset
     5
	classVariableNames:'Z_DEFLATED HEAD_OS_CODE HEAD_RESERVED HEAD_EXTRA_FIELD
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1061
diff changeset
     6
		HEAD_ORIG_NAME HEAD_COMMENT HEAD_CRC GZ_MAGIC_ID'
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1061
diff changeset
     7
	poolDictionaries:''
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1061
diff changeset
     8
	category:'System-Compress'
1044
c73aee830691 initial checkin
ca
parents:
diff changeset
     9
!
c73aee830691 initial checkin
ca
parents:
diff changeset
    10
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    11
!ZipStream primitiveDefinitions!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    12
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    13
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    14
/*
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    15
 * includes, defines, structure definitions
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    16
 * and typedefs come here.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    17
 */
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    18
1060
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
    19
#include "zlib/zlib.h"
a59e60d44eb4 *** empty log message ***
ca
parents: 1059
diff changeset
    20
#include "zlib/zutil.h"
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    21
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
    22
typedef enum {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    23
	  e_opmode_unspecified          /* processing done */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    24
	, e_opmode_deflate              /* running deflate */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    25
	, e_opmode_inflate              /* running inflate */
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
    26
} e_opmode;
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
    27
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    28
typedef struct {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    29
	z_stream        stream;         /* pointer to the external in -stream */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    30
	Bytef *         in_ref;         /* size    of the external in -stream */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    31
	Bytef *         out_ref;        /* pointer to the external out-stream */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    32
	uLong           out_total;      /* size    of the external out-stream */
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    33
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    34
	e_opmode        op_mode;        /* current operational mode */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    35
	uLong           crc_32;         /* keeps the current crc */
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    36
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    37
	Bytef           tail_buff[ 8 ]; /* store the tail in the read modus */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    38
	uLong           tail_size;      /* to check the crc and data length */
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    39
} zstream_s;
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    40
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    41
%}
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    42
! !
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    43
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    44
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    45
!ZipStream class methodsFor:'initialization'!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    46
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    47
initialize
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    48
    "setup class attributes derived from the library
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
    49
    "
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    50
    |z_deflated os_code|
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    51
%{
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    52
    z_deflated = __MKSMALLINT( Z_DEFLATED );
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    53
    os_code    = __MKSMALLINT( OS_CODE );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    54
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    55
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    56
    Z_DEFLATED            := z_deflated.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    57
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
    58
    HEAD_OS_CODE          := os_code.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    59
    HEAD_RESERVED         := 16rE0.     " bits 5..7:  reserved "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    60
    HEAD_EXTRA_FIELD      := 16r04.     " bit 2 set:  extra field present "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    61
    HEAD_ORIG_NAME        := 16r08.     " bit 3 set:  original file name present "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    62
    HEAD_COMMENT          := 16r10.     " bit 4 set:  file comment present "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    63
    HEAD_CRC              := 16r02.     " bit 1 set:  header CRC present "
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    64
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    65
    GZ_MAGIC_ID           := #[ 16r1f 16r8b ]
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    66
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    67
! !
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    68
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    69
!ZipStream methodsFor:'low level'!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    70
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    71
zclose
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
    72
    "low level close of the zip stream
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
    73
    "
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    74
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    75
    OBJ _zstreamObj = __INST( zstream );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    76
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    77
    if( _zstreamObj != nil )
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    78
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    79
	zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    80
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    81
	__INST(zstream) = nil;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    82
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    83
	if( _zstream->stream.state != NULL )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    84
	{
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    85
	    if( _zstream->op_mode == e_opmode_inflate )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    86
		inflateEnd( & _zstream->stream );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    87
	    else
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    88
		deflateEnd( & _zstream->stream );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    89
	}
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
    90
	free( _zstream );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    91
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    92
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    93
!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    94
1057
9df4a60df0ef *** empty log message ***
ca
parents: 1056
diff changeset
    95
zdeflate
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
    96
    "low level - deflate
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
    97
    "
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    98
    |errorNo|
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
    99
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   100
    errorNo := nil.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   101
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   102
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   103
    OBJ _zstreamObj = __INST( zstream );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   104
1056
44871623590b *** empty log message ***
ca
parents: 1054
diff changeset
   105
    if( _zstreamObj != nil )
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   106
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   107
	int         _errorNo, _action;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   108
	uLong       _bfsize;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   109
	zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   110
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   111
	if( _zstream->op_mode != e_opmode_deflate )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   112
	    RETURN( false );
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   113
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   114
	_bfsize = _zstream->out_total;
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   115
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   116
	if( _zstream->stream.state == NULL )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   117
	{
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   118
	    /* processing finished; write crc_32 and the total size
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   119
	    */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   120
	    uLong   v, i;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   121
	    Bytef * p = _zstream->out_ref;
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   122
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   123
	    v = _zstream->crc_32;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   124
	    for( i = 0; i < 4; ++i ) { p[i] = v & 0xff; v >>= 8; }
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   125
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   126
	    v = _zstream->stream.total_in;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   127
	    for( i = 4; i < 8; ++i ) { p[i] = v & 0xff; v >>= 8; }
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   128
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   129
	    _zstream->op_mode          = e_opmode_unspecified;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   130
	    _zstream->stream.avail_in  = 0;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   131
	    _zstream->stream.next_in   = Z_NULL;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   132
	    _zstream->stream.avail_out = _bfsize - 8;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   133
	    RETURN( true );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   134
	}
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   135
	_zstream->stream.avail_out = _bfsize;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   136
	_zstream->stream.next_out  = _zstream->out_ref;
1056
44871623590b *** empty log message ***
ca
parents: 1054
diff changeset
   137
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   138
	_action  = (__INST(hitEOF) == true) ? Z_FINISH : Z_NO_FLUSH;        
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   139
	_errorNo = deflate( & _zstream->stream, _action );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   140
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   141
	if( _errorNo == Z_STREAM_END )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   142
	{
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   143
	    _zstream->stream.avail_in = 0;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   144
	    _zstream->stream.next_in  = Z_NULL;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   145
	    _errorNo = deflateEnd( & _zstream->stream );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   146
	}
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   147
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   148
	if( _errorNo == Z_OK )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   149
	{
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   150
	    if(   (_zstream->stream.avail_out != _bfsize)
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   151
	       || (_zstream->stream.avail_in  != 0)
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   152
	      )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   153
	      RETURN( true );
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   154
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   155
	    RETURN( false );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   156
	}
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   157
	errorNo = __MKSMALLINT( _errorNo );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   158
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   159
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   160
    errorNo ifNil:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   161
	zstream ifNil:[self errorNotOpen].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   162
	self invalidArguments.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   163
    ].
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   164
    self zerror:errorNo.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   165
!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   166
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   167
zdeflateInit
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   168
    "low level - deflateInit
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   169
    "
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   170
    |errorNo level|
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   171
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   172
    errorNo := nil.
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   173
    level   := BlockSize.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   174
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   175
    OBJ _zstreamObj = __INST( zstream );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   176
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   177
    if( (_zstreamObj != nil) && __isSmallInteger(level) )
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   178
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   179
	int         _errorNo;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   180
	zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   181
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   182
	_zstream->op_mode = e_opmode_deflate;
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   183
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   184
	_errorNo = deflateInit2( & _zstream->stream
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   185
			       , __intVal( level )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   186
			       , Z_DEFLATED
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   187
			       , -MAX_WBITS
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   188
			       , DEF_MEM_LEVEL
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   189
			       , Z_DEFAULT_STRATEGY
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   190
			       );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   191
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   192
	if( _errorNo == Z_OK )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   193
	    RETURN( self );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   194
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   195
	errorNo = __MKSMALLINT( _errorNo );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   196
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   197
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   198
    errorNo ifNil:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   199
	zstream ifNil:[ self errorNotOpen ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   200
	self invalidArguments .
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   201
    ].
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   202
    self zerror:errorNo.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   203
!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   204
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   205
zget_avail_out
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   206
    "low level - get the number of available out bytes
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   207
    "
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   208
%{
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   209
    OBJ _zstreamObj = __INST( zstream );
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   210
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   211
    if( _zstreamObj != nil )
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   212
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   213
	uInt        _count;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   214
	zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   215
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   216
	_count = _zstream->out_total - _zstream->stream.avail_out;
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   217
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   218
	RETURN( __MKSMALLINT (_count) );
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   219
    }
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   220
%}.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   221
    self errorNotOpen.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   222
!
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   223
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   224
zinflate
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   225
    "low level - inflate
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   226
    "
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   227
    |errorNo tailError|
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   228
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   229
    tailError := nil.
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   230
    errorNo   := nil.
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   231
%{
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   232
    OBJ _zstreamObj = __INST( zstream );
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   233
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   234
    if( _zstreamObj != nil )
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   235
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   236
	int         _errorNo, _count;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   237
	zstream_s * _zstream;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   238
	int         _avail_in;
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   239
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   240
	_zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   241
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   242
	if( _zstream->op_mode != e_opmode_inflate )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   243
	    RETURN( nil );
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   244
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   245
	_avail_in = _zstream->stream.avail_in;
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   246
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   247
	if( _zstream->stream.state == NULL )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   248
	{
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   249
	    /* processing finished : check crc and data length */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   250
	    Bytef * _next_in;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   251
	    Bytef * _buff;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   252
	    uLong   _tnum;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   253
	    int     _i;
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   254
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   255
	    _next_in   = _zstream->stream.next_in;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   256
	    _buff = _zstream->tail_buff;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   257
	    _tnum = _zstream->tail_size;
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   258
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   259
	    while( (_avail_in > 0) && (_tnum < 8) )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   260
	    {
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   261
	       _buff[_tnum] = * _next_in;
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   262
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   263
		++_next_in;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   264
		++_tnum;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   265
		--_avail_in;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   266
	    }
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   267
	    _zstream->tail_size = _tnum;
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   268
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   269
	    if( _tnum < 8 )                     /* test whether tail is read */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   270
		RETURN( __MKSMALLINT (0) );     /* need more data */
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   271
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   272
	    /* compute and check crc */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   273
	    for( _tnum = 0, _i = 4; --_i >= 0; _tnum = (_tnum << 8) + _buff[_i] );
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   274
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   275
	    if( _tnum != _zstream->crc_32 )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   276
		{ tailError = __MKSMALLINT( 1 ); goto badTail; }
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   277
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   278
	    /* compute and check data length */
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   279
	    for( _tnum = 0, _i = 8; --_i >= 4; _tnum = (_tnum << 8) + _buff[_i] );
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   280
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   281
	    if( _zstream->stream.total_out != _tnum )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   282
		{ tailError = __MKSMALLINT( 2 ); goto badTail; }
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   283
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   284
	    _zstream->op_mode = e_opmode_unspecified;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   285
	    RETURN( nil );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   286
	}
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   287
	if( _avail_in == 0 )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   288
	    RETURN( __MKSMALLINT (0) );
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   289
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   290
	_zstream->stream.avail_out = _zstream->out_total;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   291
	_zstream->stream.next_out  = _zstream->out_ref;
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   292
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   293
	_errorNo = inflate( & _zstream->stream, Z_NO_FLUSH );
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   294
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   295
	if( _errorNo == Z_STREAM_END )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   296
	    _errorNo = inflateEnd( & _zstream->stream );
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   297
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   298
	if( _errorNo == Z_OK )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   299
	{
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   300
	    _count = _zstream->out_total - _zstream->stream.avail_out;
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   301
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   302
	    if( _count > 0 )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   303
		_zstream->crc_32 = crc32( _zstream->crc_32, _zstream->out_ref, _count );
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   304
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   305
	    RETURN( __MKSMALLINT (_count) );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   306
	}
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   307
	errorNo = __MKSMALLINT( _errorNo );
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   308
    }
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   309
badTail:;
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   310
%}.
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   311
    errorNo ifNil:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   312
	tailError ifNotNil:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   313
	    tailError == 1 ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   314
		self zerror:'invalid compressed data--crc error'
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   315
	    ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   316
	    self zerror:'invalid compressed data--length error'
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   317
	].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   318
	self errorNotOpen
1061
be824dc5e0e7 *** empty log message ***
ca
parents: 1060
diff changeset
   319
    ].
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   320
    self zerror:errorNo.
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   321
!
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   322
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   323
zinflateInit
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   324
    "low level - inflateInit
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   325
    "
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   326
    |errorNo|
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   327
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   328
    errorNo := nil.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   329
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   330
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   331
    OBJ _zstreamObj = __INST( zstream );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   332
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   333
    if( _zstreamObj != nil )
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   334
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   335
	int         _errorNo;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   336
	zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   337
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   338
	_zstream->op_mode = e_opmode_inflate;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   339
	_errorNo = inflateInit2( & _zstream->stream, -MAX_WBITS );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   340
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   341
	if( _errorNo == Z_OK )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   342
	    RETURN( self );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   343
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   344
	_zstream->stream.avail_in = 0;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   345
	errorNo = __MKSMALLINT( _errorNo );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   346
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   347
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   348
    errorNo ifNil:[ self errorNotOpen ].
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   349
    self zerror:errorNo.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   350
!
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   351
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   352
zopen
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   353
    "low level - opens the zip stream
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   354
    "
1051
4f18d73427bb *** empty log message ***
ca
parents: 1050
diff changeset
   355
    |outTotal|
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   356
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   357
    outTotal := outputBytes size.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   358
%{
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   359
    zstream_s * _zstream = (zstream_s *) malloc( sizeof(zstream_s) );
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   360
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   361
    if( _zstream )
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   362
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   363
	OBJ     _zobj   = __MKEXTERNALADDRESS( _zstream );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   364
	OBJ     _outObj = __INST( outputBytes );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   365
	OBJ     _inpObj = __INST( inputBytes  );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   366
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   367
	zmemzero( _zstream, sizeof(zstream_s) );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   368
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   369
	_zstream->in_ref           = (Bytef *) __externalBytesAddress( _inpObj );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   370
	_zstream->stream.next_in   = Z_NULL;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   371
	_zstream->stream.avail_in  = 0;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   372
	_zstream->stream.total_in  = 0;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   373
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   374
	_zstream->out_total        = __intVal( outTotal );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   375
	_zstream->out_ref          = (Bytef *) __externalBytesAddress( _outObj );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   376
	_zstream->stream.next_out  = _zstream->out_ref;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   377
	_zstream->stream.avail_out = _zstream->out_total;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   378
	_zstream->stream.total_out = 0;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   379
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   380
	_zstream->stream.zalloc    = (alloc_func)0;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   381
	_zstream->stream.zfree     = (free_func) 0;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   382
	_zstream->stream.opaque    = (voidpf)    0;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   383
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   384
	_zstream->crc_32           = crc32( 0L, Z_NULL, 0 );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   385
	_zstream->op_mode          = e_opmode_unspecified;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   386
	_zstream->tail_size        = 0;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   387
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   388
	__INST (zstream) = _zobj;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   389
	__STORE(self, _zobj);
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   390
    }
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   391
%}.
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   392
!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   393
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   394
zset_avail_in:count
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   395
    "set the 'avail_in' and compute the crc
1052
055841c03c8a *** empty log message ***
ca
parents: 1051
diff changeset
   396
    "
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   397
%{
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   398
    OBJ _zstreamObj = __INST( zstream );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   399
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   400
    if( (_zstreamObj != nil) && __isSmallInteger(count) )
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   401
    {
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   402
	int         _count;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   403
	zstream_s * _zstream = (zstream_s *) __externalBytesAddress( _zstreamObj );
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   404
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   405
	if( (_count = __intVal( count )) > 0 )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   406
	{
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   407
	    Bytef * _in_ref = _zstream->in_ref;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   408
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   409
	    _zstream->stream.avail_in = _count;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   410
	    _zstream->stream.next_in  = _in_ref;
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   411
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   412
	    if( _zstream->op_mode == e_opmode_deflate )
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   413
		_zstream->crc_32 = crc32( _zstream->crc_32, _in_ref, _count );
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   414
	} else {
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   415
	    _zstream->stream.avail_in = 0;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   416
	    _zstream->stream.next_in  = Z_NULL;
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   417
	}
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   418
	RETURN( self );
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   419
    }
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   420
%}.
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   421
    zstream ifNil:[ self errorNotOpen ].
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   422
    self invalidArguments.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   423
! !
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   424
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   425
!ZipStream methodsFor:'startup & release'!
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   426
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   427
openWithMode:aMode on:aStream
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   428
    super openWithMode:aMode on:aStream.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   429
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1061
diff changeset
   430
    self isReadable ifTrue:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   431
	"Check for the gzip magic id"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   432
	|flags|
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   433
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   434
	GZ_MAGIC_ID do:[:b|
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   435
	    onStream nextByte ~~ b ifTrue:[ self zerror:'version error' ]
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   436
	].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   437
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   438
	onStream nextByte ~~ Z_DEFLATED ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   439
	    self zerror:'invalid method (not deflated)'
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   440
	].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   441
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   442
	flags := onStream nextByte.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   443
	(flags bitAnd:HEAD_RESERVED) ~~ 0 ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   444
	    self zerror:'wrong data format'
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   445
	].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   446
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   447
	"discard time, xflags and OS code"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   448
	onStream skip:6.
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   449
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   450
	(flags bitAnd:HEAD_EXTRA_FIELD) ~~ 0 ifTrue:[|len|
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   451
	    "skip the extra field"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   452
	    len := onStream nextByte + (onStream nextByte bitShift:8).
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   453
	    len timesRepeat:[ onStream nextByte ].
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   454
	].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   455
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   456
	(flags bitAnd:HEAD_ORIG_NAME) ~~ 0 ifTrue:[|b|
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   457
	    "skip the original file name"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   458
	    [ (b := onStream nextByte) ~~ 0 ] whileTrue.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   459
	].
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   460
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   461
	(flags bitAnd:HEAD_CRC) ~~ 0 ifTrue:[
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   462
	    "skip the header crc"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   463
	    onStream skip:2.
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   464
	].
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   465
    ] ifFalse:[
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   466
	"write the gzip magic id
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   467
	"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   468
	GZ_MAGIC_ID do:[:b| onStream nextPutByte:b ].
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   469
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   470
	"write the method"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   471
	onStream nextPutByte:Z_DEFLATED.
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   472
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   473
	"write the flags"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   474
	onStream nextPutByte:0.
1050
b7e7d51e0a9f *** empty log message ***
ca
parents: 1049
diff changeset
   475
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   476
	"write time"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   477
	4 timesRepeat:[ onStream nextPutByte:0 ].
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   478
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   479
	"write xflags"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   480
	onStream nextPutByte:0.
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   481
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   482
	"write OS code"
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   483
	onStream nextPutByte:HEAD_OS_CODE.
1059
b47e4eff5543 *** empty log message ***
ca
parents: 1058
diff changeset
   484
    ].    
1045
6f093ef80063 *** empty log message ***
ca
parents: 1044
diff changeset
   485
! !
1044
c73aee830691 initial checkin
ca
parents:
diff changeset
   486
c73aee830691 initial checkin
ca
parents:
diff changeset
   487
!ZipStream class methodsFor:'documentation'!
c73aee830691 initial checkin
ca
parents:
diff changeset
   488
c73aee830691 initial checkin
ca
parents:
diff changeset
   489
version
1195
9d887847d1b6 Add BZipStream and ZipStream
Stefan Vogel <sv@exept.de>
parents: 1193
diff changeset
   490
    ^ '$Header: /cvs/stx/stx/libbasic2/ZipStream.st,v 1.19 2003-05-06 16:19:20 stefan Exp $'
1044
c73aee830691 initial checkin
ca
parents:
diff changeset
   491
! !
1193
7688148ec90c Code formatting & clean up
Stefan Vogel <sv@exept.de>
parents: 1061
diff changeset
   492
1047
1cd99e473c08 *** empty log message ***
ca
parents: 1046
diff changeset
   493
ZipStream initialize!