Rizin
unix-like reverse engineering framework and cli tools
deflate.c File Reference
#include "deflate.h"

Go to the source code of this file.

Classes

struct  config_s
 

Macros

#define NIL   0
 
#define TOO_FAR   4096
 
#define RANK(f)   (((f) * 2) - ((f) > 4 ? 9 : 0))
 
#define UPDATE_HASH(s, h, c)   (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
 
#define INSERT_STRING(s, str, match_head)
 
#define CLEAR_HASH(s)
 
#define HCRC_UPDATE(beg)
 
#define check_match(s, start, match, length)
 
#define FLUSH_BLOCK_ONLY(s, last)
 
#define FLUSH_BLOCK(s, last)
 
#define MAX_STORED   65535
 
#define MIN(a, b)   ((a) > (b) ? (b) : (a))
 

Typedefs

typedef block_state compress_func OF((deflate_state *s, int flush))
 
typedef struct config_s config
 

Enumerations

enum  block_state { need_more , block_done , finish_started , finish_done }
 

Functions

int deflateStateCheck OF ((z_streamp strm))
 
void slide_hash OF ((deflate_state *s))
 
void putShortMSB OF ((deflate_state *s, uInt b))
 
unsigned read_buf OF ((z_streamp strm, Bytef *buf, unsigned size))
 
uInt longest_match OF ((deflate_state *s, IPos cur_match))
 
void slide_hash (deflate_state *s)
 
int ZEXPORT deflateInit_ (z_streamp strm, int level, const char *version, int stream_size)
 
int ZEXPORT deflateInit2_ (z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)
 
int deflateStateCheck (z_streamp strm)
 
int ZEXPORT deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength)
 
int ZEXPORT deflateGetDictionary (z_streamp strm, Bytef *dictionary, uInt *dictLength)
 
int ZEXPORT deflateResetKeep (z_streamp strm)
 
int ZEXPORT deflateReset (z_streamp strm)
 
int ZEXPORT deflateSetHeader (z_streamp strm, gz_headerp head)
 
int ZEXPORT deflatePending (z_streamp strm, unsigned *pending, int *bits)
 
int ZEXPORT deflatePrime (z_streamp strm, int bits, int value)
 
int ZEXPORT deflateParams (z_streamp strm, int level, int strategy)
 
int ZEXPORT deflateTune (z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)
 
uLong ZEXPORT deflateBound (z_streamp strm, uLong sourceLen)
 
void putShortMSB (deflate_state *s, uInt b)
 
void flush_pending (z_streamp strm)
 
int ZEXPORT deflate (z_streamp strm, int flush)
 
int ZEXPORT deflateEnd (z_streamp strm)
 
int ZEXPORT deflateCopy (z_streamp dest, z_streamp source)
 
unsigned read_buf (z_streamp strm, Bytef *buf, unsigned size)
 
void lm_init (deflate_state *s)
 
uInt longest_match (deflate_state *s, IPos cur_match)
 
void fill_window (deflate_state *s)
 
block_state deflate_stored (deflate_state *s, int flush)
 
block_state deflate_fast (deflate_state *s, int flush)
 
block_state deflate_slow (deflate_state *s, int flush)
 
block_state deflate_rle (deflate_state *s, int flush)
 
block_state deflate_huff (deflate_state *s, int flush)
 

Variables

const char deflate_copyright []
 
const config configuration_table [10]
 

Macro Definition Documentation

◆ check_match

#define check_match (   s,
  start,
  match,
  length 
)

Definition at line 1509 of file deflate.c.

◆ CLEAR_HASH

#define CLEAR_HASH (   s)
Value:
do { \
s->head[s->hash_size-1] = NIL; \
zmemzero((Bytef *)s->head, \
(unsigned)(s->hash_size-1)*sizeof(*s->head)); \
} while (0)
#define NIL
Definition: deflate.c:107
static RzSocket * s
Definition: rtr.c:28
Byte FAR Bytef
Definition: zconf.h:400

Definition at line 192 of file deflate.c.

◆ FLUSH_BLOCK

#define FLUSH_BLOCK (   s,
  last 
)
Value:
{ \
FLUSH_BLOCK_ONLY(s, last); \
if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
}
@ finish_started
Definition: deflate.c:69
@ need_more
Definition: deflate.c:67

Definition at line 1659 of file deflate.c.

◆ FLUSH_BLOCK_ONLY

#define FLUSH_BLOCK_ONLY (   s,
  last 
)
Value:
{ \
_tr_flush_block(s, (s->block_start >= 0L ? \
(charf *)&s->window[(unsigned)s->block_start] : \
(charf *)Z_NULL), \
(ulg)((long)s->strstart - s->block_start), \
(last)); \
s->block_start = s->strstart; \
flush_pending(s->strm); \
Tracev((stderr,"[FLUSH]")); \
}
char FAR charf
Definition: zconf.h:402
#define L
Definition: zip_err_str.c:7
#define Z_NULL
Definition: zlib.h:212
unsigned long ulg
Definition: zutil.h:43

Definition at line 1647 of file deflate.c.

◆ HCRC_UPDATE

#define HCRC_UPDATE (   beg)
Value:
do { \
if (s->gzhead->hcrc && s->pending > (beg)) \
strm->adler = crc32(strm->adler, s->pending_buf + (beg), \
s->pending - (beg)); \
} while (0)
static lzma_stream strm
Definition: full_flush.c:20
unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, uInt len)
Definition: crc32.c:1063

Definition at line 796 of file deflate.c.

◆ INSERT_STRING

#define INSERT_STRING (   s,
  str,
  match_head 
)
Value:
(UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
s->head[s->ins_h] = (Pos)(str))
#define UPDATE_HASH(s, h, c)
Definition: deflate.c:163
ush Pos
Definition: deflate.h:92
#define MIN_MATCH
Definition: zutil.h:84

Definition at line 182 of file deflate.c.

◆ MAX_STORED

#define MAX_STORED   65535

Definition at line 1665 of file deflate.c.

◆ MIN

#define MIN (   a,
  b 
)    ((a) > (b) ? (b) : (a))

Definition at line 1668 of file deflate.c.

◆ NIL

#define NIL   0

Definition at line 107 of file deflate.c.

◆ RANK

#define RANK (   f)    (((f) * 2) - ((f) > 4 ? 9 : 0))

Definition at line 155 of file deflate.c.

◆ TOO_FAR

#define TOO_FAR   4096

Definition at line 111 of file deflate.c.

◆ UPDATE_HASH

#define UPDATE_HASH (   s,
  h,
  c 
)    (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)

Definition at line 163 of file deflate.c.

Typedef Documentation

◆ config

typedef struct config_s config

◆ OF

Addition for GDAL : START

Addition for GDAL : END

Definition at line 73 of file deflate.c.

Enumeration Type Documentation

◆ block_state

Enumerator
need_more 
block_done 
finish_started 
finish_done 

Definition at line 66 of file deflate.c.

66  {
67  need_more, /* block not completed, need more input or more output */
68  block_done, /* block flush performed */
69  finish_started, /* finish started, need only more output at next deflate */
70  finish_done /* finish done, accept no more input or output */
71 } block_state;
block_state
Definition: deflate.c:66
@ block_done
Definition: deflate.c:68
@ finish_done
Definition: deflate.c:70

Function Documentation

◆ deflate()

int ZEXPORT deflate ( z_streamp  strm,
int  flush 
)

Definition at line 804 of file deflate.c.

807 {
808  int old_flush; /* value of flush param for previous deflate call */
809  deflate_state *s;
810 
811  if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) {
812  return Z_STREAM_ERROR;
813  }
814  s = strm->state;
815 
816  if (strm->next_out == Z_NULL ||
817  (strm->avail_in != 0 && strm->next_in == Z_NULL) ||
818  (s->status == FINISH_STATE && flush != Z_FINISH)) {
820  }
822 
823  old_flush = s->last_flush;
824  s->last_flush = flush;
825 
826  /* Flush as much pending output as possible */
827  if (s->pending != 0) {
829  if (strm->avail_out == 0) {
830  /* Since avail_out is 0, deflate will be called again with
831  * more output space, but possibly with both pending and
832  * avail_in equal to zero. There won't be anything to do,
833  * but this is not an error situation so make sure we
834  * return OK instead of BUF_ERROR at next call of deflate:
835  */
836  s->last_flush = -1;
837  return Z_OK;
838  }
839 
840  /* Make sure there is something to do and avoid duplicate consecutive
841  * flushes. For repeated and useless calls with Z_FINISH, we keep
842  * returning Z_STREAM_END instead of Z_BUF_ERROR.
843  */
844  } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
845  flush != Z_FINISH) {
847  }
848 
849  /* User must not provide more input after the first FINISH: */
850  if (s->status == FINISH_STATE && strm->avail_in != 0) {
852  }
853 
854  /* Write the header */
855  if (s->status == INIT_STATE && s->wrap == 0)
856  s->status = BUSY_STATE;
857  if (s->status == INIT_STATE) {
858  /* zlib header */
859  uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
860  uInt level_flags;
861 
862  if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
863  level_flags = 0;
864  else if (s->level < 6)
865  level_flags = 1;
866  else if (s->level == 6)
867  level_flags = 2;
868  else
869  level_flags = 3;
870  header |= (level_flags << 6);
871  if (s->strstart != 0) header |= PRESET_DICT;
872  header += 31 - (header % 31);
873 
874  putShortMSB(s, header);
875 
876  /* Save the adler32 of the preset dictionary: */
877  if (s->strstart != 0) {
878  putShortMSB(s, (uInt)(strm->adler >> 16));
879  putShortMSB(s, (uInt)(strm->adler & 0xffff));
880  }
881  strm->adler = adler32(0L, Z_NULL, 0);
882  s->status = BUSY_STATE;
883 
884  /* Compression must start with an empty pending buffer */
886  if (s->pending != 0) {
887  s->last_flush = -1;
888  return Z_OK;
889  }
890  }
891 #ifdef GZIP
892  if (s->status == GZIP_STATE) {
893  /* gzip header */
894  strm->adler = crc32(0L, Z_NULL, 0);
895  put_byte(s, 31);
896  put_byte(s, 139);
897  put_byte(s, 8);
898  if (s->gzhead == Z_NULL) {
899  put_byte(s, 0);
900  put_byte(s, 0);
901  put_byte(s, 0);
902  put_byte(s, 0);
903  put_byte(s, 0);
904  put_byte(s, s->level == 9 ? 2 :
905  (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
906  4 : 0));
907  put_byte(s, OS_CODE);
908  s->status = BUSY_STATE;
909 
910  /* Compression must start with an empty pending buffer */
912  if (s->pending != 0) {
913  s->last_flush = -1;
914  return Z_OK;
915  }
916  }
917  else {
918  put_byte(s, (s->gzhead->text ? 1 : 0) +
919  (s->gzhead->hcrc ? 2 : 0) +
920  (s->gzhead->extra == Z_NULL ? 0 : 4) +
921  (s->gzhead->name == Z_NULL ? 0 : 8) +
922  (s->gzhead->comment == Z_NULL ? 0 : 16)
923  );
924  put_byte(s, (Byte)(s->gzhead->time & 0xff));
925  put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
926  put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
927  put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
928  put_byte(s, s->level == 9 ? 2 :
929  (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
930  4 : 0));
931  put_byte(s, s->gzhead->os & 0xff);
932  if (s->gzhead->extra != Z_NULL) {
933  put_byte(s, s->gzhead->extra_len & 0xff);
934  put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
935  }
936  if (s->gzhead->hcrc)
937  strm->adler = crc32(strm->adler, s->pending_buf,
938  s->pending);
939  s->gzindex = 0;
940  s->status = EXTRA_STATE;
941  }
942  }
943  if (s->status == EXTRA_STATE) {
944  if (s->gzhead->extra != Z_NULL) {
945  ulg beg = s->pending; /* start of bytes to update crc */
946  uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex;
947  while (s->pending + left > s->pending_buf_size) {
948  uInt copy = s->pending_buf_size - s->pending;
949  zmemcpy(s->pending_buf + s->pending,
950  s->gzhead->extra + s->gzindex, copy);
951  s->pending = s->pending_buf_size;
952  HCRC_UPDATE(beg);
953  s->gzindex += copy;
955  if (s->pending != 0) {
956  s->last_flush = -1;
957  return Z_OK;
958  }
959  beg = 0;
960  left -= copy;
961  }
962  zmemcpy(s->pending_buf + s->pending,
963  s->gzhead->extra + s->gzindex, left);
964  s->pending += left;
965  HCRC_UPDATE(beg);
966  s->gzindex = 0;
967  }
968  s->status = NAME_STATE;
969  }
970  if (s->status == NAME_STATE) {
971  if (s->gzhead->name != Z_NULL) {
972  ulg beg = s->pending; /* start of bytes to update crc */
973  int val;
974  do {
975  if (s->pending == s->pending_buf_size) {
976  HCRC_UPDATE(beg);
978  if (s->pending != 0) {
979  s->last_flush = -1;
980  return Z_OK;
981  }
982  beg = 0;
983  }
984  val = s->gzhead->name[s->gzindex++];
985  put_byte(s, val);
986  } while (val != 0);
987  HCRC_UPDATE(beg);
988  s->gzindex = 0;
989  }
990  s->status = COMMENT_STATE;
991  }
992  if (s->status == COMMENT_STATE) {
993  if (s->gzhead->comment != Z_NULL) {
994  ulg beg = s->pending; /* start of bytes to update crc */
995  int val;
996  do {
997  if (s->pending == s->pending_buf_size) {
998  HCRC_UPDATE(beg);
1000  if (s->pending != 0) {
1001  s->last_flush = -1;
1002  return Z_OK;
1003  }
1004  beg = 0;
1005  }
1006  val = s->gzhead->comment[s->gzindex++];
1007  put_byte(s, val);
1008  } while (val != 0);
1009  HCRC_UPDATE(beg);
1010  }
1011  s->status = HCRC_STATE;
1012  }
1013  if (s->status == HCRC_STATE) {
1014  if (s->gzhead->hcrc) {
1015  if (s->pending + 2 > s->pending_buf_size) {
1017  if (s->pending != 0) {
1018  s->last_flush = -1;
1019  return Z_OK;
1020  }
1021  }
1022  put_byte(s, (Byte)(strm->adler & 0xff));
1023  put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
1024  strm->adler = crc32(0L, Z_NULL, 0);
1025  }
1026  s->status = BUSY_STATE;
1027 
1028  /* Compression must start with an empty pending buffer */
1030  if (s->pending != 0) {
1031  s->last_flush = -1;
1032  return Z_OK;
1033  }
1034  }
1035 #endif
1036 
1037  /* Start a new block or continue the current one.
1038  */
1039  if (strm->avail_in != 0 || s->lookahead != 0 ||
1040  (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
1041  block_state bstate;
1042 
1043  bstate = s->level == 0 ? deflate_stored(s, flush) :
1044  s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
1045  s->strategy == Z_RLE ? deflate_rle(s, flush) :
1046  (*(configuration_table[s->level].func))(s, flush);
1047 
1048  if (bstate == finish_started || bstate == finish_done) {
1049  s->status = FINISH_STATE;
1050  }
1051  if (bstate == need_more || bstate == finish_started) {
1052  if (strm->avail_out == 0) {
1053  s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
1054  }
1055  return Z_OK;
1056  /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
1057  * of deflate should use the same flush parameter to make sure
1058  * that the flush is complete. So we don't have to output an
1059  * empty block here, this will be done at next call. This also
1060  * ensures that for a very small output buffer, we emit at most
1061  * one empty block.
1062  */
1063  }
1064  if (bstate == block_done) {
1065  if (flush == Z_PARTIAL_FLUSH) {
1066  _tr_align(s);
1067  } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
1068  _tr_stored_block(s, (char*)0, 0L, 0);
1069  /* For a full flush, this empty block will be recognized
1070  * as a special marker by inflate_sync().
1071  */
1072  if (flush == Z_FULL_FLUSH) {
1073  CLEAR_HASH(s); /* forget history */
1074  if (s->lookahead == 0) {
1075  s->strstart = 0;
1076  s->block_start = 0L;
1077  s->insert = 0;
1078  }
1079  }
1080  }
1082  if (strm->avail_out == 0) {
1083  s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
1084  return Z_OK;
1085  }
1086  }
1087  }
1088 
1089  if (flush != Z_FINISH) return Z_OK;
1090  if (s->wrap <= 0) return Z_STREAM_END;
1091 
1092  /* Write the trailer */
1093 #ifdef GZIP
1094  if (s->wrap == 2) {
1095  put_byte(s, (Byte)(strm->adler & 0xff));
1096  put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
1097  put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
1098  put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
1099  put_byte(s, (Byte)(strm->total_in & 0xff));
1100  put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
1101  put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
1102  put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
1103  }
1104  else
1105 #endif
1106  {
1107  putShortMSB(s, (uInt)(strm->adler >> 16));
1108  putShortMSB(s, (uInt)(strm->adler & 0xffff));
1109  }
1111  /* If avail_out is zero, the application will call deflate again
1112  * to flush the rest.
1113  */
1114  if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
1115  return s->pending != 0 ? Z_OK : Z_STREAM_END;
1116 }
ut16 val
Definition: armass64_const.h:6
const config configuration_table[10]
Definition: deflate.c:134
#define HCRC_UPDATE(beg)
Definition: deflate.c:796
block_state deflate_stored(deflate_state *s, int flush)
Definition: deflate.c:1685
void putShortMSB(deflate_state *s, uInt b)
Definition: deflate.c:757
void flush_pending(z_streamp strm)
Definition: deflate.c:771
block_state deflate_huff(deflate_state *s, int flush)
Definition: deflate.c:2178
int deflateStateCheck(z_streamp strm)
Definition: deflate.c:393
#define RANK(f)
Definition: deflate.c:155
#define CLEAR_HASH(s)
Definition: deflate.c:192
block_state deflate_rle(deflate_state *s, int flush)
Definition: deflate.c:2105
#define FINISH_STATE
Definition: deflate.h:63
#define COMMENT_STATE
Definition: deflate.h:60
#define HCRC_STATE
Definition: deflate.h:61
#define GZIP_STATE
Definition: deflate.h:56
#define BUSY_STATE
Definition: deflate.h:62
#define put_byte(s, c)
Definition: deflate.h:276
#define INIT_STATE
Definition: deflate.h:54
#define NAME_STATE
Definition: deflate.h:59
#define EXTRA_STATE
Definition: deflate.h:58
#define header(is_bt, len_min, ret_op)
while(len< limit &&buf1[len]==buf2[len])++len
uint8_t * next_out
Definition: base.h:490
uint64_t total_in
Definition: base.h:488
size_t avail_out
Definition: base.h:491
const uint8_t * next_in
Definition: base.h:486
size_t avail_in
Definition: base.h:487
uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len)
Definition: adler32.c:134
void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, ulg stored_len, int last)
Definition: trees.c:863
void ZLIB_INTERNAL _tr_align(deflate_state *s)
Definition: trees.c:897
static int level
Definition: vmenus.c:2424
unsigned int uInt
Definition: zconf.h:393
unsigned char Byte
Definition: zconf.h:391
#define Z_HUFFMAN_ONLY
Definition: zlib.h:197
#define Z_DEFLATED
Definition: zlib.h:209
#define Z_BUF_ERROR
Definition: zlib.h:184
#define Z_BLOCK
Definition: zlib.h:173
#define Z_STREAM_END
Definition: zlib.h:178
#define Z_FINISH
Definition: zlib.h:172
#define Z_OK
Definition: zlib.h:177
#define Z_STREAM_ERROR
Definition: zlib.h:181
#define Z_NO_FLUSH
Definition: zlib.h:168
#define Z_PARTIAL_FLUSH
Definition: zlib.h:169
#define Z_FULL_FLUSH
Definition: zlib.h:171
#define Z_RLE
Definition: zlib.h:198
void ZLIB_INTERNAL zmemcpy(Bytef *dest, const Bytef *source, uInt len)
Definition: zutil.c:149
#define ERR_RETURN(strm, err)
Definition: zutil.h:61
#define PRESET_DICT
Definition: zutil.h:88
#define OS_CODE
Definition: zutil.h:201

References _tr_align(), _tr_stored_block(), adler32(), lzma_stream::avail_in, lzma_stream::avail_out, block_done, BUSY_STATE, CLEAR_HASH, COMMENT_STATE, configuration_table, crc32(), deflate_huff(), deflate_rle(), deflate_stored(), deflateStateCheck(), ERR_RETURN, EXTRA_STATE, finish_done, finish_started, FINISH_STATE, flush_pending(), config_s::func, GZIP_STATE, HCRC_STATE, HCRC_UPDATE, header, INIT_STATE, L, NAME_STATE, need_more, lzma_stream::next_in, lzma_stream::next_out, OS_CODE, PRESET_DICT, put_byte, putShortMSB(), RANK, s, strm, lzma_stream::total_in, val, while(), Z_BLOCK, Z_BUF_ERROR, Z_DEFLATED, Z_FINISH, Z_FULL_FLUSH, Z_HUFFMAN_ONLY, Z_NO_FLUSH, Z_NULL, Z_OK, Z_PARTIAL_FLUSH, Z_RLE, Z_STREAM_END, Z_STREAM_ERROR, and zmemcpy().

Referenced by compress2(), def(), deflateParams(), gz_comp(), gztack(), log_compress(), main(), partcompress(), process(), recompress(), rz_core_flirt_convert_file(), rz_core_flirt_create_file(), zipCloseFileInZipRaw64(), and zipWriteInFileInZip().

◆ deflate_fast()

block_state deflate_fast ( deflate_state s,
int  flush 
)

Definition at line 1872 of file deflate.c.

1875 {
1876  IPos hash_head; /* head of the hash chain */
1877  int bflush; /* set if current block must be flushed */
1878 
1879  for (;;) {
1880  /* Make sure that we always have enough lookahead, except
1881  * at the end of the input file. We need MAX_MATCH bytes
1882  * for the next match, plus MIN_MATCH bytes to insert the
1883  * string following the next match.
1884  */
1885  if (s->lookahead < MIN_LOOKAHEAD) {
1886  fill_window(s);
1887  if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
1888  return need_more;
1889  }
1890  if (s->lookahead == 0) break; /* flush the current block */
1891  }
1892 
1893  /* Insert the string window[strstart .. strstart+2] in the
1894  * dictionary, and set hash_head to the head of the hash chain:
1895  */
1896  hash_head = NIL;
1897  if (s->lookahead >= MIN_MATCH) {
1898  INSERT_STRING(s, s->strstart, hash_head);
1899  }
1900 
1901  /* Find the longest match, discarding those <= prev_length.
1902  * At this point we have always match_length < MIN_MATCH
1903  */
1904  if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
1905  /* To simplify the code, we prevent matches with the string
1906  * of window index 0 (in particular we have to avoid a match
1907  * of the string with itself at the start of the input file).
1908  */
1909  s->match_length = longest_match (s, hash_head);
1910  /* longest_match() sets match_start */
1911  }
1912  if (s->match_length >= MIN_MATCH) {
1913  check_match(s, s->strstart, s->match_start, s->match_length);
1914 
1915  _tr_tally_dist(s, s->strstart - s->match_start,
1916  s->match_length - MIN_MATCH, bflush);
1917 
1918  s->lookahead -= s->match_length;
1919 
1920  /* Insert new strings in the hash table only if the match length
1921  * is not too large. This saves time but degrades compression.
1922  */
1923 #ifndef FASTEST
1924  if (s->match_length <= s->max_insert_length &&
1925  s->lookahead >= MIN_MATCH) {
1926  s->match_length--; /* string at strstart already in table */
1927  do {
1928  s->strstart++;
1929  INSERT_STRING(s, s->strstart, hash_head);
1930  /* strstart never exceeds WSIZE-MAX_MATCH, so there are
1931  * always MIN_MATCH bytes ahead.
1932  */
1933  } while (--s->match_length != 0);
1934  s->strstart++;
1935  } else
1936 #endif
1937  {
1938  s->strstart += s->match_length;
1939  s->match_length = 0;
1940  s->ins_h = s->window[s->strstart];
1941  UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
1942 #if MIN_MATCH != 3
1943  Call UPDATE_HASH() MIN_MATCH-3 more times
1944 #endif
1945  /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
1946  * matter since it will be recomputed at next deflate call.
1947  */
1948  }
1949  } else {
1950  /* No match, output a literal byte */
1951  Tracevv((stderr,"%c", s->window[s->strstart]));
1952  _tr_tally_lit (s, s->window[s->strstart], bflush);
1953  s->lookahead--;
1954  s->strstart++;
1955  }
1956  if (bflush) FLUSH_BLOCK(s, 0);
1957  }
1958  s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
1959  if (flush == Z_FINISH) {
1960  FLUSH_BLOCK(s, 1);
1961  return finish_done;
1962  }
1963  if (s->sym_next)
1964  FLUSH_BLOCK(s, 0);
1965  return block_done;
1966 }
#define check_match(s, start, match, length)
Definition: deflate.c:1509
#define INSERT_STRING(s, str, match_head)
Definition: deflate.c:182
#define FLUSH_BLOCK(s, last)
Definition: deflate.c:1659
uInt longest_match(deflate_state *s, IPos cur_match)
Definition: deflate.c:1276
void fill_window(deflate_state *s)
Definition: deflate.c:1522
#define MAX_DIST(s)
Definition: deflate.h:284
#define _tr_tally_dist(s, distance, length, flush)
Definition: deflate.h:329
#define MIN_LOOKAHEAD
Definition: deflate.h:279
unsigned IPos
Definition: deflate.h:94
#define _tr_tally_lit(s, c, flush)
Definition: deflate.h:321
static static fork const void static count static fd const char const char static newpath char char char static envp time_t static t const char static mode static whence const char static dir time_t static t unsigned static seconds const char struct utimbuf static buf static inc static sig const char static mode static oldfd times
Definition: sflib.h:70
#define Tracevv(x)
Definition: zutil.h:254

References _tr_tally_dist, _tr_tally_lit, block_done, check_match, fill_window(), finish_done, FLUSH_BLOCK, INSERT_STRING, longest_match(), MAX_DIST, MIN_LOOKAHEAD, MIN_MATCH, need_more, NIL, s, times, Tracevv, UPDATE_HASH, Z_FINISH, and Z_NO_FLUSH.

◆ deflate_huff()

block_state deflate_huff ( deflate_state s,
int  flush 
)

Definition at line 2178 of file deflate.c.

2181 {
2182  int bflush; /* set if current block must be flushed */
2183 
2184  for (;;) {
2185  /* Make sure that we have a literal to write. */
2186  if (s->lookahead == 0) {
2187  fill_window(s);
2188  if (s->lookahead == 0) {
2189  if (flush == Z_NO_FLUSH)
2190  return need_more;
2191  break; /* flush the current block */
2192  }
2193  }
2194 
2195  /* Output a literal byte */
2196  s->match_length = 0;
2197  Tracevv((stderr,"%c", s->window[s->strstart]));
2198  _tr_tally_lit (s, s->window[s->strstart], bflush);
2199  s->lookahead--;
2200  s->strstart++;
2201  if (bflush) FLUSH_BLOCK(s, 0);
2202  }
2203  s->insert = 0;
2204  if (flush == Z_FINISH) {
2205  FLUSH_BLOCK(s, 1);
2206  return finish_done;
2207  }
2208  if (s->sym_next)
2209  FLUSH_BLOCK(s, 0);
2210  return block_done;
2211 }

References _tr_tally_lit, block_done, fill_window(), finish_done, FLUSH_BLOCK, need_more, s, Tracevv, Z_FINISH, and Z_NO_FLUSH.

Referenced by deflate().

◆ deflate_rle()

block_state deflate_rle ( deflate_state s,
int  flush 
)

Definition at line 2105 of file deflate.c.

2108 {
2109  int bflush; /* set if current block must be flushed */
2110  uInt prev; /* byte at distance one to match */
2111  Bytef *scan, *strend; /* scan goes up to strend for length of run */
2112 
2113  for (;;) {
2114  /* Make sure that we always have enough lookahead, except
2115  * at the end of the input file. We need MAX_MATCH bytes
2116  * for the longest run, plus one for the unrolled loop.
2117  */
2118  if (s->lookahead <= MAX_MATCH) {
2119  fill_window(s);
2120  if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
2121  return need_more;
2122  }
2123  if (s->lookahead == 0) break; /* flush the current block */
2124  }
2125 
2126  /* See how many times the previous byte repeats */
2127  s->match_length = 0;
2128  if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
2129  scan = s->window + s->strstart - 1;
2130  prev = *scan;
2131  if (prev == *++scan && prev == *++scan && prev == *++scan) {
2132  strend = s->window + s->strstart + MAX_MATCH;
2133  do {
2134  } while (prev == *++scan && prev == *++scan &&
2135  prev == *++scan && prev == *++scan &&
2136  prev == *++scan && prev == *++scan &&
2137  prev == *++scan && prev == *++scan &&
2138  scan < strend);
2139  s->match_length = MAX_MATCH - (uInt)(strend - scan);
2140  if (s->match_length > s->lookahead)
2141  s->match_length = s->lookahead;
2142  }
2143  Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
2144  }
2145 
2146  /* Emit match if have run of MIN_MATCH or longer, else emit literal */
2147  if (s->match_length >= MIN_MATCH) {
2148  check_match(s, s->strstart, s->strstart - 1, s->match_length);
2149 
2150  _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
2151 
2152  s->lookahead -= s->match_length;
2153  s->strstart += s->match_length;
2154  s->match_length = 0;
2155  } else {
2156  /* No match, output a literal byte */
2157  Tracevv((stderr,"%c", s->window[s->strstart]));
2158  _tr_tally_lit (s, s->window[s->strstart], bflush);
2159  s->lookahead--;
2160  s->strstart++;
2161  }
2162  if (bflush) FLUSH_BLOCK(s, 0);
2163  }
2164  s->insert = 0;
2165  if (flush == Z_FINISH) {
2166  FLUSH_BLOCK(s, 1);
2167  return finish_done;
2168  }
2169  if (s->sym_next)
2170  FLUSH_BLOCK(s, 0);
2171  return block_done;
2172 }
#define Assert(cond, msg)
Definition: zutil.h:251
#define MAX_MATCH
Definition: zutil.h:85

References _tr_tally_dist, _tr_tally_lit, Assert, block_done, check_match, fill_window(), finish_done, FLUSH_BLOCK, MAX_MATCH, MIN_MATCH, need_more, internal_state::prev, s, Tracevv, Z_FINISH, and Z_NO_FLUSH.

Referenced by deflate().

◆ deflate_slow()

block_state deflate_slow ( deflate_state s,
int  flush 
)

Definition at line 1974 of file deflate.c.

1977 {
1978  IPos hash_head; /* head of hash chain */
1979  int bflush; /* set if current block must be flushed */
1980 
1981  /* Process the input block. */
1982  for (;;) {
1983  /* Make sure that we always have enough lookahead, except
1984  * at the end of the input file. We need MAX_MATCH bytes
1985  * for the next match, plus MIN_MATCH bytes to insert the
1986  * string following the next match.
1987  */
1988  if (s->lookahead < MIN_LOOKAHEAD) {
1989  fill_window(s);
1990  if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
1991  return need_more;
1992  }
1993  if (s->lookahead == 0) break; /* flush the current block */
1994  }
1995 
1996  /* Insert the string window[strstart .. strstart+2] in the
1997  * dictionary, and set hash_head to the head of the hash chain:
1998  */
1999  hash_head = NIL;
2000  if (s->lookahead >= MIN_MATCH) {
2001  INSERT_STRING(s, s->strstart, hash_head);
2002  }
2003 
2004  /* Find the longest match, discarding those <= prev_length.
2005  */
2006  s->prev_length = s->match_length, s->prev_match = s->match_start;
2007  s->match_length = MIN_MATCH-1;
2008 
2009  if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
2010  s->strstart - hash_head <= MAX_DIST(s)) {
2011  /* To simplify the code, we prevent matches with the string
2012  * of window index 0 (in particular we have to avoid a match
2013  * of the string with itself at the start of the input file).
2014  */
2015  s->match_length = longest_match (s, hash_head);
2016  /* longest_match() sets match_start */
2017 
2018  if (s->match_length <= 5 && (s->strategy == Z_FILTERED
2019 #if TOO_FAR <= 32767
2020  || (s->match_length == MIN_MATCH &&
2021  s->strstart - s->match_start > TOO_FAR)
2022 #endif
2023  )) {
2024 
2025  /* If prev_match is also MIN_MATCH, match_start is garbage
2026  * but we will ignore the current match anyway.
2027  */
2028  s->match_length = MIN_MATCH-1;
2029  }
2030  }
2031  /* If there was a match at the previous step and the current
2032  * match is not better, output the previous match:
2033  */
2034  if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
2035  uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
2036  /* Do not insert strings in hash table beyond this. */
2037 
2038  check_match(s, s->strstart-1, s->prev_match, s->prev_length);
2039 
2040  _tr_tally_dist(s, s->strstart -1 - s->prev_match,
2041  s->prev_length - MIN_MATCH, bflush);
2042 
2043  /* Insert in hash table all strings up to the end of the match.
2044  * strstart-1 and strstart are already inserted. If there is not
2045  * enough lookahead, the last two strings are not inserted in
2046  * the hash table.
2047  */
2048  s->lookahead -= s->prev_length-1;
2049  s->prev_length -= 2;
2050  do {
2051  if (++s->strstart <= max_insert) {
2052  INSERT_STRING(s, s->strstart, hash_head);
2053  }
2054  } while (--s->prev_length != 0);
2055  s->match_available = 0;
2056  s->match_length = MIN_MATCH-1;
2057  s->strstart++;
2058 
2059  if (bflush) FLUSH_BLOCK(s, 0);
2060 
2061  } else if (s->match_available) {
2062  /* If there was no match at the previous position, output a
2063  * single literal. If there was a match but the current match
2064  * is longer, truncate the previous match to a single literal.
2065  */
2066  Tracevv((stderr,"%c", s->window[s->strstart-1]));
2067  _tr_tally_lit(s, s->window[s->strstart-1], bflush);
2068  if (bflush) {
2069  FLUSH_BLOCK_ONLY(s, 0);
2070  }
2071  s->strstart++;
2072  s->lookahead--;
2073  if (s->strm->avail_out == 0) return need_more;
2074  } else {
2075  /* There is no previous match to compare with, wait for
2076  * the next step to decide.
2077  */
2078  s->match_available = 1;
2079  s->strstart++;
2080  s->lookahead--;
2081  }
2082  }
2083  Assert (flush != Z_NO_FLUSH, "no flush?");
2084  if (s->match_available) {
2085  Tracevv((stderr,"%c", s->window[s->strstart-1]));
2086  _tr_tally_lit(s, s->window[s->strstart-1], bflush);
2087  s->match_available = 0;
2088  }
2089  s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
2090  if (flush == Z_FINISH) {
2091  FLUSH_BLOCK(s, 1);
2092  return finish_done;
2093  }
2094  if (s->sym_next)
2095  FLUSH_BLOCK(s, 0);
2096  return block_done;
2097 }
#define FLUSH_BLOCK_ONLY(s, last)
Definition: deflate.c:1647
#define TOO_FAR
Definition: deflate.c:111
#define Z_FILTERED
Definition: zlib.h:196

References _tr_tally_dist, _tr_tally_lit, Assert, block_done, check_match, fill_window(), finish_done, FLUSH_BLOCK, FLUSH_BLOCK_ONLY, INSERT_STRING, longest_match(), MAX_DIST, MIN_LOOKAHEAD, MIN_MATCH, need_more, NIL, s, TOO_FAR, Tracevv, Z_FILTERED, Z_FINISH, and Z_NO_FLUSH.

◆ deflate_stored()

block_state deflate_stored ( deflate_state s,
int  flush 
)

Definition at line 1685 of file deflate.c.

1688 {
1689  /* Smallest worthy block size when not flushing or finishing. By default
1690  * this is 32K. This can be as small as 507 bytes for memLevel == 1. For
1691  * large input and output buffers, the stored block size will be larger.
1692  */
1693  unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size);
1694 
1695  /* Copy as many min_block or larger stored blocks directly to next_out as
1696  * possible. If flushing, copy the remaining available input to next_out as
1697  * stored blocks, if there is enough space.
1698  */
1699  unsigned len, left, have, last = 0;
1700  unsigned used = s->strm->avail_in;
1701  do {
1702  /* Set len to the maximum size block that we can copy directly with the
1703  * available input data and output space. Set left to how much of that
1704  * would be copied from what's left in the window.
1705  */
1706  len = MAX_STORED; /* maximum deflate stored block length */
1707  have = (s->bi_valid + 42) >> 3; /* number of header bytes */
1708  if (s->strm->avail_out < have) /* need room for header */
1709  break;
1710  /* maximum stored block length that will fit in avail_out: */
1711  have = s->strm->avail_out - have;
1712  left = s->strstart - s->block_start; /* bytes left in window */
1713  if (len > (ulg)left + s->strm->avail_in)
1714  len = left + s->strm->avail_in; /* limit len to the input */
1715  if (len > have)
1716  len = have; /* limit len to the output */
1717 
1718  /* If the stored block would be less than min_block in length, or if
1719  * unable to copy all of the available input when flushing, then try
1720  * copying to the window and the pending buffer instead. Also don't
1721  * write an empty block when flushing -- deflate() does that.
1722  */
1723  if (len < min_block && ((len == 0 && flush != Z_FINISH) ||
1724  flush == Z_NO_FLUSH ||
1725  len != left + s->strm->avail_in))
1726  break;
1727 
1728  /* Make a dummy stored block in pending to get the header bytes,
1729  * including any pending bits. This also updates the debugging counts.
1730  */
1731  last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0;
1732  _tr_stored_block(s, (char *)0, 0L, last);
1733 
1734  /* Replace the lengths in the dummy stored block with len. */
1735  s->pending_buf[s->pending - 4] = len;
1736  s->pending_buf[s->pending - 3] = len >> 8;
1737  s->pending_buf[s->pending - 2] = ~len;
1738  s->pending_buf[s->pending - 1] = ~len >> 8;
1739 
1740  /* Write the stored block header bytes. */
1741  flush_pending(s->strm);
1742 
1743 #ifdef ZLIB_DEBUG
1744  /* Update debugging counts for the data about to be copied. */
1745  s->compressed_len += len << 3;
1746  s->bits_sent += len << 3;
1747 #endif
1748 
1749  /* Copy uncompressed bytes from the window to next_out. */
1750  if (left) {
1751  if (left > len)
1752  left = len;
1753  zmemcpy(s->strm->next_out, s->window + s->block_start, left);
1754  s->strm->next_out += left;
1755  s->strm->avail_out -= left;
1756  s->strm->total_out += left;
1757  s->block_start += left;
1758  len -= left;
1759  }
1760 
1761  /* Copy uncompressed bytes directly from next_in to next_out, updating
1762  * the check value.
1763  */
1764  if (len) {
1765  read_buf(s->strm, s->strm->next_out, len);
1766  s->strm->next_out += len;
1767  s->strm->avail_out -= len;
1768  s->strm->total_out += len;
1769  }
1770  } while (last == 0);
1771 
1772  /* Update the sliding window with the last s->w_size bytes of the copied
1773  * data, or append all of the copied data to the existing window if less
1774  * than s->w_size bytes were copied. Also update the number of bytes to
1775  * insert in the hash tables, in the event that deflateParams() switches to
1776  * a non-zero compression level.
1777  */
1778  used -= s->strm->avail_in; /* number of input bytes directly copied */
1779  if (used) {
1780  /* If any input was used, then no unused input remains in the window,
1781  * therefore s->block_start == s->strstart.
1782  */
1783  if (used >= s->w_size) { /* supplant the previous history */
1784  s->matches = 2; /* clear hash */
1785  zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);
1786  s->strstart = s->w_size;
1787  s->insert = s->strstart;
1788  }
1789  else {
1790  if (s->window_size - s->strstart <= used) {
1791  /* Slide the window down. */
1792  s->strstart -= s->w_size;
1793  zmemcpy(s->window, s->window + s->w_size, s->strstart);
1794  if (s->matches < 2)
1795  s->matches++; /* add a pending slide_hash() */
1796  if (s->insert > s->strstart)
1797  s->insert = s->strstart;
1798  }
1799  zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);
1800  s->strstart += used;
1801  s->insert += MIN(used, s->w_size - s->insert);
1802  }
1803  s->block_start = s->strstart;
1804  }
1805  if (s->high_water < s->strstart)
1806  s->high_water = s->strstart;
1807 
1808  /* If the last block was written to next_out, then done. */
1809  if (last)
1810  return finish_done;
1811 
1812  /* If flushing and all input has been consumed, then done. */
1813  if (flush != Z_NO_FLUSH && flush != Z_FINISH &&
1814  s->strm->avail_in == 0 && (long)s->strstart == s->block_start)
1815  return block_done;
1816 
1817  /* Fill the window with any remaining input. */
1818  have = s->window_size - s->strstart;
1819  if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) {
1820  /* Slide the window down. */
1821  s->block_start -= s->w_size;
1822  s->strstart -= s->w_size;
1823  zmemcpy(s->window, s->window + s->w_size, s->strstart);
1824  if (s->matches < 2)
1825  s->matches++; /* add a pending slide_hash() */
1826  have += s->w_size; /* more space now */
1827  if (s->insert > s->strstart)
1828  s->insert = s->strstart;
1829  }
1830  if (have > s->strm->avail_in)
1831  have = s->strm->avail_in;
1832  if (have) {
1833  read_buf(s->strm, s->window + s->strstart, have);
1834  s->strstart += have;
1835  s->insert += MIN(have, s->w_size - s->insert);
1836  }
1837  if (s->high_water < s->strstart)
1838  s->high_water = s->strstart;
1839 
1840  /* There was not enough avail_out to write a complete worthy or flushed
1841  * stored block to next_out. Write a stored block to pending instead, if we
1842  * have enough input for a worthy block, or if flushing and there is enough
1843  * room for the remaining input as a stored block in the pending buffer.
1844  */
1845  have = (s->bi_valid + 42) >> 3; /* number of header bytes */
1846  /* maximum stored block length that will fit in pending: */
1847  have = MIN(s->pending_buf_size - have, MAX_STORED);
1848  min_block = MIN(have, s->w_size);
1849  left = s->strstart - s->block_start;
1850  if (left >= min_block ||
1851  ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH &&
1852  s->strm->avail_in == 0 && left <= have)) {
1853  len = MIN(left, have);
1854  last = flush == Z_FINISH && s->strm->avail_in == 0 &&
1855  len == left ? 1 : 0;
1856  _tr_stored_block(s, (charf *)s->window + s->block_start, len, last);
1857  s->block_start += len;
1858  flush_pending(s->strm);
1859  }
1860 
1861  /* We've done all we can with the available input and output. */
1862  return last ? finish_started : need_more;
1863 }
size_t len
Definition: 6502dis.c:15
#define MIN(a, b)
Definition: deflate.c:1668
unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size)
Definition: deflate.c:1204
#define MAX_STORED
Definition: deflate.c:1665
if(dbg->bits==RZ_SYS_BITS_64)
Definition: windows-arm64.h:4

References _tr_stored_block(), block_done, finish_done, finish_started, flush_pending(), if(), L, len, MAX_STORED, MIN, need_more, read_buf(), s, Z_FINISH, Z_NO_FLUSH, and zmemcpy().

Referenced by deflate().

◆ deflateBound()

uLong ZEXPORT deflateBound ( z_streamp  strm,
uLong  sourceLen 
)

Definition at line 693 of file deflate.c.

696 {
697  deflate_state *s;
698  uLong complen, wraplen;
699 
700  /* conservative upper bound for compressed data */
701  complen = sourceLen +
702  ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
703 
704  /* if can't get parameters, return conservative bound plus zlib wrapper */
705  if (deflateStateCheck(strm))
706  return complen + 6;
707 
708  /* compute wrapper length */
709  s = strm->state;
710  switch (s->wrap) {
711  case 0: /* raw deflate */
712  wraplen = 0;
713  break;
714  case 1: /* zlib wrapper */
715  wraplen = 6 + (s->strstart ? 4 : 0);
716  break;
717 #ifdef GZIP
718  case 2: /* gzip wrapper */
719  wraplen = 18;
720  if (s->gzhead != Z_NULL) { /* user-supplied gzip header */
721  Bytef *str;
722  if (s->gzhead->extra != Z_NULL)
723  wraplen += 2 + s->gzhead->extra_len;
724  str = s->gzhead->name;
725  if (str != Z_NULL)
726  do {
727  wraplen++;
728  } while (*str++);
729  str = s->gzhead->comment;
730  if (str != Z_NULL)
731  do {
732  wraplen++;
733  } while (*str++);
734  if (s->gzhead->hcrc)
735  wraplen += 2;
736  }
737  break;
738 #endif
739  default: /* for compiler happiness */
740  wraplen = 6;
741  }
742 
743  /* if not default parameters, return conservative bound */
744  if (s->w_bits != 15 || s->hash_bits != 8 + 7)
745  return complen + wraplen;
746 
747  /* default settings: return tight bound for that case */
748  return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
749  (sourceLen >> 25) + 13 - 6 + wraplen;
750 }
unsigned long uLong
Definition: zconf.h:394

References deflateStateCheck(), s, cmd_descs_generate::str, strm, and Z_NULL.

◆ deflateCopy()

int ZEXPORT deflateCopy ( z_streamp  dest,
z_streamp  source 
)

Definition at line 1145 of file deflate.c.

1148 {
1149 #ifdef MAXSEG_64K
1150  return Z_STREAM_ERROR;
1151 #else
1152  deflate_state *ds;
1153  deflate_state *ss;
1154 
1155 
1156  if (deflateStateCheck(source) || dest == Z_NULL) {
1157  return Z_STREAM_ERROR;
1158  }
1159 
1160  ss = source->state;
1161 
1162  zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
1163 
1164  ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
1165  if (ds == Z_NULL) return Z_MEM_ERROR;
1166  dest->state = (struct internal_state FAR *) ds;
1167  zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
1168  ds->strm = dest;
1169 
1170  ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
1171  ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
1172  ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
1173  ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4);
1174 
1175  if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
1176  ds->pending_buf == Z_NULL) {
1177  deflateEnd (dest);
1178  return Z_MEM_ERROR;
1179  }
1180  /* following zmemcpy do not work for 16-bit MSDOS */
1181  zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
1182  zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
1183  zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
1184  zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
1185 
1186  ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
1187  ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
1188 
1189  ds->l_desc.dyn_tree = ds->dyn_ltree;
1190  ds->d_desc.dyn_tree = ds->dyn_dtree;
1191  ds->bl_desc.dyn_tree = ds->bl_tree;
1192 
1193  return Z_OK;
1194 #endif /* MAXSEG_64K */
1195 }
int ZEXPORT deflateEnd(z_streamp strm)
Definition: deflate.c:1119
Pos FAR Posf
Definition: deflate.h:93
const char * source
Definition: lz4.h:699
char * dest
Definition: lz4.h:697
Byte FAR * voidpf
Definition: zconf.h:413
#define FAR
Definition: zconf.h:387
#define Z_MEM_ERROR
Definition: zlib.h:183
#define ZALLOC(strm, items, size)
Definition: zutil.h:265
uch FAR uchf
Definition: zutil.h:40

References internal_state::bl_desc, internal_state::bl_tree, internal_state::d_desc, deflateEnd(), deflateStateCheck(), dest, internal_state::dyn_dtree, internal_state::dyn_ltree, tree_desc_s::dyn_tree, FAR, internal_state::hash_size, internal_state::head, internal_state::l_desc, internal_state::lit_bufsize, internal_state::pending_buf, internal_state::pending_buf_size, internal_state::pending_out, internal_state::prev, source, internal_state::strm, internal_state::sym_buf, internal_state::w_size, internal_state::window, Z_MEM_ERROR, Z_NULL, Z_OK, Z_STREAM_ERROR, ZALLOC, and zmemcpy().

◆ deflateEnd()

int ZEXPORT deflateEnd ( z_streamp  strm)

Definition at line 1119 of file deflate.c.

1121 {
1122  int status;
1123 
1124  if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
1125 
1126  status = strm->state->status;
1127 
1128  /* Deallocate in reverse order of allocations: */
1129  TRY_FREE(strm, strm->state->pending_buf);
1130  TRY_FREE(strm, strm->state->head);
1131  TRY_FREE(strm, strm->state->prev);
1132  TRY_FREE(strm, strm->state->window);
1133 
1134  ZFREE(strm, strm->state);
1135  strm->state = Z_NULL;
1136 
1137  return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
1138 }
static const char struct stat static buf struct stat static buf static vhangup int status
Definition: sflib.h:145
#define Z_DATA_ERROR
Definition: zlib.h:182
#define ZFREE(strm, addr)
Definition: zutil.h:267
#define TRY_FREE(s, p)
Definition: zutil.h:268

References BUSY_STATE, deflateStateCheck(), status, strm, TRY_FREE, Z_DATA_ERROR, Z_NULL, Z_OK, Z_STREAM_ERROR, and ZFREE.

Referenced by compress2(), def(), deflateCopy(), deflateInit2_(), end(), gzclose_w(), gztack(), log_compress(), main(), and zipCloseFileInZipRaw64().

◆ deflateGetDictionary()

int ZEXPORT deflateGetDictionary ( z_streamp  strm,
Bytef dictionary,
uInt dictLength 
)

Definition at line 485 of file deflate.c.

489 {
490  deflate_state *s;
491  uInt len;
492 
493  if (deflateStateCheck(strm))
494  return Z_STREAM_ERROR;
495  s = strm->state;
496  len = s->strstart + s->lookahead;
497  if (len > s->w_size)
498  len = s->w_size;
499  if (dictionary != Z_NULL && len)
500  zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len);
501  if (dictLength != Z_NULL)
502  *dictLength = len;
503  return Z_OK;
504 }

References deflateStateCheck(), len, s, strm, Z_NULL, Z_OK, Z_STREAM_ERROR, and zmemcpy().

◆ deflateInit2_()

int ZEXPORT deflateInit2_ ( z_streamp  strm,
int  level,
int  method,
int  windowBits,
int  memLevel,
int  strategy,
const char *  version,
int  stream_size 
)

Definition at line 243 of file deflate.c.

253 {
254  deflate_state *s;
255  int wrap = 1;
256  static const char my_version[] = ZLIB_VERSION;
257 
258  if (version == Z_NULL || version[0] != my_version[0] ||
259  stream_size != sizeof(z_stream)) {
260  return Z_VERSION_ERROR;
261  }
262  if (strm == Z_NULL) return Z_STREAM_ERROR;
263 
264  strm->msg = Z_NULL;
265  if (strm->zalloc == (alloc_func)0) {
266 #ifdef Z_SOLO
267  return Z_STREAM_ERROR;
268 #else
269  strm->zalloc = zcalloc;
270  strm->opaque = (voidpf)0;
271 #endif
272  }
273  if (strm->zfree == (free_func)0)
274 #ifdef Z_SOLO
275  return Z_STREAM_ERROR;
276 #else
277  strm->zfree = zcfree;
278 #endif
279 
280 #ifdef FASTEST
281  if (level != 0) level = 1;
282 #else
283  if (level == Z_DEFAULT_COMPRESSION) level = 6;
284 #endif
285 
286  if (windowBits < 0) { /* suppress zlib wrapper */
287  wrap = 0;
288  windowBits = -windowBits;
289  }
290 #ifdef GZIP
291  else if (windowBits > 15) {
292  wrap = 2; /* write gzip wrapper instead */
293  windowBits -= 16;
294  }
295 #endif
296  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
297  windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
298  strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) {
299  return Z_STREAM_ERROR;
300  }
301  if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */
302  s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
303  if (s == Z_NULL) return Z_MEM_ERROR;
304  strm->state = (struct internal_state FAR *)s;
305  s->strm = strm;
306  s->status = INIT_STATE; /* to pass state test in deflateReset() */
307 
308  s->wrap = wrap;
309  s->gzhead = Z_NULL;
310  s->w_bits = (uInt)windowBits;
311  s->w_size = 1 << s->w_bits;
312  s->w_mask = s->w_size - 1;
313 
314  s->hash_bits = (uInt)memLevel + 7;
315  s->hash_size = 1 << s->hash_bits;
316  s->hash_mask = s->hash_size - 1;
317  s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
318 
319  s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
320  s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
321  s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
322 
323  s->high_water = 0; /* nothing written to s->window yet */
324 
325  s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
326 
327  /* We overlay pending_buf and sym_buf. This works since the average size
328  * for length/distance pairs over any compressed block is assured to be 31
329  * bits or less.
330  *
331  * Analysis: The longest fixed codes are a length code of 8 bits plus 5
332  * extra bits, for lengths 131 to 257. The longest fixed distance codes are
333  * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest
334  * possible fixed-codes length/distance pair is then 31 bits total.
335  *
336  * sym_buf starts one-fourth of the way into pending_buf. So there are
337  * three bytes in sym_buf for every four bytes in pending_buf. Each symbol
338  * in sym_buf is three bytes -- two for the distance and one for the
339  * literal/length. As each symbol is consumed, the pointer to the next
340  * sym_buf value to read moves forward three bytes. From that symbol, up to
341  * 31 bits are written to pending_buf. The closest the written pending_buf
342  * bits gets to the next sym_buf symbol to read is just before the last
343  * code is written. At that time, 31*(n-2) bits have been written, just
344  * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at
345  * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1
346  * symbols are written.) The closest the writing gets to what is unread is
347  * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and
348  * can range from 128 to 32768.
349  *
350  * Therefore, at a minimum, there are 142 bits of space between what is
351  * written and what is read in the overlain buffers, so the symbols cannot
352  * be overwritten by the compressed data. That space is actually 139 bits,
353  * due to the three-bit fixed-code block header.
354  *
355  * That covers the case where either Z_FIXED is specified, forcing fixed
356  * codes, or when the use of fixed codes is chosen, because that choice
357  * results in a smaller compressed block than dynamic codes. That latter
358  * condition then assures that the above analysis also covers all dynamic
359  * blocks. A dynamic-code block will only be chosen to be emitted if it has
360  * fewer bits than a fixed-code block would for the same set of symbols.
361  * Therefore its average symbol length is assured to be less than 31. So
362  * the compressed data for a dynamic block also cannot overwrite the
363  * symbols from which it is being constructed.
364  */
365 
366  s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4);
367  s->pending_buf_size = (ulg)s->lit_bufsize * 4;
368 
369  if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
370  s->pending_buf == Z_NULL) {
371  s->status = FINISH_STATE;
372  strm->msg = ERR_MSG(Z_MEM_ERROR);
373  deflateEnd (strm);
374  return Z_MEM_ERROR;
375  }
376  s->sym_buf = s->pending_buf + s->lit_bufsize;
377  s->sym_end = (s->lit_bufsize - 1) * 3;
378  /* We avoid equality with lit_bufsize*3 because of wraparound at 64K
379  * on 16 bit machines and because stored blocks are restricted to
380  * 64K-1 bytes.
381  */
382 
383  s->level = level;
384  s->strategy = strategy;
385  s->method = (Byte)method;
386 
387  return deflateReset(strm);
388 }
int ZEXPORT deflateReset(z_streamp strm)
Definition: deflate.c:545
#define MAX_MEM_LEVEL
Definition: zconf.h:260
#define ZLIB_VERSION
Definition: zlib.h:40
#define Z_VERSION_ERROR
Definition: zlib.h:185
#define Z_FIXED
Definition: zlib.h:199
#define Z_DEFAULT_COMPRESSION
Definition: zlib.h:193
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
Definition: zutil.c:315
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
Definition: zutil.c:305
#define ERR_MSG(err)
Definition: zutil.h:59

References deflateEnd(), deflateReset(), ERR_MSG, FAR, FINISH_STATE, if(), INIT_STATE, level, MAX_MEM_LEVEL, internal_state::method, MIN_MATCH, s, internal_state::strategy, strm, internal_state::wrap, Z_DEFAULT_COMPRESSION, Z_DEFLATED, Z_FIXED, Z_MEM_ERROR, Z_NULL, Z_STREAM_ERROR, Z_VERSION_ERROR, ZALLOC, zcalloc(), zcfree(), and ZLIB_VERSION.

Referenced by deflateInit_().

◆ deflateInit_()

int ZEXPORT deflateInit_ ( z_streamp  strm,
int  level,
const char *  version,
int  stream_size 
)

Definition at line 231 of file deflate.c.

236 {
238  Z_DEFAULT_STRATEGY, version, stream_size);
239  /* To do: ignore strm->next_in if we use it as window */
240 }
int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)
Definition: deflate.c:243
#define MAX_WBITS
Definition: flirt.c:105
#define DEF_MEM_LEVEL
Definition: zip.h:83
#define Z_DEFAULT_STRATEGY
Definition: zlib.h:200

References DEF_MEM_LEVEL, deflateInit2_(), level, MAX_WBITS, strm, Z_DEFAULT_STRATEGY, and Z_DEFLATED.

◆ deflateParams()

int ZEXPORT deflateParams ( z_streamp  strm,
int  level,
int  strategy 
)

Definition at line 609 of file deflate.c.

613 {
614  deflate_state *s;
615  compress_func func;
616 
618  s = strm->state;
619 
620 #ifdef FASTEST
621  if (level != 0) level = 1;
622 #else
623  if (level == Z_DEFAULT_COMPRESSION) level = 6;
624 #endif
625  if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
626  return Z_STREAM_ERROR;
627  }
628  func = configuration_table[s->level].func;
629 
630  if ((strategy != s->strategy || func != configuration_table[level].func) &&
631  s->last_flush != -2) {
632  /* Flush the last buffer: */
633  int err = deflate(strm, Z_BLOCK);
634  if (err == Z_STREAM_ERROR)
635  return err;
636  if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead)
637  return Z_BUF_ERROR;
638  }
639  if (s->level != level) {
640  if (s->level == 0 && s->matches != 0) {
641  if (s->matches == 1)
642  slide_hash(s);
643  else
644  CLEAR_HASH(s);
645  s->matches = 0;
646  }
647  s->level = level;
648  s->max_lazy_match = configuration_table[level].max_lazy;
649  s->good_match = configuration_table[level].good_length;
650  s->nice_match = configuration_table[level].nice_length;
651  s->max_chain_length = configuration_table[level].max_chain;
652  }
653  s->strategy = strategy;
654  return Z_OK;
655 }
static bool err
Definition: armass.c:435
int ZEXPORT deflate(z_streamp strm, int flush)
Definition: deflate.c:804
void slide_hash(deflate_state *s)
Definition: deflate.c:204
ush good_length
Definition: deflate.c:121
ush max_chain
Definition: deflate.c:124
compress_func func
Definition: deflate.c:125
ush nice_length
Definition: deflate.c:123
ush max_lazy
Definition: deflate.c:122

References lzma_stream::avail_in, CLEAR_HASH, configuration_table, deflate(), deflateStateCheck(), err, config_s::func, config_s::good_length, level, config_s::max_chain, config_s::max_lazy, config_s::nice_length, s, slide_hash(), internal_state::strategy, strm, Z_BLOCK, Z_BUF_ERROR, Z_DEFAULT_COMPRESSION, Z_FIXED, Z_OK, and Z_STREAM_ERROR.

Referenced by gzsetparams().

◆ deflatePending()

int ZEXPORT deflatePending ( z_streamp  strm,
unsigned pending,
int bits 
)

Definition at line 568 of file deflate.c.

572 {
574  if (pending != Z_NULL)
575  *pending = strm->state->pending;
576  if (bits != Z_NULL)
577  *bits = strm->state->bi_valid;
578  return Z_OK;
579 }
int bits(struct state *s, int need)
Definition: blast.c:72

References bits(), deflateStateCheck(), internal_state::pending, strm, Z_NULL, Z_OK, and Z_STREAM_ERROR.

◆ deflatePrime()

int ZEXPORT deflatePrime ( z_streamp  strm,
int  bits,
int  value 
)

Definition at line 582 of file deflate.c.

586 {
587  deflate_state *s;
588  int put;
589 
591  s = strm->state;
592  if (bits < 0 || bits > 16 ||
593  s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
594  return Z_BUF_ERROR;
595  do {
596  put = Buf_size - s->bi_valid;
597  if (put > bits)
598  put = bits;
599  s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
600  s->bi_valid += put;
601  _tr_flush_bits(s);
602  value >>= put;
603  bits -= put;
604  } while (bits);
605  return Z_OK;
606 }
static int value
Definition: cmd_api.c:93
#define Buf_size
Definition: deflate.h:51
void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s)
Definition: trees.c:887
unsigned short ush
Definition: zutil.h:41

References _tr_flush_bits(), bits(), Buf_size, deflateStateCheck(), s, strm, value, Z_BUF_ERROR, Z_OK, and Z_STREAM_ERROR.

Referenced by gzscan(), and log_compress().

◆ deflateReset()

int ZEXPORT deflateReset ( z_streamp  strm)

Definition at line 545 of file deflate.c.

547 {
548  int ret;
549 
550  ret = deflateResetKeep(strm);
551  if (ret == Z_OK)
552  lm_init(strm->state);
553  return ret;
554 }
int ZEXPORT deflateResetKeep(z_streamp strm)
Definition: deflate.c:507
void lm_init(deflate_state *s)
Definition: deflate.c:1234

References deflateResetKeep(), lm_init(), strm, and Z_OK.

Referenced by deflateInit2_(), gz_comp(), and main().

◆ deflateResetKeep()

int ZEXPORT deflateResetKeep ( z_streamp  strm)

Definition at line 507 of file deflate.c.

509 {
510  deflate_state *s;
511 
512  if (deflateStateCheck(strm)) {
513  return Z_STREAM_ERROR;
514  }
515 
516  strm->total_in = strm->total_out = 0;
517  strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
518  strm->data_type = Z_UNKNOWN;
519 
520  s = (deflate_state *)strm->state;
521  s->pending = 0;
522  s->pending_out = s->pending_buf;
523 
524  if (s->wrap < 0) {
525  s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
526  }
527  s->status =
528 #ifdef GZIP
529  s->wrap == 2 ? GZIP_STATE :
530 #endif
531  INIT_STATE;
532  strm->adler =
533 #ifdef GZIP
534  s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
535 #endif
536  adler32(0L, Z_NULL, 0);
537  s->last_flush = -2;
538 
539  _tr_init(s);
540 
541  return Z_OK;
542 }
uint64_t total_out
Definition: base.h:492
void ZLIB_INTERNAL _tr_init(deflate_state *s)
Definition: trees.c:379
#define Z_UNKNOWN
Definition: zlib.h:206

References _tr_init(), adler32(), crc32(), deflateStateCheck(), GZIP_STATE, if(), INIT_STATE, L, s, strm, lzma_stream::total_in, lzma_stream::total_out, Z_NULL, Z_OK, Z_STREAM_ERROR, and Z_UNKNOWN.

Referenced by deflateReset().

◆ deflateSetDictionary()

int ZEXPORT deflateSetDictionary ( z_streamp  strm,
const Bytef dictionary,
uInt  dictLength 
)

Definition at line 416 of file deflate.c.

420 {
421  deflate_state *s;
422  uInt str, n;
423  int wrap;
424  unsigned avail;
425  z_const unsigned char *next;
426 
427  if (deflateStateCheck(strm) || dictionary == Z_NULL)
428  return Z_STREAM_ERROR;
429  s = strm->state;
430  wrap = s->wrap;
431  if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
432  return Z_STREAM_ERROR;
433 
434  /* when using zlib wrappers, compute Adler-32 for provided dictionary */
435  if (wrap == 1)
436  strm->adler = adler32(strm->adler, dictionary, dictLength);
437  s->wrap = 0; /* avoid computing Adler-32 in read_buf */
438 
439  /* if dictionary would fill window, just replace the history */
440  if (dictLength >= s->w_size) {
441  if (wrap == 0) { /* already empty otherwise */
442  CLEAR_HASH(s);
443  s->strstart = 0;
444  s->block_start = 0L;
445  s->insert = 0;
446  }
447  dictionary += dictLength - s->w_size; /* use the tail */
448  dictLength = s->w_size;
449  }
450 
451  /* insert dictionary into window and hash */
452  avail = strm->avail_in;
453  next = strm->next_in;
454  strm->avail_in = dictLength;
455  strm->next_in = (z_const Bytef *)dictionary;
456  fill_window(s);
457  while (s->lookahead >= MIN_MATCH) {
458  str = s->strstart;
459  n = s->lookahead - (MIN_MATCH-1);
460  do {
461  UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
462 #ifndef FASTEST
463  s->prev[str & s->w_mask] = s->head[s->ins_h];
464 #endif
465  s->head[s->ins_h] = (Pos)str;
466  str++;
467  } while (--n);
468  s->strstart = str;
469  s->lookahead = MIN_MATCH-1;
470  fill_window(s);
471  }
472  s->strstart += s->lookahead;
473  s->block_start = (long)s->strstart;
474  s->insert = s->lookahead;
475  s->lookahead = 0;
476  s->match_length = s->prev_length = MIN_MATCH-1;
477  s->match_available = 0;
478  strm->next_in = next;
479  strm->avail_in = avail;
480  s->wrap = wrap;
481  return Z_OK;
482 }
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags long
Definition: sflib.h:79
int n
Definition: mipsasm.c:19
#define z_const
Definition: zconf.h:237

References adler32(), lzma_stream::avail_in, CLEAR_HASH, deflateStateCheck(), fill_window(), INIT_STATE, L, long, MIN_MATCH, n, lzma_stream::next_in, s, cmd_descs_generate::str, strm, UPDATE_HASH, internal_state::wrap, z_const, Z_NULL, Z_OK, and Z_STREAM_ERROR.

Referenced by gzscan(), and log_compress().

◆ deflateSetHeader()

int ZEXPORT deflateSetHeader ( z_streamp  strm,
gz_headerp  head 
)

Definition at line 557 of file deflate.c.

560 {
561  if (deflateStateCheck(strm) || strm->state->wrap != 2)
562  return Z_STREAM_ERROR;
563  strm->state->gzhead = head;
564  return Z_OK;
565 }

References deflateStateCheck(), test-lz4-versions::head, strm, Z_OK, and Z_STREAM_ERROR.

◆ deflateStateCheck()

int deflateStateCheck ( z_streamp  strm)

Definition at line 393 of file deflate.c.

395 {
396  deflate_state *s;
397  if (strm == Z_NULL ||
398  strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
399  return 1;
400  s = strm->state;
401  if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE &&
402 #ifdef GZIP
403  s->status != GZIP_STATE &&
404 #endif
405  s->status != EXTRA_STATE &&
406  s->status != NAME_STATE &&
407  s->status != COMMENT_STATE &&
408  s->status != HCRC_STATE &&
409  s->status != BUSY_STATE &&
410  s->status != FINISH_STATE))
411  return 1;
412  return 0;
413 }
#define GZIP
Definition: deflate.h:23

References BUSY_STATE, COMMENT_STATE, EXTRA_STATE, FINISH_STATE, GZIP, GZIP_STATE, HCRC_STATE, INIT_STATE, NAME_STATE, s, strm, and Z_NULL.

Referenced by deflate(), deflateBound(), deflateCopy(), deflateEnd(), deflateGetDictionary(), deflateParams(), deflatePending(), deflatePrime(), deflateResetKeep(), deflateSetDictionary(), deflateSetHeader(), and deflateTune().

◆ deflateTune()

int ZEXPORT deflateTune ( z_streamp  strm,
int  good_length,
int  max_lazy,
int  nice_length,
int  max_chain 
)

Definition at line 658 of file deflate.c.

664 {
665  deflate_state *s;
666 
668  s = strm->state;
669  s->good_match = (uInt)good_length;
670  s->max_lazy_match = (uInt)max_lazy;
671  s->nice_match = nice_length;
672  s->max_chain_length = (uInt)max_chain;
673  return Z_OK;
674 }

References deflateStateCheck(), s, strm, Z_OK, and Z_STREAM_ERROR.

◆ fill_window()

void fill_window ( deflate_state s)

Definition at line 1522 of file deflate.c.

1524 {
1525  unsigned n;
1526  unsigned more; /* Amount of free space at the end of the window. */
1527  uInt wsize = s->w_size;
1528 
1529  Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
1530 
1531  do {
1532  more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
1533 
1534  /* Deal with !@#$% 64K limit: */
1535  if (sizeof(int) <= 2) {
1536  if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
1537  more = wsize;
1538 
1539  } else if (more == (unsigned)(-1)) {
1540  /* Very unlikely, but possible on 16 bit machine if
1541  * strstart == 0 && lookahead == 1 (input done a byte at time)
1542  */
1543  more--;
1544  }
1545  }
1546 
1547  /* If the window is almost full and there is insufficient lookahead,
1548  * move the upper half to the lower one to make room in the upper half.
1549  */
1550  if (s->strstart >= wsize+MAX_DIST(s)) {
1551 
1552  zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more);
1553  s->match_start -= wsize;
1554  s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
1555  s->block_start -= (long) wsize;
1556  if (s->insert > s->strstart)
1557  s->insert = s->strstart;
1558  slide_hash(s);
1559  more += wsize;
1560  }
1561  if (s->strm->avail_in == 0) break;
1562 
1563  /* If there was no sliding:
1564  * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
1565  * more == window_size - lookahead - strstart
1566  * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
1567  * => more >= window_size - 2*WSIZE + 2
1568  * In the BIG_MEM or MMAP case (not yet supported),
1569  * window_size == input_size + MIN_LOOKAHEAD &&
1570  * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
1571  * Otherwise, window_size == 2*WSIZE so more >= 2.
1572  * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
1573  */
1574  Assert(more >= 2, "more < 2");
1575 
1576  n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
1577  s->lookahead += n;
1578 
1579  /* Initialize the hash value now that we have some input: */
1580  if (s->lookahead + s->insert >= MIN_MATCH) {
1581  uInt str = s->strstart - s->insert;
1582  s->ins_h = s->window[str];
1583  UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
1584 #if MIN_MATCH != 3
1585  Call UPDATE_HASH() MIN_MATCH-3 more times
1586 #endif
1587  while (s->insert) {
1588  UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
1589 #ifndef FASTEST
1590  s->prev[str & s->w_mask] = s->head[s->ins_h];
1591 #endif
1592  s->head[s->ins_h] = (Pos)str;
1593  str++;
1594  s->insert--;
1595  if (s->lookahead + s->insert < MIN_MATCH)
1596  break;
1597  }
1598  }
1599  /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
1600  * but this is not important since only literal bytes will be emitted.
1601  */
1602 
1603  } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
1604 
1605  /* If the WIN_INIT bytes after the end of the current data have never been
1606  * written, then zero those bytes in order to avoid memory check reports of
1607  * the use of uninitialized (or uninitialised as Julian writes) bytes by
1608  * the longest match routines. Update the high water mark for the next
1609  * time through here. WIN_INIT is set to MAX_MATCH since the longest match
1610  * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
1611  */
1612  if (s->high_water < s->window_size) {
1613  ulg curr = s->strstart + (ulg)(s->lookahead);
1614  ulg init;
1615 
1616  if (s->high_water < curr) {
1617  /* Previous high water mark below current data -- zero WIN_INIT
1618  * bytes or up to end of window, whichever is less.
1619  */
1620  init = s->window_size - curr;
1621  if (init > WIN_INIT)
1622  init = WIN_INIT;
1623  zmemzero(s->window + curr, (unsigned)init);
1624  s->high_water = curr + init;
1625  }
1626  else if (s->high_water < (ulg)curr + WIN_INIT) {
1627  /* High water mark at or above current data, but below current data
1628  * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
1629  * to end of window, whichever is less.
1630  */
1631  init = (ulg)curr + WIN_INIT - s->high_water;
1632  if (init > s->window_size - s->high_water)
1633  init = s->window_size - s->high_water;
1634  zmemzero(s->window + s->high_water, (unsigned)init);
1635  s->high_water += init;
1636  }
1637  }
1638 
1639  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
1640  "not enough room for search");
1641 }
#define WIN_INIT
Definition: deflate.h:289
static void struct sockaddr socklen_t static fromlen static backlog static fork char char char static envp int struct rusage static rusage struct utsname static buf struct sembuf unsigned
Definition: sflib.h:97
bool init
Definition: core.c:77
void ZLIB_INTERNAL zmemzero(Bytef *dest, uInt len)
Definition: zutil.c:173

References Assert, if(), init, long, MAX_DIST, MIN_LOOKAHEAD, MIN_MATCH, n, read_buf(), s, slide_hash(), cmd_descs_generate::str, times, unsigned, UPDATE_HASH, WIN_INIT, zmemcpy(), and zmemzero().

Referenced by deflate_fast(), deflate_huff(), deflate_rle(), deflate_slow(), and deflateSetDictionary().

◆ flush_pending()

void flush_pending ( z_streamp  strm)

Definition at line 771 of file deflate.c.

773 {
774  unsigned len;
775  deflate_state *s = strm->state;
776 
777  _tr_flush_bits(s);
778  len = s->pending;
779  if (len > strm->avail_out) len = strm->avail_out;
780  if (len == 0) return;
781 
782  zmemcpy(strm->next_out, s->pending_out, len);
783  strm->next_out += len;
784  s->pending_out += len;
785  strm->total_out += len;
786  strm->avail_out -= len;
787  s->pending -= len;
788  if (s->pending == 0) {
789  s->pending_out = s->pending_buf;
790  }
791 }

References _tr_flush_bits(), lzma_stream::avail_out, len, lzma_stream::next_out, s, strm, lzma_stream::total_out, and zmemcpy().

Referenced by deflate(), and deflate_stored().

◆ lm_init()

void lm_init ( deflate_state s)

Definition at line 1234 of file deflate.c.

1236 {
1237  s->window_size = (ulg)2L*s->w_size;
1238 
1239  CLEAR_HASH(s);
1240 
1241  /* Set the default configuration parameters:
1242  */
1243  s->max_lazy_match = configuration_table[s->level].max_lazy;
1244  s->good_match = configuration_table[s->level].good_length;
1245  s->nice_match = configuration_table[s->level].nice_length;
1246  s->max_chain_length = configuration_table[s->level].max_chain;
1247 
1248  s->strstart = 0;
1249  s->block_start = 0L;
1250  s->lookahead = 0;
1251  s->insert = 0;
1252  s->match_length = s->prev_length = MIN_MATCH-1;
1253  s->match_available = 0;
1254  s->ins_h = 0;
1255 #ifndef FASTEST
1256 #ifdef ASMV
1257  match_init(); /* initialize the asm code */
1258 #endif
1259 #endif
1260 }

References CLEAR_HASH, configuration_table, config_s::good_length, L, config_s::max_chain, config_s::max_lazy, MIN_MATCH, config_s::nice_length, and s.

Referenced by deflateReset().

◆ longest_match()

uInt longest_match ( deflate_state s,
IPos  cur_match 
)

Definition at line 1276 of file deflate.c.

1279 {
1280  unsigned chain_length = s->max_chain_length;/* max hash chain length */
1281  register Bytef *scan = s->window + s->strstart; /* current string */
1282  register Bytef *match; /* matched string */
1283  register int len; /* length of current match */
1284  int best_len = (int)s->prev_length; /* best match length so far */
1285  int nice_match = s->nice_match; /* stop if match long enough */
1286  IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
1287  s->strstart - (IPos)MAX_DIST(s) : NIL;
1288  /* Stop when cur_match becomes <= limit. To simplify the code,
1289  * we prevent matches with the string of window index 0.
1290  */
1291  Posf *prev = s->prev;
1292  uInt wmask = s->w_mask;
1293 
1294 #ifdef UNALIGNED_OK
1295  /* Compare two bytes at a time. Note: this is not always beneficial.
1296  * Try with and without -DUNALIGNED_OK to check.
1297  */
1298  register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
1299  register ush scan_start = *(ushf*)scan;
1300  register ush scan_end = *(ushf*)(scan+best_len-1);
1301 #else
1302  register Bytef *strend = s->window + s->strstart + MAX_MATCH;
1303  register Byte scan_end1 = scan[best_len-1];
1304  register Byte scan_end = scan[best_len];
1305 #endif
1306 
1307  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
1308  * It is easy to get rid of this optimization if necessary.
1309  */
1310  Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
1311 
1312  /* Do not waste too much time if we already have a good match: */
1313  if (s->prev_length >= s->good_match) {
1314  chain_length >>= 2;
1315  }
1316  /* Do not look for matches beyond the end of the input. This is necessary
1317  * to make deflate deterministic.
1318  */
1319  if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead;
1320 
1321  Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
1322 
1323  do {
1324  Assert(cur_match < s->strstart, "no future");
1325  match = s->window + cur_match;
1326 
1327  /* Skip to next match if the match length cannot increase
1328  * or if the match length is less than 2. Note that the checks below
1329  * for insufficient lookahead only occur occasionally for performance
1330  * reasons. Therefore uninitialized memory will be accessed, and
1331  * conditional jumps will be made that depend on those values.
1332  * However the length of the match is limited to the lookahead, so
1333  * the output of deflate is not affected by the uninitialized values.
1334  */
1335 #if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
1336  /* This code assumes sizeof(unsigned short) == 2. Do not use
1337  * UNALIGNED_OK if your compiler uses a different size.
1338  */
1339  if (*(ushf*)(match+best_len-1) != scan_end ||
1340  *(ushf*)match != scan_start) continue;
1341 
1342  /* It is not necessary to compare scan[2] and match[2] since they are
1343  * always equal when the other bytes match, given that the hash keys
1344  * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
1345  * strstart+3, +5, ... up to strstart+257. We check for insufficient
1346  * lookahead only every 4th comparison; the 128th check will be made
1347  * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
1348  * necessary to put more guard bytes at the end of the window, or
1349  * to check more often for insufficient lookahead.
1350  */
1351  Assert(scan[2] == match[2], "scan[2]?");
1352  scan++, match++;
1353  do {
1354  } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
1355  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
1356  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
1357  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
1358  scan < strend);
1359  /* The funny "do {}" generates better code on most compilers */
1360 
1361  /* Here, scan <= window+strstart+257 */
1362  Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
1363  if (*scan == *match) scan++;
1364 
1365  len = (MAX_MATCH - 1) - (int)(strend-scan);
1366  scan = strend - (MAX_MATCH-1);
1367 
1368 #else /* UNALIGNED_OK */
1369 
1370  if (match[best_len] != scan_end ||
1371  match[best_len-1] != scan_end1 ||
1372  *match != *scan ||
1373  *++match != scan[1]) continue;
1374 
1375  /* The check at best_len-1 can be removed because it will be made
1376  * again later. (This heuristic is not always a win.)
1377  * It is not necessary to compare scan[2] and match[2] since they
1378  * are always equal when the other bytes match, given that
1379  * the hash keys are equal and that HASH_BITS >= 8.
1380  */
1381  scan += 2, match++;
1382  Assert(*scan == *match, "match[2]?");
1383 
1384  /* We check for insufficient lookahead only every 8th comparison;
1385  * the 256th check will be made at strstart+258.
1386  */
1387  do {
1388  } while (*++scan == *++match && *++scan == *++match &&
1389  *++scan == *++match && *++scan == *++match &&
1390  *++scan == *++match && *++scan == *++match &&
1391  *++scan == *++match && *++scan == *++match &&
1392  scan < strend);
1393 
1394  Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
1395 
1396  len = MAX_MATCH - (int)(strend - scan);
1397  scan = strend - MAX_MATCH;
1398 
1399 #endif /* UNALIGNED_OK */
1400 
1401  if (len > best_len) {
1402  s->match_start = cur_match;
1403  best_len = len;
1404  if (len >= nice_match) break;
1405 #ifdef UNALIGNED_OK
1406  scan_end = *(ushf*)(scan+best_len-1);
1407 #else
1408  scan_end1 = scan[best_len-1];
1409  scan_end = scan[best_len];
1410 #endif
1411  }
1412  } while ((cur_match = prev[cur_match & wmask]) > limit
1413  && --chain_length != 0);
1414 
1415  if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
1416  return s->lookahead;
1417 }
unsigned char match[65280+2]
Definition: gun.c:165
static uint32_t const uint8_t uint32_t uint32_t limit
Definition: memcmplen.h:45
static int
Definition: sfsocketcall.h:114
Definition: engine.c:71
ush FAR ushf
Definition: zutil.h:42

References Assert, int, len, limit, match, MAX_DIST, MAX_MATCH, MIN_LOOKAHEAD, internal_state::nice_match, NIL, internal_state::prev, s, and internal_state::strstart.

Referenced by deflate_fast(), and deflate_slow().

◆ OF() [1/5]

void slide_hash OF ( (deflate_state *s )

◆ OF() [2/5]

uInt longest_match OF ( (deflate_state *s, IPos cur_match)  )

◆ OF() [3/5]

void putShortMSB OF ( (deflate_state *s, uInt b )

◆ OF() [4/5]

◆ OF() [5/5]

◆ putShortMSB()

void putShortMSB ( deflate_state s,
uInt  b 
)

Definition at line 757 of file deflate.c.

760 {
761  put_byte(s, (Byte)(b >> 8));
762  put_byte(s, (Byte)(b & 0xff));
763 }
#define b(i)
Definition: sha256.c:42

References b, put_byte, and s.

Referenced by deflate().

◆ read_buf()

unsigned read_buf ( z_streamp  strm,
Bytef buf,
unsigned  size 
)

Definition at line 1204 of file deflate.c.

1208 {
1209  unsigned len = strm->avail_in;
1210 
1211  if (len > size) len = size;
1212  if (len == 0) return 0;
1213 
1214  strm->avail_in -= len;
1215 
1216  zmemcpy(buf, strm->next_in, len);
1217  if (strm->state->wrap == 1) {
1218  strm->adler = adler32(strm->adler, buf, len);
1219  }
1220 #ifdef GZIP
1221  else if (strm->state->wrap == 2) {
1222  strm->adler = crc32(strm->adler, buf, len);
1223  }
1224 #endif
1225  strm->next_in += len;
1226  strm->total_in += len;
1227 
1228  return len;
1229 }
voidpf void uLong size
Definition: ioapi.h:138
voidpf void * buf
Definition: ioapi.h:138

References adler32(), lzma_stream::avail_in, crc32(), len, lzma_stream::next_in, strm, lzma_stream::total_in, and zmemcpy().

Referenced by deflate_stored(), and fill_window().

◆ slide_hash()

void slide_hash ( deflate_state s)

Definition at line 204 of file deflate.c.

206 {
207  unsigned n, m;
208  Posf *p;
209  uInt wsize = s->w_size;
210 
211  n = s->hash_size;
212  p = &s->head[n];
213  do {
214  m = *--p;
215  *p = (Pos)(m >= wsize ? m - wsize : NIL);
216  } while (--n);
217  n = wsize;
218 #ifndef FASTEST
219  p = &s->prev[n];
220  do {
221  m = *--p;
222  *p = (Pos)(m >= wsize ? m - wsize : NIL);
223  /* If n is not on any hash chain, prev[n] is garbage but
224  * its value will never be used.
225  */
226  } while (--n);
227 #endif
228 }
void * p
Definition: libc.cpp:67

References regress::m, n, NIL, p, and s.

Referenced by deflateParams(), and fill_window().

Variable Documentation

◆ configuration_table

const config configuration_table[10]
Initial value:
= {
{0, 0, 0, 0, deflate_stored},
{4, 4, 8, 4, deflate_fast},
{4, 5, 16, 8, deflate_fast},
{4, 6, 32, 32, deflate_fast},
{4, 4, 16, 16, deflate_slow},
{8, 16, 32, 32, deflate_slow},
{8, 16, 128, 128, deflate_slow},
{8, 32, 128, 256, deflate_slow},
{32, 128, 258, 1024, deflate_slow},
{32, 258, 258, 4096, deflate_slow}}
block_state deflate_fast(deflate_state *s, int flush)
Definition: deflate.c:1872
block_state deflate_slow(deflate_state *s, int flush)
Definition: deflate.c:1974

Definition at line 134 of file deflate.c.

Referenced by deflate(), deflateParams(), and lm_init().

◆ deflate_copyright

const char deflate_copyright[]
Initial value:
=
" deflate 1.2.12 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "

Definition at line 54 of file deflate.c.