⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encode.c

📁 open arj source
💻 C
📖 第 1 页 / 共 3 页
字号:
  r_dx&=(r_cx|0xFF);  for(l=j-2; m<l; m++)  {   r_dx<<=(r_cx&0xFF);   r_dx^=*(tptr++);   r_dx&=(r_cx|0xFF);   t=fpbuf[r_dx];   fpbuf[r_dx]=m;   dtree[m]=t;  }  dtree[m]=-1;  dtree[m+1]=-1;  m=tree_el-i;  i+=fetch;  while(i>nchars)  {   i--;   pm=m;   m++;   n_passes=(unsigned int)tc_passes;   f_dicpos=(int)dicpos;   if((r_ax=upd_tree(m))>i)    r_ax=tc_passes=i;   if(n_passes<THRESHOLD||n_passes==THRESHOLD&&f_dicpos>16384||--r_ax>n_passes||r_ax==n_passes&&dicpos>>1<f_dicpos)   {    output_opt(tree[pm]);   }   else   {    i-=n_passes-1;    m+=n_passes-1;    r_ax=n_passes+UCHAR_MAX-2;    output(r_ax, f_dicpos);    upd_tree(m);    if(tc_passes>i)     tc_passes=i;   }  } } while(i>0) {  i--;  pm=m;  m++;  n_passes=tc_passes;  f_dicpos=dicpos;  if((r_ax=upd_tree(m))>i)   r_ax=tc_passes=i;  if(n_passes<THRESHOLD||n_passes==THRESHOLD&&f_dicpos>16384||--r_ax>n_passes||r_ax==n_passes&&dicpos>>1<f_dicpos)  {   output_opt(tree[pm]);  }  else  {   i-=n_passes-1;   m+=n_passes-1;   r_ax=n_passes+UCHAR_MAX-2;   output(r_ax, f_dicpos);   if((r_ax=upd_tree(m))>i)    tc_passes=i;  } } huf_encode_end(); #ifdef ASM8086  farfree_based(ftree); #else  farfree(ftree); #endif farfree(fpbuf); free(tree); tree=NULL;}/* Encoding stub for -m3 */static void NEAR huf_encode_m3(){ int hash_bits; unsigned short fp_max; int i, j, m; unsigned short t;                      /* Exchange variable */ short k, l; int tree_el; unsigned int fetch; unsigned char *tptr; unsigned short r_cx, r_dx; short r_ax; hash_bits=(dicbit+2)/3; fpcount=1U<<dicbit; fp_max=fpcount-1; if(tree==NULL) {  if((tree=calloc(treesize+2, sizeof(*tree)))==NULL)   error(M_OUT_OF_NEAR_MEMORY);  #ifdef ASM8086   ftree=farcalloc_based((unsigned long)treesize+16L, sizeof(*ftree));   dtree=(FP_OFF(ftree)==0)?ftree:MK_FP(FP_SEG(ftree)+((FP_OFF(ftree)+15)>>4), 0);  #else   ftree=dtree=farcalloc((unsigned long)treesize+16L, sizeof(*ftree));  #endif  fpbuf=farcalloc((unsigned long)fpcount+4L, 2L);  if(ftree==NULL||fpbuf==NULL)   error(M_OUT_OF_MEMORY); } allocate_memory(); display_indicator(encoded_bytes=0L); j=0; while(!unpackable) {  tree_el=0;  if(dic_alloc!=0&&j!=0)  {   tree_el=dic_alloc;   if((k=j-tree_el)<=0)   {    k=0;    tree_el=j;   }   else    memmove(tree, tree+k, tree_el);  }  fetch=(unsigned int)(treesize-tree_el);  if(multivolume_option)   fetch=check_multivolume(fetch);  if((fetch=fetch_uncomp(tree+tree_el, fetch))==0)   break;  else  {   j=fetch+tree_el;   encoded_bytes+=(unsigned long)fetch;   display_indicator(encoded_bytes);   fill_fpbuf();   l=fetch;   tptr=tree;   r_dx=(unsigned short)*(tptr++);   r_cx=(fp_max&0xFF00)|(hash_bits&0xFF);   r_dx<<=(hash_bits&0xFF);   r_dx^=(unsigned short)*(tptr++);   r_dx&=(r_cx|0xFF);   for(m=0; m<j; m++)   {    r_dx<<=(r_cx&0xFF);    r_dx^=*(tptr++);    r_dx&=(r_cx|0xFF);    t=fpbuf[r_dx];    fpbuf[r_dx]=m;    dtree[m]=t;   }   i=l;   m=tree_el;   while(i>0)   {    r_ax=upd_tree(m);    if((r_ax=upd_tree(m))>i)     r_ax=tc_passes=i;    if(r_ax<THRESHOLD)    {     r_ax=(unsigned short)tree[m];     output(r_ax, 0);     m++;     i--;    }    else    {     r_ax+=UCHAR_MAX-2;     output(r_ax, dicpos);     m+=tc_passes;     i-=tc_passes;    }   }  } } huf_encode_end(); #ifdef ASM8086  farfree_based(ftree); #else  farfree(ftree); #endif farfree(fpbuf); free(tree); tree=NULL;}/* Encodes a single file. */void encode(int method){ char *dsw;                             /* Debug switch (-hd) pointer */ char a; numchars=UCHAR_MAX+5; dicbit=14; dic_alloc=DICSIZ; treesize=31744; dicsiz_cur=DICSIZ-2; adjust_dicbit(); /* Method 0 (store) is already filtered away at this point */ switch(method) {  case 1:   numchars=UCHAR_MAX+5;   break;  case 2:   treesize=30720;   numchars=72;   dic_alloc=20480;   break;  case 3:   treesize=30720;   numchars=32;   dic_alloc=8192;   break;  default:   error(M_UNKNOWN_METHOD); } switch(max_compression) {  case 1:   numchars=3000;   dic_alloc=DICSIZ+512;   break;  case 2:   numchars=512;   dic_alloc=DICSIZ+512;   break;  case 3:   numchars=1024;   dicbit=12;   treesize=20480;   dicsiz_cur=dic_alloc=16384;   break;  case 4:   numchars=1024;   dicbit=12;   treesize=12288;   dicsiz_cur=dic_alloc=8192; } if(debug_enabled) {  dsw=debug_opt;  while(*dsw!='\0')  {   a=*(dsw++);   switch(a)   {    case 'd':                           /* Dictionary size */     dicsiz_cur=(unsigned int)strtol(dsw, &dsw, 10);     break;    case 'g':                           /* G-size */     dic_alloc=(int)strtol(dsw, &dsw, 10);     break;    case 'h':     dicbit=(int)strtol(dsw, &dsw, 10);     break;    case 'm':     numchars=(int)strtol(dsw, &dsw, 10);     break;    case 'w':     treesize=(int)strtol(dsw, &dsw, 10);     break;   }  }  if(strchr(debug_opt, 'v')!=NULL)   msg_cprintf(0, M_PRECOMP_STAT, numchars, dicbit, dicsiz_cur, dic_alloc, treesize); } if(dicsiz_cur>DICSIZ_MAX)  error(M_LARGE_DICTIONARY); if(dic_alloc>treesize)  error(M_LARGE_GSIZE); if(method==3)  huf_encode_m3(); else  huf_encode();}/* Fast search stub for method 4 */static void enc4_pass1(int n_c){ #ifdef ASM8086  asm{                mov     dx, n_c                mov     bx, 1                mov     cx, 0                cmp     dx, bx                jl      cease_search  }binsearch:  asm{                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      cease_search                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      cease_search                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      cease_search                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      cease_search                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      cease_search                jmp     binsearch  }cease_search:  asm{                or      cx, cx                jz      chk_ctr_bounds                push    dx                push    cx                mov     ax, 65535                push    ax                push    cx                call    far ptr putbits                add     sp, 4                pop     cx                pop     dx  }chk_ctr_bounds:  asm{                cmp     cx, 7                jge     p1exit                inc     cx  }p1exit:  asm{                push    dx                push    cx                call    far ptr putbits                add     sp, 4  } #else  short r_bx=1;  int r_cx=0;  while(n_c>=r_bx)  {   n_c-=r_bx;   r_cx++;   r_bx<<=1;  }  if(r_cx!=0)   putbits(r_cx, -1);  if(r_cx<7)   r_cx++;  putbits(r_cx, n_c); #endif}/* Dictionary position lookup */static void enc4_pass2(int n_c){ #ifdef ASM8086  asm{                mov     dx, n_c                mov     bx, 512                mov     cx, 9                cmp     dx, bx                jl      p2_cease_search  }p2_bsearch:  asm{                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      p2_cease_search                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      p2_cease_search                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      p2_cease_search                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jl      p2_cease_search                sub     dx, bx                inc     cx                shl     bx, 1                cmp     dx, bx                jge     p2_bsearch  }p2_cease_search:  asm{                mov     ch, cl                sub     cl, 9                jz      p2_chk_ctr                push    cx                push    dx                mov     ax, 65535                push    ax                push    cx                call    far ptr putbits                add     sp, 4                pop     dx                pop     cx  }p2_chk_ctr:  asm{                cmp     ch, 13                jge     p2exit                inc     ch  }p2exit:  asm{                mov     cl, ch                push    dx                push    cx                call    far ptr putbits                add     sp, 4  } #else  unsigned short r_bx=1<<9;  int r_cx=9;  while(n_c>=r_bx)  {   n_c-=r_bx;   r_cx++;   r_bx<<=1;  }  if(r_cx!=9)   putbits(r_cx-9, -1);  if(r_cx<13)   r_cx++;  putbits(r_cx, n_c); #endif}/* Encodes a single file, using method 4 */void encode_f(){ int fetch; int hash_bits; unsigned short fp_max; unsigned char *tptr; int i, m; unsigned short r_cx, r_dx, r_ax; unsigned short t; dicbit=14; numchars=32; dicsiz_cur=15800; treesize=30720; adjust_dicbit(); hash_bits=(dicbit+2)/3; fpcount=1U<<dicbit; fp_max=fpcount-1; if(tree==NULL) {  if((tree=calloc(treesize+2, sizeof(*tree)))==NULL)   error(M_OUT_OF_NEAR_MEMORY);  #ifdef ASM8086   ftree=farcalloc_based((unsigned long)treesize+16L, sizeof(*ftree));   dtree=(FP_OFF(ftree)==0)?ftree:MK_FP(FP_SEG(ftree)+((FP_OFF(ftree)+15)>>4), 0);  #else   ftree=dtree=farcalloc((unsigned long)treesize+16L, sizeof(*ftree));  #endif  fpbuf=farcalloc((unsigned long)fpcount+4L, 2L);  if(ftree==NULL||fpbuf==NULL)   error(M_OUT_OF_MEMORY); } init_putbits(); cpos=0; display_indicator(encoded_bytes=0L); while(!unpackable) {  fetch=treesize;  if(multivolume_option)   fetch=check_multivolume(fetch);  if((fetch=fetch_uncomp(tree, fetch))==0)   break;  encoded_bytes+=(unsigned long)fetch;  display_indicator(encoded_bytes);  fill_fpbuf();  m=0;  tptr=tree;  r_dx=(unsigned short)*(tptr++);  r_cx=(fp_max&0xFF00)|(hash_bits&0xFF);  r_dx<<=(hash_bits&0xFF);  r_dx^=(unsigned short)*(tptr++);  r_dx&=(r_cx|0xFF);  for(m=0; m<fetch; m++)  {   r_dx<<=(r_cx&0xFF);   r_dx^=(unsigned char)*(tptr++);   r_dx&=(r_cx|0xFF);   t=fpbuf[r_dx];   fpbuf[r_dx]=m;   dtree[m]=t;  }  m=0;  i=fetch;  while(i>0)  {   if((r_ax=upd_tree(m))>i)    r_ax=tc_passes=i;   if(r_ax<THRESHOLD)   {    putbits(9, (unsigned char)tree[m]);    i--;    m++;   }   else   {    i-=tc_passes;    m+=tc_passes;    r_ax=tc_passes-2;    enc4_pass1(r_ax);    enc4_pass2(dicpos);   }  } } shutdown_putbits(); farfree(fpbuf); #ifdef ASM8086  farfree_based(ftree); #else  farfree(ftree); #endif free(tree); tree=NULL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -