📄 cmddata.cpp
字号:
Method=Switch[1]-'0'; if (Method>5 || Method<0) BadSwitch(Switch); break; } break; case 'V': switch(toupper(Switch[1])) {#ifdef _WIN_32 case 'D': EraseDisk=true; break;#endif case 'N': OldNumbering=true; break; case 'P': VolumePause=true; break; case 'E': if (toupper(Switch[2])=='R') VersionControl=atoi(Switch+3)+1; break; case '-': VolSize=0; break; default: { Int64 NewVolSize=atoil(&Switch[1]); if (NewVolSize==0) NewVolSize=INT64ERR; else switch (Switch[strlen(Switch)-1]) { case 'f': case 'F': switch(int64to32(NewVolSize)) { case 360: NewVolSize=362496; break; case 720: NewVolSize=730112; break; case 1200: NewVolSize=1213952; break; case 1440: NewVolSize=1457664; break; case 2880: NewVolSize=2915328; break; } break; case 'k': NewVolSize*=1024; break; case 'm': NewVolSize*=1024*1024; break; case 'M': NewVolSize*=1000*1000; break; case 'g': NewVolSize*=1024*1024; NewVolSize*=1024; break; case 'G': NewVolSize*=1000*1000; NewVolSize*=1000; break; case 'b': case 'B': break; default: NewVolSize*=1000; break; } if (VolSize==0) VolSize=NewVolSize; else NextVolSizes.Push(NewVolSize); } break; } break; case 'F': switch(toupper(Switch[1])) { case 0: FreshFiles=true; break; case 'C': if (toupper(Switch[2])=='U') { UnicodeComment=true; if (*CommentFile==0 || Switch[3]!=0) { strncpy(CommentFile,Switch[3]!=0 ? Switch+3:"stdin",sizeof(CommentFile)-1); CommentFile[sizeof(CommentFile)-1]=0; } } break; } break; case 'U': if (Switch[1]==0) UpdateFiles=true; break; case 'W': strncpy(TempPath,&Switch[1],sizeof(TempPath)-1); AddEndSlash(TempPath); break; case 'S': if (strnicomp(Switch,"SFX",3)==0) { const char *SFXName=Switch[3] ? Switch+3:DefSFXName; if (PointToName(SFXName)!=SFXName || FileExist(SFXName)) strcpy(SFXModule,SFXName); else GetConfigName(SFXName,SFXModule,true); } if (isdigit(Switch[1])) { Solid|=SOLID_COUNT; SolidCount=atoi(&Switch[1]); } else switch(toupper(Switch[1])) { case 0: Solid|=SOLID_NORMAL; break; case '-': Solid=SOLID_NONE; break; case 'E': Solid|=SOLID_FILEEXT; break; case 'V': Solid|=Switch[2]=='-' ? SOLID_VOLUME_DEPENDENT:SOLID_VOLUME_INDEPENDENT; break; case 'D': Solid|=SOLID_VOLUME_DEPENDENT; break; case 'L': if (isdigit(Switch[2])) FileSizeLess=atoil(Switch+2); break; case 'M': if (isdigit(Switch[2])) FileSizeMore=atoil(Switch+2); break; } break; case 'C': if (Switch[2]==0) switch(toupper(Switch[1])) { case '-': DisableComment=true; break; case 'U': ConvertNames=NAMES_UPPERCASE; break; case 'L': ConvertNames=NAMES_LOWERCASE; break; } break; case 'K': switch(toupper(Switch[1])) { case 'B': KeepBroken=true; break; case 0: Lock=true; break; } break;#ifndef GUI case '?' : OutHelp(); break;#endif default : BadSwitch(Switch); break; }}#endif#ifndef SFX_MODULEvoid CommandData::BadSwitch(char *Switch){ mprintf(St(MUnknownOption),Switch); ErrHandler.Exit(USER_ERROR);}#endif#ifndef GUIvoid CommandData::OutTitle(){ if (BareOutput || DisableCopyright) return;#if defined(__GNUC__) && defined(SFX_MODULE) mprintf(St(MCopyrightS));#else#ifndef SILENT static bool TitleShown=false; if (TitleShown) return; TitleShown=true; char Version[50]; int Beta=RARVER_BETA; if (Beta!=0) sprintf(Version,"%d.%02d %s %d",RARVER_MAJOR,RARVER_MINOR,St(MBeta),RARVER_BETA); else sprintf(Version,"%d.%02d",RARVER_MAJOR,RARVER_MINOR);#ifdef UNRAR mprintf(St(MUCopyright),Version,RARVER_YEAR);#else#endif#endif#endif}#endifvoid CommandData::OutHelp(){#if !defined(GUI) && !defined(SILENT) OutTitle(); static MSGID Help[]={#ifdef SFX_MODULE MCHelpCmd,MSHelpCmdE,MSHelpCmdT,MSHelpCmdV#elif defined(UNRAR) MUNRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdE,MCHelpCmdL,MCHelpCmdP, MCHelpCmdT,MCHelpCmdV,MCHelpCmdX,MCHelpSw,MCHelpSwm,MCHelpSwAC,MCHelpSwAD, MCHelpSwAP,MCHelpSwAVm,MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU, MCHelpSwDH,MCHelpSwEP,MCHelpSwEP3,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwN,MCHelpSwNa,MCHelpSwNal, MCHelpSwOp,MCHelpSwOm,MCHelpSwOC,MCHelpSwOR,MCHelpSwOW,MCHelpSwP, MCHelpSwPm,MCHelpSwR,MCHelpSwRI,MCHelpSwSL,MCHelpSwSM,MCHelpSwTA, MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr, MCHelpSwVER,MCHelpSwVP,MCHelpSwX,MCHelpSwXa,MCHelpSwXal,MCHelpSwY#else MRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdA,MCHelpCmdC,MCHelpCmdCF, MCHelpCmdCH,MCHelpCmdCW,MCHelpCmdD,MCHelpCmdE,MCHelpCmdF,MCHelpCmdI, MCHelpCmdK,MCHelpCmdL,MCHelpCmdM,MCHelpCmdP,MCHelpCmdR,MCHelpCmdRC, MCHelpCmdRN,MCHelpCmdRR,MCHelpCmdRV,MCHelpCmdS,MCHelpCmdT,MCHelpCmdU, MCHelpCmdV,MCHelpCmdX,MCHelpSw,MCHelpSwm,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG, MCHelpSwAO,MCHelpSwAP,MCHelpSwAS,MCHelpSwAV,MCHelpSwAVm,MCHelpSwCm, MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,MCHelpSwDF,MCHelpSwDH,MCHelpSwDS, MCHelpSwEa,MCHelpSwED,MCHelpSwEE,MCHelpSwEN,MCHelpSwEP,MCHelpSwEP1, MCHelpSwEP2,MCHelpSwEP3,MCHelpSwF,MCHelpSwFCU,MCHelpSwHP,MCHelpSwIDP, MCHelpSwIEML,MCHelpSwIERR,MCHelpSwILOG,MCHelpSwINUL,MCHelpSwIOFF, MCHelpSwISND,MCHelpSwK,MCHelpSwKB,MCHelpSwMn,MCHelpSwMC,MCHelpSwMD, MCHelpSwMS,MCHelpSwMT,MCHelpSwN,MCHelpSwNa,MCHelpSwNal,MCHelpSwOp, MCHelpSwOm,MCHelpSwOC,MCHelpSwOL,MCHelpSwOR,MCHelpSwOS,MCHelpSwOW, MCHelpSwP,MCHelpSwPm,MCHelpSwR,MCHelpSwR0,MCHelpSwRI,MCHelpSwRR, MCHelpSwRV,MCHelpSwS,MCHelpSwSm,MCHelpSwSFX,MCHelpSwSI,MCHelpSwSL, MCHelpSwSM,MCHelpSwT,MCHelpSwTA,MCHelpSwTB,MCHelpSwTK,MCHelpSwTL, MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU,MCHelpSwV,MCHelpSwVn, MCHelpSwVD,MCHelpSwVER,MCHelpSwVN,MCHelpSwVP,MCHelpSwW,MCHelpSwX, MCHelpSwXa,MCHelpSwXal,MCHelpSwY,MCHelpSwZ#endif }; for (int I=0;I<sizeof(Help)/sizeof(Help[0]);I++) {#ifndef SFX_MODULE#ifdef DISABLEAUTODETECT if (Help[I]==MCHelpSwV) continue;#endif#ifndef _WIN_32 static MSGID Win32Only[]={ MCHelpSwIEML,MCHelpSwVD,MCHelpSwAC,MCHelpSwAO,MCHelpSwOS,MCHelpSwIOFF, MCHelpSwEP2,MCHelpSwOC }; bool Found=false; for (int J=0;J<sizeof(Win32Only)/sizeof(Win32Only[0]);J++) if (Help[I]==Win32Only[J]) { Found=true; break; } if (Found) continue;#endif#if !defined(_UNIX) && !defined(_WIN_32) if (Help[I]==MCHelpSwOW) continue;#endif#ifndef SAVE_LINKS if (Help[I]==MCHelpSwOL) continue;#endif#ifndef _WIN_32 if (Help[I]==MCHelpSwRI) continue;#endif#ifndef PACK_SMP if (Help[I]==MCHelpSwMT) continue;#endif#ifndef _BEOS if (Help[I]==MCHelpSwEE) {#if defined(_EMX) && !defined(_DJGPP) if (_osmode != OS2_MODE) continue;#else continue;#endif }#endif#endif mprintf(St(Help[I])); } mprintf("\n"); ErrHandler.Exit(USER_ERROR);#endif}bool CommandData::ExclCheckArgs(StringList *Args,char *CheckName,bool CheckFullPath,int MatchMode){ char *Name=ConvertPath(CheckName,NULL); char FullName[NM],*CurName; *FullName=0; Args->Rewind(); while ((CurName=Args->GetString())!=NULL)#ifndef SFX_MODULE if (CheckFullPath && IsFullPath(CurName)) { if (*FullName==0) ConvertNameToFull(CheckName,FullName); if (CmpName(CurName,FullName,MatchMode)) return(true); } else#endif if (CmpName(ConvertPath(CurName,NULL),Name,MatchMode)) return(true); return(false);}bool CommandData::ExclCheck(char *CheckName,bool CheckFullPath){ if (ExclCheckArgs(ExclArgs,CheckName,CheckFullPath,MATCH_WILDSUBPATH)) return(true); if (InclArgs->ItemsCount()==0) return(false); if (ExclCheckArgs(InclArgs,CheckName,CheckFullPath,MATCH_WILDSUBPATH)) return(false); return(true);}#ifndef SFX_MODULEbool CommandData::TimeCheck(RarTime &ft){ if (FileTimeBefore.IsSet() && ft>=FileTimeBefore) return(true); if (FileTimeAfter.IsSet() && ft<=FileTimeAfter) return(true);/* if (FileTimeOlder!=0 || FileTimeNewer!=0) { if (!TimeConverted) { if (FileTimeOlder!=0) FileTimeOlder=SecondsToDosTime(FileTimeOlder); if (FileTimeNewer!=0) FileTimeNewer=SecondsToDosTime(FileTimeNewer); TimeConverted=true; } if (FileTimeOlder!=0 && ft>=FileTimeOlder) return(true); if (FileTimeNewer!=0 && ft<=FileTimeNewer) return(true); }*/ return(false);}#endif#ifndef SFX_MODULEbool CommandData::SizeCheck(Int64 Size){ if (FileSizeLess!=INT64ERR && Size>=FileSizeLess) return(true); if (FileSizeMore!=INT64ERR && Size<=FileSizeMore) return(true); return(false);}#endifint CommandData::IsProcessFile(FileHeader &NewLhd,bool *ExactMatch,int MatchType){ if (strlen(NewLhd.FileName)>=NM || strlenw(NewLhd.FileNameW)>=NM) return(0); if (ExclCheck(NewLhd.FileName,false)) return(0);#ifndef SFX_MODULE if (TimeCheck(NewLhd.mtime)) return(0); if ((NewLhd.FileAttr & ExclFileAttr)!=0 || InclAttrSet && (NewLhd.FileAttr & InclFileAttr)==0) return(0); if ((NewLhd.Flags & LHD_WINDOWMASK)!=LHD_DIRECTORY && SizeCheck(NewLhd.FullUnpSize)) return(0);#endif char *ArgName; wchar *ArgNameW; FileArgs->Rewind(); for (int StringCount=1;FileArgs->GetString(&ArgName,&ArgNameW);StringCount++) {#ifndef SFX_MODULE bool Unicode=(NewLhd.Flags & LHD_UNICODE) || ArgNameW!=NULL; if (Unicode) { wchar NameW[NM],ArgW[NM],*NamePtr=NewLhd.FileNameW; bool CorrectUnicode=true; if (ArgNameW==NULL) { if (!CharToWide(ArgName,ArgW) || *ArgW==0) CorrectUnicode=false; ArgNameW=ArgW; } if ((NewLhd.Flags & LHD_UNICODE)==0) { if (!CharToWide(NewLhd.FileName,NameW) || *NameW==0) CorrectUnicode=false; NamePtr=NameW; } if (CmpName(ArgNameW,NamePtr,MatchType)) { if (ExactMatch!=NULL) *ExactMatch=stricompcw(ArgNameW,NamePtr)==0; return(StringCount); } if (CorrectUnicode) continue; }#endif if (CmpName(ArgName,NewLhd.FileName,MatchType)) { if (ExactMatch!=NULL) *ExactMatch=stricompc(ArgName,NewLhd.FileName)==0; return(StringCount); } } return(0);}#ifndef GUIvoid CommandData::ProcessCommand(){#ifndef SFX_MODULE if (Command[1] && strchr("FUADPXETK",*Command)!=NULL || *ArcName==0) OutHelp();#ifdef _UNIX if (GetExt(ArcName)==NULL && (!FileExist(ArcName) || IsDir(GetFileAttr(ArcName)))) strcat(ArcName,".rar");#else if (GetExt(ArcName)==NULL) strcat(ArcName,".rar");#endif if (strchr("AFUMD",*Command)==NULL) { StringList ArcMasks; ArcMasks.AddString(ArcName); ScanTree Scan(&ArcMasks,Recurse,SaveLinks,SCAN_SKIPDIRS); FindData FindData; while (Scan.GetNext(&FindData)==SCAN_SUCCESS) AddArcName(FindData.Name,FindData.NameW); } else AddArcName(ArcName,NULL);#endif switch(Command[0]) { case 'P': case 'X': case 'E': case 'T': case 'I': { CmdExtract Extract; Extract.DoExtract(this); } break;#ifndef SILENT case 'V': case 'L': ListArchive(this); break; default: OutHelp();#endif } if (!BareOutput) mprintf("\n");}#endifvoid CommandData::AddArcName(char *Name,wchar *NameW){ ArcNames->AddString(Name,NameW);}bool CommandData::GetArcName(char *Name,wchar *NameW,int MaxSize){ if (!ArcNames->GetString(Name,NameW,NM)) return(false); return(true);}bool CommandData::IsSwitch(int Ch){#if defined(_WIN_32) || defined(_EMX) return(Ch=='-' || Ch=='/');#else return(Ch=='-');#endif}#ifndef SFX_MODULEuint CommandData::GetExclAttr(char *Str){ if (isdigit(*Str)) return(strtol(Str,NULL,0)); else { uint Attr; for (Attr=0;*Str;Str++) switch(toupper(*Str)) {#ifdef _UNIX case 'D': Attr|=S_IFDIR; break; case 'V': Attr|=S_IFCHR; break;#elif defined(_WIN_32) || defined(_EMX) case 'R': Attr|=0x1; break; case 'H': Attr|=0x2; break; case 'S': Attr|=0x4; break; case 'D': Attr|=0x10; break; case 'A': Attr|=0x20; break;#endif } return(Attr); }}#endif#ifndef SFX_MODULEbool CommandData::CheckWinSize(){ static int ValidSize[]={ 0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000 }; for (int I=0;I<sizeof(ValidSize)/sizeof(ValidSize[0]);I++) if (WinSize==ValidSize[I]) return(true); WinSize=0x400000; return(false);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -