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

📄 fardata.c

📁 arj source code
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * $Id: fardata.c,v 1.5 2003/09/19 18:18:31 andrew_belov Exp $ * --------------------------------------------------------------------------- * This file contains routines dealing with far data segment and CRC. * */#include "arj.h"#ifdef TILED#include <dos.h>                        /* Weird, eh? */#endif/* ASR fix 02/05/2003: need that regardless of COLOR_OUTPUT to support -jp   correctly */#if SFX_LEVEL>=ARJ #define CUSTOM_PRINTF #define CHUNK_SIZE               512    /* Size of the output block */ #define CHUNK_THRESHOLD (CHUNK_SIZE-256) /* Safety bound */#endifDEBUGHDR(__FILE__)                      /* Debug information block */#if SFX_LEVEL>=ARJ/* Checks if the error can have an error code or not */static int is_std_error(FMSG *errmsg){ return(errmsg==M_DISK_FULL||errmsg==M_CANT_DELETE||errmsg==M_CANTOPEN||        errmsg==M_CANTRENAME||errmsg==M_CANTREAD||errmsg==M_CANT_DELETE||        errmsg==M_CANT_COPY_TEMP)?1:0;}#endif/* Makes various cleanup depending on the error message received and quits. */int error_proc(FMSG *errmsg, ...){ char *tmp_errmsg; va_list marker; #if SFX_LEVEL>=ARJ  /* Check if the message could have a standard error code */  if(errno!=0&&is_std_error(errmsg))  {   msg_cprintf(0, lf);   error_report();  } #endif #if SFX_LEVEL>=ARJSFXV  if(quiet_mode==ARJ_SILENT)   freopen(dev_con, m_w, stdout); #endif #if SFX_LEVEL>=ARJ  file_settype(stdout, ARJT_TEXT); #endif /* For SFX archives, don't forget to display our logo */ #if SFX_LEVEL==ARJSFXV  show_sfx_logo(); #elif SFX_LEVEL==ARJSFX  if(!logo_shown)  {   msg_cprintf(0, M_ARJSFX_BANNER, exe_name);   msg_cprintf(0, M_PROCESSING_ARCHIVE, archive_name);  } #endif #if SFX_LEVEL>=ARJ  nputlf(); #elif SFX_LEVEL>=ARJSFXV  fputc(LF, new_stdout); #else  fputc(LF, stdout); #endif /* Format and print the error message */ va_start(marker, errmsg); #ifdef CUSTOM_PRINTF  vcprintf(H_ERR, errmsg, marker); #else  tmp_errmsg=malloc_fmsg(errmsg);  #if SFX_LEVEL>=ARJSFXV   vfprintf(new_stdout, (FMSG *)tmp_errmsg, marker);  #else   vprintf(tmp_errmsg, marker);  #endif  free_fmsg(tmp_errmsg); #endif va_end(marker); #if SFX_LEVEL>=ARJ  nputlf(); #elif SFX_LEVEL>=ARJSFXV  fputc(LF, new_stdout); #else  fputc(LF, stdout); #endif /* Terminate the execution with a specific errorlevel */ #if SFX_LEVEL>=ARJSFXV  /* If there's no errorlevel yet, select errorlevel by message class */  if(errorlevel==0)   errorlevel=subclass_errors(errmsg);  /* If the error was the lack of memory, display final memory statistics to     find memory leaks */  #if SFX_LEVEL>=ARJ   if(errorlevel==ARJ_ERL_NO_MEMORY)    mem_stats();  #endif  error_occured=1;  exit(errorlevel); #elif defined(REARJ)  exit(REARJ_ERL_WARNING); #elif defined(REGISTER)  exit(REGISTER_ERL_ERROR); #elif SFX_LEVEL>=ARJSFX  exit(ARJSFX_ERL_ERROR); #else  exit(1); #endif return(0);}#ifdef FMSG_ST/* A printf() function for far strings */int msg_printf(FMSG *fmt, ...){ va_list marker; char *storage; int result; storage=malloc_far_str(fmt); va_start(marker, fmt); result=vfprintf(new_stdout, (FMSG *)storage, marker); va_end(marker); free(storage); return(result);}/* A fprintf() function for far strings */int msg_fprintf(FILE *stream, FMSG *fmt, ...){ va_list marker; char *storage; int result; storage=malloc_far_str(fmt); va_start(marker, fmt); result=vfprintf(stream, storage, marker); va_end(marker); free(storage); return(result);}/* A sprintf() function for far strings */int msg_sprintf(char *str, FMSG *fmt, ...){ va_list marker; char *storage; int result; storage=malloc_far_str(fmt); va_start(marker, fmt); result=vsprintf(str, storage, marker); va_end(marker); free(storage); return(result);}#endif#ifdef CUSTOM_PRINTF/* * A Q&D custom printf() implementation. Derived from: * * vsprintf.c -- Lars Wirzenius & Linus Torvalds. * Wirzenius wrote this portably, Torvalds f*cked it up :-) * *//* Length-limited strlen() */static int strnlen(const char FAR *s, int count){ const char FAR *sc; for(sc=s; *sc!='\0'&&count--; ++sc)  ; return(sc-s);}/* Hex representation of digits */static char adigit(unsigned long n, int is_uc){ if(n<10)  return('0'+n); n-=10; return((is_uc?'A':'a')+n);}/* Q'n'D strtoul() implementation */unsigned long simple_strtoul(const FMSG *cp, FMSG **endp, unsigned int base){ unsigned long result=0, value; if(!base) {  base=10;  if(*cp=='0')  {   base=8;   cp++;   if((*cp=='x')&&isxdigit(cp[1]))   {    cp++;    base=16;   }  } } while(isxdigit(*cp)&&(value=isdigit(*cp)?                       *cp-'0':                       (islower(*cp)?toupper(*cp):*cp)-'A'+10)<base) {  result=result*base+value;  cp++; } if(endp)  *endp=(FMSG *)cp; return(result);}/* Convert digits and skip over them */static int skip_atoi(FMSG **s){ int i=0; while(isdigit(**s))  i=i*10+*((*s)++)-'0'; return(i);}#define ZEROPAD                    1    /* pad with zero */#define SIGN                       2    /* unsigned/signed long */#define PLUS                       4    /* show plus */#define SPACE                      8    /* space if plus */#define LEFT                      16    /* left justified */#define SPECIAL                   32    /* 0x */#define LARGE                     64    /* use 'ABCDEF' instead of 'abcdef' */#define FAR_STR                  128    /* Far strings (Fs) *//* Number representation routine */static int number(char *istr, long num, int base, int size, int precision, int type){ char c, sign, tmp[66]; int i; int ucase_dig=0; char *str; str=istr; if(type&LARGE)  ucase_dig=1; if(type&LEFT)  type&=~ZEROPAD; if(base<2||base>36)  return(0); c=(type&ZEROPAD)?'0':' '; sign=0; if(type&SIGN) {  if(num<0)  {   sign='-';   num=-num;   size--;  }  else if(type&PLUS)  {   sign='+';   size--;  }  else if(type&SPACE)  {   sign=' ';   size--;  } } if(type&SPECIAL) {  if(base==16)   size-=2;  else if(base==8)   size--; } i=0; if(num==0)  tmp[i++]='0'; else while (num!=0) {  unsigned long __res;  __res=((unsigned long)num)%(unsigned long)base;  num=((unsigned long)num)/(unsigned long)base;  tmp[i++]=adigit(__res, ucase_dig); } if(i>precision)  precision=i; size-=precision; if(!(type&(ZEROPAD+LEFT))) {  while(size-->0)   *str++=' '; } if(sign)  *str++=sign; if(type&SPECIAL) {  if(base==8)   *str++='0';  else if(base==16)  {   *str++='0';   *str++=ucase_dig?'X':'x';  } } if(!(type&LEFT)) {  while(size-->0)   *str++=c; } while(i<precision--)  *str++='0'; while(i-->0)  *str++=tmp[i]; while(size-->0)  *str++=' '; return(str-istr);}/* Flushes the output buffer downstream. The buffer gets clobbered. */static void flush_cbuf(int ccode, char *text){ char *n_text, *t_text; int need_pause, rc; char c; if(quiet_mode==ARJ_SILENT||quiet_mode==ARJ_QUIET&&!(ccode&H_FORCE))  return; CLOBBER_SENTRY(); need_pause=(prompt_for_more&&!yes_on_all_queries&&!print_with_more); n_text=t_text=text;#ifdef COLOR_OUTPUT if(!redirected&&!no_colors)  textcolor(color_table[ccode&H_COLORMASK].color);#endif while((c=*t_text)!='\0') {  if(c==LF)  {   *t_text='\0';   #ifdef COLOR_OUTPUT    if(redirected)    {     #if SFX_LEVEL>=ARJSFXV      fprintf(new_stdout, strform, n_text);      fprintf(new_stdout, lf);     #else      printf(strform, n_text);      printf(lf);     #endif    }    else    {     scr_out(n_text);     if(!no_colors)      textcolor(7);     #ifdef NEED_CRLF      scr_out("\r");     #endif     scr_out(lf);    }    if(!no_colors)     textcolor(color_table[ccode&H_COLORMASK].color);   #else    printf(strform, n_text);    printf(lf);   #endif   n_text=t_text+1;   #if SFX_LEVEL>=ARJ    lines_scrolled++;    if(lines_scrolled>=lines_per_page-1)    {     lines_scrolled=0;     if(need_pause)     {

⌨️ 快捷键说明

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