123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- using System;
- namespace Org.BouncyCastle.Utilities.Zlib {
- public sealed class Deflate{
- private const int MAX_MEM_LEVEL=9;
- private const int Z_DEFAULT_COMPRESSION=-1;
- private const int MAX_WBITS=15;
- private const int DEF_MEM_LEVEL=8;
- internal class Config{
- internal int good_length;
- internal int max_lazy;
- internal int nice_length;
- internal int max_chain;
- internal int func;
- internal Config(int good_length, int max_lazy,
- int nice_length, int max_chain, int func){
- this.good_length=good_length;
- this.max_lazy=max_lazy;
- this.nice_length=nice_length;
- this.max_chain=max_chain;
- this.func=func;
- }
- }
- private const int STORED=0;
- private const int FAST=1;
- private const int SLOW=2;
- private static readonly Config[] config_table;
- static Deflate(){
- config_table=new Config[10];
-
- config_table[0]=new Config(0, 0, 0, 0, STORED);
- config_table[1]=new Config(4, 4, 8, 4, FAST);
- config_table[2]=new Config(4, 5, 16, 8, FAST);
- config_table[3]=new Config(4, 6, 32, 32, FAST);
- config_table[4]=new Config(4, 4, 16, 16, SLOW);
- config_table[5]=new Config(8, 16, 32, 32, SLOW);
- config_table[6]=new Config(8, 16, 128, 128, SLOW);
- config_table[7]=new Config(8, 32, 128, 256, SLOW);
- config_table[8]=new Config(32, 128, 258, 1024, SLOW);
- config_table[9]=new Config(32, 258, 258, 4096, SLOW);
- }
- private static readonly String[] z_errmsg = {
- "need dictionary",
- "stream end",
- "",
- "file error",
- "stream error",
- "data error",
- "insufficient memory",
- "buffer error",
- "incompatible version",
- ""
- };
-
- private const int NeedMore=0;
-
- private const int BlockDone=1;
-
- private const int FinishStarted=2;
-
- private const int FinishDone=3;
-
- private const int PRESET_DICT=0x20;
- private const int Z_FILTERED=1;
- private const int Z_HUFFMAN_ONLY=2;
- private const int Z_DEFAULT_STRATEGY=0;
- private const int Z_NO_FLUSH=0;
- private const int Z_PARTIAL_FLUSH=1;
- private const int Z_SYNC_FLUSH=2;
- private const int Z_FULL_FLUSH=3;
- private const int Z_FINISH=4;
- private const int Z_OK=0;
- private const int Z_STREAM_END=1;
- private const int Z_NEED_DICT=2;
- private const int Z_ERRNO=-1;
- private const int Z_STREAM_ERROR=-2;
- private const int Z_DATA_ERROR=-3;
- private const int Z_MEM_ERROR=-4;
- private const int Z_BUF_ERROR=-5;
- private const int Z_VERSION_ERROR=-6;
- private const int INIT_STATE=42;
- private const int BUSY_STATE=113;
- private const int FINISH_STATE=666;
-
- private const int Z_DEFLATED=8;
- private const int STORED_BLOCK=0;
- private const int STATIC_TREES=1;
- private const int DYN_TREES=2;
-
- private const int Z_BINARY=0;
- private const int Z_ASCII=1;
- private const int Z_UNKNOWN=2;
- private const int Buf_size=8*2;
-
- private const int REP_3_6=16;
-
- private const int REPZ_3_10=17;
-
- private const int REPZ_11_138=18;
- private const int MIN_MATCH=3;
- private const int MAX_MATCH=258;
- private const int MIN_LOOKAHEAD=(MAX_MATCH+MIN_MATCH+1);
- private const int MAX_BITS=15;
- private const int D_CODES=30;
- private const int BL_CODES=19;
- private const int LENGTH_CODES=29;
- private const int LITERALS=256;
- private const int L_CODES=(LITERALS+1+LENGTH_CODES);
- private const int HEAP_SIZE=(2*L_CODES+1);
- private const int END_BLOCK=256;
- internal ZStream strm;
- internal int status;
- internal byte[] pending_buf;
- internal int pending_buf_size;
- internal int pending_out;
- internal int pending;
- internal int noheader;
- internal byte data_type;
- internal byte method;
- internal int last_flush;
- internal int w_size;
- internal int w_bits;
- internal int w_mask;
- internal byte[] window;
-
-
-
-
-
-
-
- internal int window_size;
-
-
- internal short[] prev;
-
-
-
- internal short[] head;
- internal int ins_h;
- internal int hash_size;
- internal int hash_bits;
- internal int hash_mask;
-
-
-
-
- internal int hash_shift;
-
-
- internal int block_start;
- internal int match_length;
- internal int prev_match;
- internal int match_available;
- internal int strstart;
- internal int match_start;
- internal int lookahead;
-
-
- internal int prev_length;
-
-
- internal int max_chain_length;
-
-
-
- internal int max_lazy_match;
-
-
-
- internal int level;
- internal int strategy;
-
- internal int good_match;
-
- internal int nice_match;
- internal short[] dyn_ltree;
- internal short[] dyn_dtree;
- internal short[] bl_tree;
- internal ZTree l_desc=new ZTree();
- internal ZTree d_desc=new ZTree();
- internal ZTree bl_desc=new ZTree();
-
- internal short[] bl_count=new short[MAX_BITS+1];
-
- internal int[] heap=new int[2*L_CODES+1];
- internal int heap_len;
- internal int heap_max;
-
-
-
- internal byte[] depth=new byte[2*L_CODES+1];
- internal int l_buf;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- internal int lit_bufsize;
- internal int last_lit;
-
-
-
- internal int d_buf;
- internal int opt_len;
- internal int static_len;
- internal int matches;
- internal int last_eob_len;
-
-
- internal uint bi_buf;
-
-
- internal int bi_valid;
- internal Deflate(){
- dyn_ltree=new short[HEAP_SIZE*2];
- dyn_dtree=new short[(2*D_CODES+1)*2];
- bl_tree=new short[(2*BL_CODES+1)*2];
- }
- internal void lm_init() {
- window_size=2*w_size;
- head[hash_size-1]=0;
- for(int i=0; i<hash_size-1; i++){
- head[i]=0;
- }
-
- max_lazy_match = Deflate.config_table[level].max_lazy;
- good_match = Deflate.config_table[level].good_length;
- nice_match = Deflate.config_table[level].nice_length;
- max_chain_length = Deflate.config_table[level].max_chain;
- strstart = 0;
- block_start = 0;
- lookahead = 0;
- match_length = prev_length = MIN_MATCH-1;
- match_available = 0;
- ins_h = 0;
- }
-
- internal void tr_init(){
- l_desc.dyn_tree = dyn_ltree;
- l_desc.stat_desc = StaticTree.static_l_desc;
- d_desc.dyn_tree = dyn_dtree;
- d_desc.stat_desc = StaticTree.static_d_desc;
- bl_desc.dyn_tree = bl_tree;
- bl_desc.stat_desc = StaticTree.static_bl_desc;
- bi_buf = 0;
- bi_valid = 0;
- last_eob_len = 8;
-
- init_block();
- }
- internal void init_block(){
-
- for(int i = 0; i < L_CODES; i++) dyn_ltree[i*2] = 0;
- for(int i= 0; i < D_CODES; i++) dyn_dtree[i*2] = 0;
- for(int i= 0; i < BL_CODES; i++) bl_tree[i*2] = 0;
- dyn_ltree[END_BLOCK*2] = 1;
- opt_len = static_len = 0;
- last_lit = matches = 0;
- }
-
-
-
-
- internal void pqdownheap(short[] tree, // the tree to restore
- int k // node to move down
- ){
- int v = heap[k];
- int j = k << 1;
- while (j <= heap_len) {
-
- if (j < heap_len &&
- smaller(tree, heap[j+1], heap[j], depth)){
- j++;
- }
-
- if(smaller(tree, v, heap[j], depth)) break;
-
- heap[k]=heap[j]; k = j;
-
- j <<= 1;
- }
- heap[k] = v;
- }
- internal static bool smaller(short[] tree, int n, int m, byte[] depth){
- short tn2=tree[n*2];
- short tm2=tree[m*2];
- return (tn2<tm2 ||
- (tn2==tm2 && depth[n] <= depth[m]));
- }
-
-
- internal void scan_tree (short[] tree,// the tree to be scanned
- int max_code // and its largest code of non zero frequency
- ){
- int n;
- int prevlen = -1;
- int curlen;
- int nextlen = tree[0*2+1];
- int count = 0;
- int max_count = 7;
- int min_count = 4;
- if (nextlen == 0){ max_count = 138; min_count = 3; }
- tree[(max_code+1)*2+1] = -1;
- for(n = 0; n <= max_code; n++) {
- curlen = nextlen; nextlen = tree[(n+1)*2+1];
- if(++count < max_count && curlen == nextlen) {
- continue;
- }
- else if(count < min_count) {
- bl_tree[curlen*2] += (short)count;
- }
- else if(curlen != 0) {
- if(curlen != prevlen) bl_tree[curlen*2]++;
- bl_tree[REP_3_6*2]++;
- }
- else if(count <= 10) {
- bl_tree[REPZ_3_10*2]++;
- }
- else{
- bl_tree[REPZ_11_138*2]++;
- }
- count = 0; prevlen = curlen;
- if(nextlen == 0) {
- max_count = 138; min_count = 3;
- }
- else if(curlen == nextlen) {
- max_count = 6; min_count = 3;
- }
- else{
- max_count = 7; min_count = 4;
- }
- }
- }
-
-
- internal int build_bl_tree(){
- int max_blindex;
-
- scan_tree(dyn_ltree, l_desc.max_code);
- scan_tree(dyn_dtree, d_desc.max_code);
-
- bl_desc.build_tree(this);
-
-
-
-
-
- for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
- if (bl_tree[ZTree.bl_order[max_blindex]*2+1] != 0) break;
- }
-
- opt_len += 3*(max_blindex+1) + 5+5+4;
- return max_blindex;
- }
-
-
-
- internal void send_all_trees(int lcodes, int dcodes, int blcodes){
- int rank;
- send_bits(lcodes-257, 5);
- send_bits(dcodes-1, 5);
- send_bits(blcodes-4, 4);
- for (rank = 0; rank < blcodes; rank++) {
- send_bits(bl_tree[ZTree.bl_order[rank]*2+1], 3);
- }
- send_tree(dyn_ltree, lcodes-1);
- send_tree(dyn_dtree, dcodes-1);
- }
-
-
- internal void send_tree (short[] tree,// the tree to be sent
- int max_code // and its largest code of non zero frequency
- ){
- int n;
- int prevlen = -1;
- int curlen;
- int nextlen = tree[0*2+1];
- int count = 0;
- int max_count = 7;
- int min_count = 4;
- if (nextlen == 0){ max_count = 138; min_count = 3; }
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen; nextlen = tree[(n+1)*2+1];
- if(++count < max_count && curlen == nextlen) {
- continue;
- }
- else if(count < min_count) {
- do { send_code(curlen, bl_tree); } while (--count != 0);
- }
- else if(curlen != 0){
- if(curlen != prevlen){
- send_code(curlen, bl_tree); count--;
- }
- send_code(REP_3_6, bl_tree);
- send_bits(count-3, 2);
- }
- else if(count <= 10){
- send_code(REPZ_3_10, bl_tree);
- send_bits(count-3, 3);
- }
- else{
- send_code(REPZ_11_138, bl_tree);
- send_bits(count-11, 7);
- }
- count = 0; prevlen = curlen;
- if(nextlen == 0){
- max_count = 138; min_count = 3;
- }
- else if(curlen == nextlen){
- max_count = 6; min_count = 3;
- }
- else{
- max_count = 7; min_count = 4;
- }
- }
- }
-
-
- internal void put_byte(byte[] p, int start, int len){
- System.Array.Copy(p, start, pending_buf, pending, len);
- pending+=len;
- }
- internal void put_byte(byte c){
- pending_buf[pending++]=c;
- }
- internal void put_short(int w) {
- pending_buf[pending++]=(byte)(w);
- pending_buf[pending++]=(byte)(w>>8);
- }
- internal void putShortMSB(int b){
- pending_buf[pending++]=(byte)(b>>8);
- pending_buf[pending++]=(byte)(b);
- }
- internal void send_code(int c, short[] tree){
- int c2=c*2;
- send_bits((tree[c2]&0xffff), (tree[c2+1]&0xffff));
- }
- internal void send_bits(int val, int length){
- if (bi_valid > Buf_size - length) {
- bi_buf |= (uint)(val << bi_valid);
- pending_buf[pending++]=(byte)(bi_buf);
- pending_buf[pending++]=(byte)(bi_buf>>8);
- bi_buf = ((uint)val) >> (Buf_size - bi_valid);
- bi_valid += length - Buf_size;
- } else {
- bi_buf |= (uint)(val << bi_valid);
- bi_valid += length;
- }
- }
-
-
-
-
-
-
-
-
-
- internal void _tr_align(){
- send_bits(STATIC_TREES<<1, 3);
- send_code(END_BLOCK, StaticTree.static_ltree);
- bi_flush();
-
-
-
-
- if (1 + last_eob_len + 10 - bi_valid < 9) {
- send_bits(STATIC_TREES<<1, 3);
- send_code(END_BLOCK, StaticTree.static_ltree);
- bi_flush();
- }
- last_eob_len = 7;
- }
-
-
- internal bool _tr_tally (int dist,
- int lc
- ){
- pending_buf[d_buf+last_lit*2] = (byte)(dist>>8);
- pending_buf[d_buf+last_lit*2+1] = (byte)dist;
- pending_buf[l_buf+last_lit] = (byte)lc; last_lit++;
- if (dist == 0) {
-
- dyn_ltree[lc*2]++;
- }
- else {
- matches++;
-
- dist--;
- dyn_ltree[(ZTree._length_code[lc]+LITERALS+1)*2]++;
- dyn_dtree[ZTree.d_code(dist)*2]++;
- }
- if ((last_lit & 0x1fff) == 0 && level > 2) {
-
- int out_length = last_lit*8;
- int in_length = strstart - block_start;
- int dcode;
- for (dcode = 0; dcode < D_CODES; dcode++) {
- out_length += (int)((int)dyn_dtree[dcode*2] *
- (5L+ZTree.extra_dbits[dcode]));
- }
- out_length >>= 3;
- if ((matches < (last_lit/2)) && out_length < in_length/2) return true;
- }
- return (last_lit == lit_bufsize-1);
-
-
-
- }
-
- internal void compress_block(short[] ltree, short[] dtree){
- int dist;
- int lc;
- int lx = 0;
- int code;
- int extra;
- if (last_lit != 0){
- do{
- dist=((pending_buf[d_buf+lx*2]<<8)&0xff00)|
- (pending_buf[d_buf+lx*2+1]&0xff);
- lc=(pending_buf[l_buf+lx])&0xff; lx++;
- if(dist == 0){
- send_code(lc, ltree);
- }
- else{
-
- code = ZTree._length_code[lc];
- send_code(code+LITERALS+1, ltree);
- extra = ZTree.extra_lbits[code];
- if(extra != 0){
- lc -= ZTree.base_length[code];
- send_bits(lc, extra);
- }
- dist--;
- code = ZTree.d_code(dist);
- send_code(code, dtree);
- extra = ZTree.extra_dbits[code];
- if (extra != 0) {
- dist -= ZTree.base_dist[code];
- send_bits(dist, extra);
- }
- }
-
- }
- while (lx < last_lit);
- }
- send_code(END_BLOCK, ltree);
- last_eob_len = ltree[END_BLOCK*2+1];
- }
-
-
-
-
- internal void set_data_type(){
- int n = 0;
- int ascii_freq = 0;
- int bin_freq = 0;
- while(n<7){ bin_freq += dyn_ltree[n*2]; n++;}
- while(n<128){ ascii_freq += dyn_ltree[n*2]; n++;}
- while(n<LITERALS){ bin_freq += dyn_ltree[n*2]; n++;}
- data_type=(byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII);
- }
-
- internal void bi_flush(){
- if (bi_valid == 16) {
- pending_buf[pending++]=(byte)(bi_buf);
- pending_buf[pending++]=(byte)(bi_buf>>8);
- bi_buf=0;
- bi_valid=0;
- }
- else if (bi_valid >= 8) {
- pending_buf[pending++]=(byte)(bi_buf);
- bi_buf>>=8;
- bi_buf &= 0x00ff;
- bi_valid-=8;
- }
- }
-
- internal void bi_windup(){
- if (bi_valid > 8) {
- pending_buf[pending++]=(byte)(bi_buf);
- pending_buf[pending++]=(byte)(bi_buf>>8);
- } else if (bi_valid > 0) {
- pending_buf[pending++]=(byte)(bi_buf);
- }
- bi_buf = 0;
- bi_valid = 0;
- }
-
-
- internal void copy_block(int buf, // the input data
- int len, // its length
- bool header // true if block header must be written
- ){
-
- bi_windup();
- last_eob_len = 8;
- if (header) {
- put_short((short)len);
- put_short((short)~len);
- }
-
-
-
-
- put_byte(window, buf, len);
- }
- internal void flush_block_only(bool eof){
- _tr_flush_block(block_start>=0 ? block_start : -1,
- strstart-block_start,
- eof);
- block_start=strstart;
- strm.flush_pending();
- }
-
-
-
-
-
-
-
- internal int deflate_stored(int flush){
-
-
- int max_block_size = 0xffff;
- int max_start;
- if(max_block_size > pending_buf_size - 5) {
- max_block_size = pending_buf_size - 5;
- }
-
- while(true){
-
- if(lookahead<=1){
- fill_window();
- if(lookahead==0 && flush==Z_NO_FLUSH) return NeedMore;
- if(lookahead==0) break;
- }
- strstart+=lookahead;
- lookahead=0;
-
- max_start=block_start+max_block_size;
- if(strstart==0|| strstart>=max_start) {
-
- lookahead = (int)(strstart-max_start);
- strstart = (int)max_start;
- flush_block_only(false);
- if(strm.avail_out==0) return NeedMore;
- }
-
-
- if(strstart-block_start >= w_size-MIN_LOOKAHEAD) {
- flush_block_only(false);
- if(strm.avail_out==0) return NeedMore;
- }
- }
- flush_block_only(flush == Z_FINISH);
- if(strm.avail_out==0)
- return (flush == Z_FINISH) ? FinishStarted : NeedMore;
- return flush == Z_FINISH ? FinishDone : BlockDone;
- }
-
- internal void _tr_stored_block(int buf,
- int stored_len,
- bool eof
- ){
- send_bits((STORED_BLOCK<<1)+(eof?1:0), 3);
- copy_block(buf, stored_len, true);
- }
-
-
- internal void _tr_flush_block(int buf,
- int stored_len,
- bool eof
- ) {
- int opt_lenb, static_lenb;
- int max_blindex = 0;
-
- if(level > 0) {
-
- if(data_type == Z_UNKNOWN) set_data_type();
-
- l_desc.build_tree(this);
- d_desc.build_tree(this);
-
-
-
-
- max_blindex=build_bl_tree();
-
- opt_lenb=(opt_len+3+7)>>3;
- static_lenb=(static_len+3+7)>>3;
- if(static_lenb<=opt_lenb) opt_lenb=static_lenb;
- }
- else {
- opt_lenb=static_lenb=stored_len+5;
- }
- if(stored_len+4<=opt_lenb && buf != -1){
-
-
-
-
-
-
- _tr_stored_block(buf, stored_len, eof);
- }
- else if(static_lenb == opt_lenb){
- send_bits((STATIC_TREES<<1)+(eof?1:0), 3);
- compress_block(StaticTree.static_ltree, StaticTree.static_dtree);
- }
- else{
- send_bits((DYN_TREES<<1)+(eof?1:0), 3);
- send_all_trees(l_desc.max_code+1, d_desc.max_code+1, max_blindex+1);
- compress_block(dyn_ltree, dyn_dtree);
- }
-
-
- init_block();
- if(eof){
- bi_windup();
- }
- }
-
-
-
-
-
-
-
-
- internal void fill_window(){
- int n, m;
- int p;
- int more;
- do{
- more = (window_size-lookahead-strstart);
-
- if(more==0 && strstart==0 && lookahead==0){
- more = w_size;
- }
- else if(more==-1) {
-
-
- more--;
-
-
- }
- else if(strstart >= w_size+ w_size-MIN_LOOKAHEAD) {
- System.Array.Copy(window, w_size, window, 0, w_size);
- match_start-=w_size;
- strstart-=w_size;
- block_start-=w_size;
-
-
-
-
-
- n = hash_size;
- p=n;
- do {
- m = (head[--p]&0xffff);
- head[p]=(short)(m>=w_size ? (m-w_size) : 0);
- }
- while (--n != 0);
- n = w_size;
- p = n;
- do {
- m = (prev[--p]&0xffff);
- prev[p] = (short)(m >= w_size ? (m-w_size) : 0);
-
-
- }
- while (--n!=0);
- more += w_size;
- }
- if (strm.avail_in == 0) return;
-
-
-
-
-
-
-
-
-
-
- n = strm.read_buf(window, strstart + lookahead, more);
- lookahead += n;
-
- if(lookahead >= MIN_MATCH) {
- ins_h = window[strstart]&0xff;
- ins_h=(((ins_h)<<hash_shift)^(window[strstart+1]&0xff))&hash_mask;
- }
-
-
- }
- while (lookahead < MIN_LOOKAHEAD && strm.avail_in != 0);
- }
-
-
-
-
-
- internal int deflate_fast(int flush){
-
- int hash_head = 0;
- bool bflush;
- while(true){
-
-
-
-
- if(lookahead < MIN_LOOKAHEAD){
- fill_window();
- if(lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH){
- return NeedMore;
- }
- if(lookahead == 0) break;
- }
-
-
- if(lookahead >= MIN_MATCH){
- ins_h=(((ins_h)<<hash_shift)^(window[(strstart)+(MIN_MATCH-1)]&0xff))&hash_mask;
-
- hash_head=(head[ins_h]&0xffff);
- prev[strstart&w_mask]=head[ins_h];
- head[ins_h]=(short)strstart;
- }
-
-
- if(hash_head!=0L &&
- ((strstart-hash_head)&0xffff) <= w_size-MIN_LOOKAHEAD
- ){
-
-
-
- if(strategy != Z_HUFFMAN_ONLY){
- match_length=longest_match (hash_head);
- }
-
- }
- if(match_length>=MIN_MATCH){
-
- bflush=_tr_tally(strstart-match_start, match_length-MIN_MATCH);
- lookahead -= match_length;
-
-
- if(match_length <= max_lazy_match &&
- lookahead >= MIN_MATCH) {
- match_length--;
- do{
- strstart++;
- ins_h=((ins_h<<hash_shift)^(window[(strstart)+(MIN_MATCH-1)]&0xff))&hash_mask;
-
- hash_head=(head[ins_h]&0xffff);
- prev[strstart&w_mask]=head[ins_h];
- head[ins_h]=(short)strstart;
-
-
- }
- while (--match_length != 0);
- strstart++;
- }
- else{
- strstart += match_length;
- match_length = 0;
- ins_h = window[strstart]&0xff;
- ins_h=(((ins_h)<<hash_shift)^(window[strstart+1]&0xff))&hash_mask;
-
-
- }
- }
- else {
-
- bflush=_tr_tally(0, window[strstart]&0xff);
- lookahead--;
- strstart++;
- }
- if (bflush){
- flush_block_only(false);
- if(strm.avail_out==0) return NeedMore;
- }
- }
- flush_block_only(flush == Z_FINISH);
- if(strm.avail_out==0){
- if(flush == Z_FINISH) return FinishStarted;
- else return NeedMore;
- }
- return flush==Z_FINISH ? FinishDone : BlockDone;
- }
-
-
-
- internal int deflate_slow(int flush){
-
- int hash_head = 0;
- bool bflush;
-
- while(true){
-
-
-
-
- if (lookahead < MIN_LOOKAHEAD) {
- fill_window();
- if(lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
- return NeedMore;
- }
- if(lookahead == 0) break;
- }
-
-
- if(lookahead >= MIN_MATCH) {
- ins_h=(((ins_h)<<hash_shift)^(window[(strstart)+(MIN_MATCH-1)]&0xff)) & hash_mask;
-
- hash_head=(head[ins_h]&0xffff);
- prev[strstart&w_mask]=head[ins_h];
- head[ins_h]=(short)strstart;
- }
-
- prev_length = match_length; prev_match = match_start;
- match_length = MIN_MATCH-1;
- if (hash_head != 0 && prev_length < max_lazy_match &&
- ((strstart-hash_head)&0xffff) <= w_size-MIN_LOOKAHEAD
- ){
-
-
-
- if(strategy != Z_HUFFMAN_ONLY) {
- match_length = longest_match(hash_head);
- }
-
- if (match_length <= 5 && (strategy == Z_FILTERED ||
- (match_length == MIN_MATCH &&
- strstart - match_start > 4096))) {
-
-
- match_length = MIN_MATCH-1;
- }
- }
-
-
- if(prev_length >= MIN_MATCH && match_length <= prev_length) {
- int max_insert = strstart + lookahead - MIN_MATCH;
-
-
- bflush=_tr_tally(strstart-1-prev_match, prev_length - MIN_MATCH);
-
-
-
-
- lookahead -= prev_length-1;
- prev_length -= 2;
- do{
- if(++strstart <= max_insert) {
- ins_h=(((ins_h)<<hash_shift)^(window[(strstart)+(MIN_MATCH-1)]&0xff))&hash_mask;
-
- hash_head=(head[ins_h]&0xffff);
- prev[strstart&w_mask]=head[ins_h];
- head[ins_h]=(short)strstart;
- }
- }
- while(--prev_length != 0);
- match_available = 0;
- match_length = MIN_MATCH-1;
- strstart++;
- if (bflush){
- flush_block_only(false);
- if(strm.avail_out==0) return NeedMore;
- }
- } else if (match_available!=0) {
-
-
-
- bflush=_tr_tally(0, window[strstart-1]&0xff);
- if (bflush) {
- flush_block_only(false);
- }
- strstart++;
- lookahead--;
- if(strm.avail_out == 0) return NeedMore;
- } else {
-
-
- match_available = 1;
- strstart++;
- lookahead--;
- }
- }
- if(match_available!=0) {
- bflush=_tr_tally(0, window[strstart-1]&0xff);
- match_available = 0;
- }
- flush_block_only(flush == Z_FINISH);
- if(strm.avail_out==0){
- if(flush == Z_FINISH) return FinishStarted;
- else return NeedMore;
- }
- return flush == Z_FINISH ? FinishDone : BlockDone;
- }
- internal int longest_match(int cur_match){
- int chain_length = max_chain_length;
- int scan = strstart;
- int match;
- int len;
- int best_len = prev_length;
- int limit = strstart>(w_size-MIN_LOOKAHEAD) ?
- strstart-(w_size-MIN_LOOKAHEAD) : 0;
- int nice_match=this.nice_match;
-
-
- int wmask = w_mask;
- int strend = strstart + MAX_MATCH;
- byte scan_end1 = window[scan+best_len-1];
- byte scan_end = window[scan+best_len];
-
-
-
- if (prev_length >= good_match) {
- chain_length >>= 2;
- }
-
-
- if (nice_match > lookahead) nice_match = lookahead;
- do {
- match = cur_match;
-
-
- if (window[match+best_len] != scan_end ||
- window[match+best_len-1] != scan_end1 ||
- window[match] != window[scan] ||
- window[++match] != window[scan+1]) continue;
-
-
-
-
-
- scan += 2; match++;
-
-
- do {
- } while (window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- window[++scan] == window[++match] &&
- scan < strend);
- len = MAX_MATCH - (int)(strend - scan);
- scan = strend - MAX_MATCH;
- if(len>best_len) {
- match_start = cur_match;
- best_len = len;
- if (len >= nice_match) break;
- scan_end1 = window[scan+best_len-1];
- scan_end = window[scan+best_len];
- }
- } while ((cur_match = (prev[cur_match & wmask]&0xffff)) > limit
- && --chain_length != 0);
- if (best_len <= lookahead) return best_len;
- return lookahead;
- }
- internal int deflateInit(ZStream strm, int level, int bits){
- return deflateInit2(strm, level, Z_DEFLATED, bits, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY);
- }
- internal int deflateInit(ZStream strm, int level){
- return deflateInit(strm, level, MAX_WBITS);
- }
- internal int deflateInit2(ZStream strm, int level, int method, int windowBits,
- int memLevel, int strategy){
- int noheader = 0;
-
-
-
-
-
-
- strm.msg = null;
- if (level == Z_DEFAULT_COMPRESSION) level = 6;
- if (windowBits < 0) {
- noheader = 1;
- windowBits = -windowBits;
- }
- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL ||
- method != Z_DEFLATED ||
- windowBits < 9 || windowBits > 15 || level < 0 || level > 9 ||
- strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
- return Z_STREAM_ERROR;
- }
- strm.dstate = (Deflate)this;
- this.noheader = noheader;
- w_bits = windowBits;
- w_size = 1 << w_bits;
- w_mask = w_size - 1;
- hash_bits = memLevel + 7;
- hash_size = 1 << hash_bits;
- hash_mask = hash_size - 1;
- hash_shift = ((hash_bits+MIN_MATCH-1)/MIN_MATCH);
- window = new byte[w_size*2];
- prev = new short[w_size];
- head = new short[hash_size];
- lit_bufsize = 1 << (memLevel + 6);
-
-
- pending_buf = new byte[lit_bufsize*4];
- pending_buf_size = lit_bufsize*4;
- d_buf = lit_bufsize/2;
- l_buf = (1+2)*lit_bufsize;
- this.level = level;
-
- this.strategy = strategy;
- this.method = (byte)method;
- return deflateReset(strm);
- }
- internal int deflateReset(ZStream strm){
- strm.total_in = strm.total_out = 0;
- strm.msg = null;
- strm.data_type = Z_UNKNOWN;
- pending = 0;
- pending_out = 0;
- if(noheader < 0) {
- noheader = 0;
- }
- status = (noheader!=0) ? BUSY_STATE : INIT_STATE;
- strm.adler=strm._adler.adler32(0, null, 0, 0);
- last_flush = Z_NO_FLUSH;
- tr_init();
- lm_init();
- return Z_OK;
- }
- internal int deflateEnd(){
- if(status!=INIT_STATE && status!=BUSY_STATE && status!=FINISH_STATE){
- return Z_STREAM_ERROR;
- }
-
- pending_buf=null;
- head=null;
- prev=null;
- window=null;
-
-
- return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
- }
- internal int deflateParams(ZStream strm, int _level, int _strategy){
- int err=Z_OK;
- if(_level == Z_DEFAULT_COMPRESSION){
- _level = 6;
- }
- if(_level < 0 || _level > 9 ||
- _strategy < 0 || _strategy > Z_HUFFMAN_ONLY) {
- return Z_STREAM_ERROR;
- }
- if(config_table[level].func!=config_table[_level].func &&
- strm.total_in != 0) {
-
- err = strm.deflate(Z_PARTIAL_FLUSH);
- }
- if(level != _level) {
- level = _level;
- max_lazy_match = config_table[level].max_lazy;
- good_match = config_table[level].good_length;
- nice_match = config_table[level].nice_length;
- max_chain_length = config_table[level].max_chain;
- }
- strategy = _strategy;
- return err;
- }
- internal int deflateSetDictionary (ZStream strm, byte[] dictionary, int dictLength){
- int length = dictLength;
- int index=0;
- if(dictionary == null || status != INIT_STATE)
- return Z_STREAM_ERROR;
- strm.adler=strm._adler.adler32(strm.adler, dictionary, 0, dictLength);
- if(length < MIN_MATCH) return Z_OK;
- if(length > w_size-MIN_LOOKAHEAD){
- length = w_size-MIN_LOOKAHEAD;
- index=dictLength-length;
- }
- System.Array.Copy(dictionary, index, window, 0, length);
- strstart = length;
- block_start = length;
-
-
-
- ins_h = window[0]&0xff;
- ins_h=(((ins_h)<<hash_shift)^(window[1]&0xff))&hash_mask;
- for(int n=0; n<=length-MIN_MATCH; n++){
- ins_h=(((ins_h)<<hash_shift)^(window[(n)+(MIN_MATCH-1)]&0xff))&hash_mask;
- prev[n&w_mask]=head[ins_h];
- head[ins_h]=(short)n;
- }
- return Z_OK;
- }
- internal int deflate(ZStream strm, int flush){
- int old_flush;
- if(flush>Z_FINISH || flush<0){
- return Z_STREAM_ERROR;
- }
- if(strm.next_out == null ||
- (strm.next_in == null && strm.avail_in != 0) ||
- (status == FINISH_STATE && flush != Z_FINISH)) {
- strm.msg=z_errmsg[Z_NEED_DICT-(Z_STREAM_ERROR)];
- return Z_STREAM_ERROR;
- }
- if(strm.avail_out == 0){
- strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)];
- return Z_BUF_ERROR;
- }
- this.strm = strm;
- old_flush = last_flush;
- last_flush = flush;
-
- if(status == INIT_STATE) {
- int header = (Z_DEFLATED+((w_bits-8)<<4))<<8;
- int level_flags=((level-1)&0xff)>>1;
- if(level_flags>3) level_flags=3;
- header |= (level_flags<<6);
- if(strstart!=0) header |= PRESET_DICT;
- header+=31-(header % 31);
- status=BUSY_STATE;
- putShortMSB(header);
-
- if(strstart!=0){
- putShortMSB((int)(strm.adler>>16));
- putShortMSB((int)(strm.adler&0xffff));
- }
- strm.adler=strm._adler.adler32(0, null, 0, 0);
- }
-
- if(pending != 0) {
- strm.flush_pending();
- if(strm.avail_out == 0) {
-
-
-
-
-
-
- last_flush = -1;
- return Z_OK;
- }
-
-
-
- }
- else if(strm.avail_in==0 && flush <= old_flush &&
- flush != Z_FINISH) {
- strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)];
- return Z_BUF_ERROR;
- }
-
- if(status == FINISH_STATE && strm.avail_in != 0) {
- strm.msg=z_errmsg[Z_NEED_DICT-(Z_BUF_ERROR)];
- return Z_BUF_ERROR;
- }
-
- if(strm.avail_in!=0 || lookahead!=0 ||
- (flush != Z_NO_FLUSH && status != FINISH_STATE)) {
- int bstate=-1;
- switch(config_table[level].func){
- case STORED:
- bstate = deflate_stored(flush);
- break;
- case FAST:
- bstate = deflate_fast(flush);
- break;
- case SLOW:
- bstate = deflate_slow(flush);
- break;
- default:
- break;
- }
- if (bstate==FinishStarted || bstate==FinishDone) {
- status = FINISH_STATE;
- }
- if (bstate==NeedMore || bstate==FinishStarted) {
- if(strm.avail_out == 0) {
- last_flush = -1;
- }
- return Z_OK;
-
-
-
-
-
-
- }
- if (bstate==BlockDone) {
- if(flush == Z_PARTIAL_FLUSH) {
- _tr_align();
- }
- else {
- _tr_stored_block(0, 0, false);
-
-
- if(flush == Z_FULL_FLUSH) {
-
- for(int i=0; i<hash_size; i++)
- head[i]=0;
- }
- }
- strm.flush_pending();
- if(strm.avail_out == 0) {
- last_flush = -1;
- return Z_OK;
- }
- }
- }
- if(flush!=Z_FINISH) return Z_OK;
- if(noheader!=0) return Z_STREAM_END;
-
- putShortMSB((int)(strm.adler>>16));
- putShortMSB((int)(strm.adler&0xffff));
- strm.flush_pending();
-
-
- noheader = -1;
- return pending != 0 ? Z_OK : Z_STREAM_END;
- }
- }
- }
- #endif
|