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

📄 arjsfxjr.c

📁 open arj source
💻 C
📖 第 1 页 / 共 2 页
字号:
 sfxjr_puts(M_VD_SPACE); if(file_type!=ARJT_DIR) {  if(method>0)   decode();  else   unstore();  if(!test_mode)   _close(atstream); } if(!test_mode) {  #if TARGET==UNIX   {    struct utimbuf ut;    ut.actime=ut.modtime=ftime_stamp;    utime(filename, &ut);   }  #elif TARGET==WIN32   file_setftime(filename, ftime_stamp);  #else   if((atstream=_open(filename, O_BINARY|O_RDWR))>0)   {    file_setftime_on_hf(atstream, ftime_stamp);    _close(atstream);   }  #endif  #if COMPILER==BCC   _chmod(filename, 1, file_mode&STD_ATTRS);  #elif COMPILER==MSC||COMPILER==MSVC   #if TARGET==DOS    _dos_setfileattr(filename, file_mode&STD_ATTRS);   #elif TARGET==OS2    DosSetFileMode(filename, file_mode&STD_ATTRS, 0L);   #elif TARGET==WIN32    SetFileAttributes(filename, file_mode&STD_ATTRS);   #endif  #endif } atstream=0; unpack_in_progress=0; if((crc32term^CRC_MASK)==file_crc)  sfxjr_puts(M_OK); else {  sfxjr_puts(M_CRC_ERROR);  errors++; } nputlf(); return(1);}/* Analyzes command-line parameters */static int analyze_arg(char *arg){ if(arg[0]=='-') {  switch(arg[1])  {   case 'n':   case 'N':    allow_skipping=1;    return(0);   case 'o':   case 'O':    overwrite_existing=1;    return(0);   case 't':   case 'T':    test_mode=1;    return(0);   case '*':    return(0);   default:    return(1);  } } else {  if(dest_dir[0]!='\0'||strchr(pathsep_sfxjr, arg[strlen(arg)-1])==NULL)   return(1);  dest_dir=arg; } return(0);}/* ARJSFXJR allows comment preprocessing, too... */static char *preprocess_comment(char *comment){ int arg_rc; char ctr; char *aptr, *endptr; if(comment[0]==')'&&comment[1]==')') {  comment+=2;  arg_rc=0;  aptr=cmd_args;  for(ctr=1; ctr<sizeof(cmd_args)&&*comment!='\0'&&*comment!='}'; ctr++)  {   *aptr=*comment;   if(*aptr==' ')    *aptr='\0';   comment++;   aptr++;  }  *aptr='\0';  endptr=aptr;  aptr=cmd_args;  while((endptr-aptr)>0)  {   while(*aptr=='\0')    aptr++;   if((endptr-aptr)>0)   {    arg_rc=analyze_arg(aptr);    while(*aptr!='\0'&&(endptr-aptr)>0)     aptr++;   }  }  if(arg_rc)   error(M_INVALID_SWITCH);  if(*comment=='\n')   comment++; } return(comment);}/* SFX opening routine */static void process_archive(){ char *cmt_ptr; char numfiles[10]; if((aistream=_open(archive_name, O_BINARY|O_RDONLY))<0) {  sfxjr_puts(M_CANTOPEN);  sfxjr_puts((FMSG *)archive_name);  nputlf();  exit(ARJSFXJR_ERL_FATAL); } sfxjr_puts(M_PROCESSING_ARCHIVE); sfxjr_puts((FMSG *)archive_name); nputlf(); find_sfx_header(); get_reg_id(); if(reg_id!=REG_ID)  reg_id=0; if(!read_header())  error(M_BAD_HEADER); cmt_ptr=comment; if(st_argc==1)  cmt_ptr=preprocess_comment(cmt_ptr); sfxjr_puts((FMSG *)cmt_ptr); while(read_header())  if(unpack_file())   total_files++; numtostr(total_files, numfiles); /* German NLS fix -- ASR 12/10/2000 */ #if LOCALE==LANG_de  sfxjr_puts(numfiles);  sfxjr_puts(M_FILES);  sfxjr_puts(M_EXTRACTED); #else  sfxjr_puts(M_EXTRACTED);  sfxjr_puts(numfiles);  sfxjr_puts(M_FILES); #endif nputlf(); _close(aistream);}/* Ctrl+Break handler */#if COMPILER==BCCstatic int ctrlc_handler()#elsestatic void ctrlc_handler(int sig)#endif{ sfxjr_puts(M_BREAK_SIGNALED); exit(ARJSFXJR_ERL_FATAL); #if COMPILER==BCC  return(0); #endif}/* Pre-exit cleanup routine */static void final_cleanup(void){ if(atstream!=0)  _close(atstream); if(unpack_in_progress)  unlink(filename);}/* Main routine */int main(int argc, char **argv){ int arg_rc; unsigned int i; st_argc=argc; arg_rc=0; for(i=1; i<argc; i++)  arg_rc=analyze_arg(argv[i]); sfxjr_puts(M_ARJSFX_BANNER); nputlf(); if(arg_rc)  error(M_INVALID_SWITCH); build_crc32_table(); #ifndef SKIP_GET_EXE_NAME  get_exe_name(archive_name); #else  get_exe_name(archive_name, argv[0]); #endif atexit(final_cleanup); #if COMPILER==BCC  ctrlbrk(ctrlc_handler); #else  signal(SIGINT, ctrlc_handler); #endif process_archive(); if(errors!=0)  error(M_FOUND_ERRORS); return((warnings>0)?ARJSFXJR_ERL_ERROR:ARJSFXJR_ERL_SUCCESS);}/* Creates a table for decoding */static void NEAR make_table(int nchar, unsigned char *bitlen, int tablebits, unsigned short *table, int tablesize){ unsigned short count[17], weight[17], start[18]; unsigned short *p; unsigned int i, k, len, ch, jutbits, avail, nextcode, mask; for(i=1; i<=16; i++)  count[i]=0; for(i=0; (int)i<nchar; i++)  count[bitlen[i]]++; start[1]=0; for(i=1; i<=16; i++)  start[i+1]=start[i]+(count[i]<<(16-i)); if(start[17]!=(unsigned short)(1<<16))  error(M_BADTABLE); jutbits=16-tablebits; for(i=1; (int)i<=tablebits; i++) {  start[i]>>=jutbits;  weight[i]=1<<(tablebits-i); } while(i<=16) {  weight[i]=1<<(16-i);  i++; } i=start[tablebits+1]>>jutbits; if(i!=(unsigned short)(1<<16)) {  k=1<<tablebits;  while(i!=k)   table[i++]=0; } avail=nchar; mask=1<<(15-tablebits); for(ch=0; (int)ch<nchar; ch++) {  if((len=bitlen[ch])!=0)  {   k=start[len];   nextcode=k+weight[len];   if((int)len<=tablebits)   {    if(nextcode>(unsigned int)tablesize)     error(M_BADTABLE);    for(i=start[len]; i<nextcode; i++)     table[i]=ch;   }   else   {    p=&table[k>>jutbits];    i=len-tablebits;    while(i!=0)    {     if(*p==0)     {      right[avail]=left[avail]=0;      *p=avail++;     }     if(k&mask)      p=&right[*p];     else      p=&left[*p];     k<<=1;     i--;    }    *p=ch;   }   start[len]=nextcode;  } }}/* Reads length of data pending */void read_pt_len(int nn, int nbit, int i_special){ int i, n; short c; unsigned short mask; n=getbits(nbit); if(n==0) {  c=getbits(nbit);  for(i=0; i<nn; i++)   pt_len[i]=0;  for(i=0; i<PTABLESIZE; i++)   pt_table[i]=c; } else {  i=0;  if(n>=NPT)                            /* ASR fix to prevent overrun */   n=NPT;  while(i<n)  {   c=bitbuf>>13;   if(c==7)   {    mask=1<<12;    while(mask&bitbuf)    {     mask>>=1;     c++;    }   }   fillbuf((c<7)?3:(int)(c-3));   pt_len[i++]=(unsigned char)c;   if(i==i_special)   {    c=getbits(2);    while(--c>=0)     pt_len[i++]=0;   }  }  while(i<nn)   pt_len[i++]=0;  make_table(nn, pt_len, 8, pt_table, sizeof(pt_table)); }}/* Reads a character table */void read_c_len(){ short i, c, n; unsigned short mask; n=getbits(CBIT); if(n==0) {  c=getbits(CBIT);  for(i=0; i<NC; i++)   c_len[i]=0;  for(i=0; i<CTABLESIZE; i++)   c_table[i]=c; } else {  i=0;  while(i<n)  {   c=pt_table[bitbuf>>8];   if(c>=NT)   {    mask=1<<7;    do    {     if(bitbuf&mask)      c=right[c];     else      c=left[c];     mask>>=1;    } while(c>=NT);   }   fillbuf((int)(pt_len[c]));   if(c<=2)   {    if(c==0)     c=1;    else if(c==1)     c=getbits(4)+3;    else     c=getbits(CBIT)+20;    while(--c>=0)     c_len[i++]=0;   }   else    c_len[i++]=(unsigned char)(c-2);  }  while(i<NC)   c_len[i++]=0;  make_table(NC, c_len, 12, c_table, sizeof(c_table)); }}/* Decodes a single character */static unsigned short decode_c(){ unsigned short j, mask; if(blocksize==0) {  blocksize=getbits(16);  read_pt_len(NT, TBIT, 3);  read_c_len();  read_pt_len(NP, PBIT, -1); } blocksize--; j=c_table[bitbuf>>4]; if(j>=NC) {  mask=1<<3;  do  {   j=(bitbuf&mask)?right[j]:left[j];   mask>>=1;  } while(j>=NC); } fillbuf((int)(c_len[j])); return(j);}/* Decodes a pointer to already decoded data */static unsigned short decode_p(){ unsigned short j, mask; j=pt_table[bitbuf>>8]; if(j>=NP) {  mask=1<<7;  do  {   j=(bitbuf&mask)?right[j]:left[j];   mask>>=1;  } while(j>=NP); } fillbuf((int)(pt_len[j])); if(j!=0) {  j--;  j=(1<<j)+getbits((int)j); } return(j);}/* Initiates the decoding */static void decode_start(){ blocksize=0; init_getbits();}/* Decodes the entire file */static void decode(){ short i; short r; short c; static short j; unsigned long count; decode_start(); count=origsize; r=0; while(count>0L) {  if((c=decode_c())<=UCHAR_MAX)  {   dec_text[r]=(unsigned char)c;   count--;   if(++r>=DICSIZ)   {    r=0;    sfxjr_puts(M_SFXJR_TICKER);    fwrite_crc(dec_text, DICSIZ);   }  }  else  {   j=c-(UCHAR_MAX+1-THRESHOLD);   count-=(unsigned long)j;   i=r-decode_p()-1;   if(i<0)    i+=DICSIZ;   if(r>i&&r<DICSIZ-MAXMATCH-1)   {    while(--j>=0)     dec_text[r++]=dec_text[i++];   }   else   {    while(--j>=0)    {     dec_text[r]=dec_text[i];     if(++r>=DICSIZ)     {      r=0;      sfxjr_puts(M_SFXJR_TICKER);      fwrite_crc(dec_text, DICSIZ);     }     if(++i>=DICSIZ)      i=0;    }   }  } } if(r>0)  fwrite_crc(dec_text, r);}

⌨️ 快捷键说明

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