📄 fardata.c
字号:
/* * $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 + -