📄 cmddata.cpp
字号:
#include "rar.hpp"CommandData::CommandData(){ FileArgs=ExclArgs=StoreArgs=ArcNames=NULL; Init();}CommandData::~CommandData(){ Close();}void CommandData::Init(){ Close(); *Command=0; *ArcName=0; *ArcNameW=0; FileLists=false; NoMoreSwitches=false; TimeConverted=false; FileArgs=new StringList; ExclArgs=new StringList; StoreArgs=new StringList; ArcNames=new StringList;}void CommandData::Close(){ delete FileArgs; delete ExclArgs; delete StoreArgs; delete ArcNames; FileArgs=ExclArgs=StoreArgs=ArcNames=NULL; NextVolSizes.Reset();}#if !defined(SFX_MODULE) && !defined(_WIN_CE)void CommandData::ParseArg(char *Arg,wchar *ArgW){ if (IsSwitch(*Arg) && !NoMoreSwitches) if (Arg[1]=='-') NoMoreSwitches=true; else ProcessSwitch(&Arg[1]); else if (*Command==0) { strncpy(Command,Arg,sizeof(Command)); if (ArgW!=NULL) strncpyw(CommandW,ArgW,sizeof(CommandW)/sizeof(CommandW[0])); if (toupper(*Command)=='S') { const char *SFXName=Command[1] ? Command+1:DefSFXName; if (PointToName(SFXName)!=SFXName || FileExist(SFXName)) strcpy(SFXModule,SFXName); else GetConfigName(SFXName,SFXModule); }#ifndef GUI *Command=toupper(*Command); if (*Command!='I' && *Command!='S') strupper(Command);#endif } else if (*ArcName==0) { strncpy(ArcName,Arg,sizeof(ArcName)); if (ArgW!=NULL) strncpyw(ArcNameW,ArgW,sizeof(ArcNameW)/sizeof(ArcNameW[0])); } else { int Length=strlen(Arg); char EndChar=Arg[Length-1]; char CmdChar=toupper(*Command); bool Add=strchr("AFUM",CmdChar)!=NULL; bool Extract=CmdChar=='X' || CmdChar=='E'; if ((IsDriveDiv(EndChar) || IsPathDiv(EndChar)) && !Add) strcpy(ExtrPath,Arg); else if ((Add || CmdChar=='T') && *Arg!='@') FileArgs->AddString(Arg); else { struct FindData FileData; bool Found=FindFile::FastFind(Arg,NULL,&FileData); if (!Found && *Arg=='@' && !IsWildcard(Arg)) { ReadTextFile(Arg+1,FileArgs,false,true,true,true,true); FileLists=true; } else if (Found && FileData.IsDir && Extract && *ExtrPath==0) { strcpy(ExtrPath,Arg); AddEndSlash(ExtrPath); } else FileArgs->AddString(Arg); } }}#endifvoid CommandData::ParseDone(){ if (FileArgs->ItemsCount()==0 && !FileLists) FileArgs->AddString(MASKALL); char CmdChar=toupper(*Command); bool Extract=CmdChar=='X' || CmdChar=='E'; if (Test && Extract) Test=false; BareOutput=(CmdChar=='L' || CmdChar=='V') && Command[1]=='B';}#if !defined(SFX_MODULE) && !defined(_WIN_CE)void CommandData::ParseEnvVar(){ char *EnvStr=getenv("RAR"); if (EnvStr!=NULL) ProcessSwitchesString(EnvStr);}#endif#if !defined(GUI) && !defined(SFX_MODULE)bool CommandData::IsConfigEnabled(int argc,char *argv[]){ for (int I=1;I<argc;I++) if (IsSwitch(*argv[I]) && stricomp(&argv[I][1],"cfg-")==0) return(false); return(true);}#endif#if !defined(GUI) && !defined(SFX_MODULE)void CommandData::ReadConfig(int argc,char *argv[]){ StringList List; if (ReadTextFile(DefConfigName,&List,true)) { char *Str; while ((Str=List.GetString())!=NULL) if (strnicomp(Str,"switches=",9)==0) ProcessSwitchesString(Str+9); }}#endif#if !defined(SFX_MODULE) && !defined(_WIN_CE)void CommandData::ProcessSwitchesString(char *Str){ while (*Str) { while (!IsSwitch(*Str) && *Str!=0) Str++; if (*Str==0) break; char *Next=Str; while (!(Next[0]==' ' && IsSwitch(Next[1])) && *Next!=0) Next++; char NextChar=*Next; *Next=0; ProcessSwitch(Str+1); *Next=NextChar; Str=Next; }}#endif#if !defined(SFX_MODULE) && !defined(_WIN_CE)void CommandData::ProcessSwitch(char *Switch){ switch(toupper(Switch[0])) { case 'I': if (strnicomp(&Switch[1],"LOG",3)==0) { strncpy(LogName,Switch[4] ? Switch+4:DefLogName,sizeof(LogName)); break; } if (stricomp(&Switch[1],"SND")==0) { Sound=true; break; } if (stricomp(&Switch[1],"ERR")==0) { MsgStream=MSG_STDERR; break; } if (strnicomp(&Switch[1],"EML",3)==0) { strncpy(EmailTo,Switch[4] ? Switch+4:"@",sizeof(EmailTo)); EmailTo[sizeof(EmailTo)-1]=0; break; } if (stricomp(&Switch[1],"NUL")==0) { MsgStream=MSG_NULL; break; } if (stricomp(&Switch[1],"DP")==0) { DisablePercentage=true; break; } if (stricomp(&Switch[1],"OFF")==0) { Shutdown=true; break; } break; case 'T': switch(toupper(Switch[1])) { case 'K': ArcTime=ARCTIME_KEEP; break; case 'L': ArcTime=ARCTIME_LATEST; break; case 'O': FileTimeBefore.SetAgeText(Switch+2); break; case 'N': FileTimeAfter.SetAgeText(Switch+2); break; case 'B': FileTimeBefore.SetIsoText(Switch+2); break; case 'A': FileTimeAfter.SetIsoText(Switch+2); break; case 'S': { EXTTIME_MODE Mode=EXTTIME_HIGH3; bool CommonMode=Switch[2]>='0' && Switch[2]<='4'; if (CommonMode) Mode=(EXTTIME_MODE)(Switch[2]-'0'); if (Switch[2]=='-') Mode=EXTTIME_NONE; if (CommonMode || Switch[2]=='-' || Switch[2]=='+' || Switch[2]==0) xmtime=xctime=xatime=Mode; else { if (Switch[3]>='0' && Switch[3]<='4') Mode=(EXTTIME_MODE)(Switch[3]-'0'); if (Switch[3]=='-') Mode=EXTTIME_NONE; switch(toupper(Switch[2])) { case 'M': xmtime=Mode; break; case 'C': xctime=Mode; break; case 'A': xatime=Mode; break; case 'R': xarctime=Mode; break; } } } break; case '-': Test=false; break; case 0: Test=true; break; default: BadSwitch(Switch); break; } break; case 'A': switch(toupper(Switch[1])) { case 'C': ClearArc=true; break; case 'D': AppendArcNameToPath=true; break; case 'G': if (Switch[2]=='-' && Switch[3]==0) GenerateArcName=0; else { GenerateArcName=true; strncpy(GenerateMask,Switch+2,sizeof(GenerateMask)); } break; case 'N': //reserved for archive name break; case 'O': AddArcOnly=true; break; case 'P': strcpy(ArcPath,Switch+2); break; case 'S': SyncFiles=true; break; } break; case 'D': if (Switch[2]==0) switch(toupper(Switch[1])) { case 'S': DisableSortSolid=true; break; case 'H': OpenShared=true; break; case 'F': DeleteFiles=true; break; } break; case 'O': switch(toupper(Switch[1])) { case '+': Overwrite=OVERWRITE_ALL; break; case '-': Overwrite=OVERWRITE_NONE; break; case 'W': ProcessOwners=true; break;#ifdef SAVE_LINKS case 'L': SaveLinks=true; break;#endif#ifdef _WIN_32 case 'S': SaveStreams=true; break;#endif default : BadSwitch(Switch); break; } break; case 'R': switch(toupper(Switch[1])) { case 0: Recurse=RECURSE_ALWAYS; break; case '-': Recurse=0; break; case '0': Recurse=RECURSE_WILDCARDS; break; case 'I': { Priority=atoi(Switch+2); char *ChPtr=strchr(Switch+2,':'); if (ChPtr!=NULL) SleepTime=atoi(ChPtr+1); SetPriority(Priority); } break; } break; case 'Y': AllYes=true; break; case 'X': if (Switch[1]!=0) if (Switch[1]=='@' && !IsWildcard(Switch)) ReadTextFile(Switch+2,ExclArgs,false,true,true,true,true); else ExclArgs->AddString(Switch+1); break; case 'E': switch(toupper(Switch[1])) { case 'P': switch(Switch[2]) { case 0: ExclPath=EXCL_SKIPWHOLEPATH; break; case '1': ExclPath=EXCL_BASEPATH; break; case '2': ExclPath=EXCL_SAVEFULLPATH; break; } break; case 'D': ExclEmptyDir=true; break; case 'E': ProcessEA=false; break; case 'N': NoEndBlock=true; break; default: ExclFileAttr=GetExclAttr(&Switch[1]); break; } break; case 'P': if (Switch[1]==0) { GetPassword(PASSWORD_GLOBAL,NULL,Password,sizeof(Password)); eprintf("\n"); } else strncpy(Password,Switch+1,sizeof(Password)); break; case 'H': if (toupper(Switch[1])=='P') { EncryptHeaders=true; if (Switch[2]!=0) strncpy(Password,Switch+2,sizeof(Password)); else if (*Password==0) { GetPassword(PASSWORD_GLOBAL,NULL,Password,sizeof(Password)); eprintf("\n"); } } break; case 'Z': strncpy(CommentFile,Switch[1]!=0 ? Switch+1:"stdin",sizeof(CommentFile)); break; case 'M': switch(toupper(Switch[1])) { case 'C': { char *Str=Switch+2; if (*Str=='-') for (int I=0;I<sizeof(FilterModes)/sizeof(FilterModes[0]);I++) FilterModes[I].State=FILTER_DISABLE; else while (*Str) { int Param1=0,Param2=0; FilterState State=FILTER_AUTO; FilterType Type=FILTER_NONE; if (isdigit(*Str)) { Param1=atoi(Str); while (isdigit(*Str)) Str++; } if (*Str==':' && isdigit(Str[1])) { Param2=atoi(++Str); while (isdigit(*Str)) Str++; } switch(toupper(*(Str++))) { case 'T': Type=FILTER_PPM; break; case 'E': Type=FILTER_E8; break; case 'D': Type=FILTER_DELTA; break; case 'A': Type=FILTER_AUDIO; break; case 'C': Type=FILTER_RGB; break; case 'I': Type=FILTER_ITANIUM; break; case 'L': Type=FILTER_UPCASETOLOW; break; } if (*Str=='+' || *Str=='-') State=*(Str++)=='+' ? FILTER_FORCE:FILTER_DISABLE; FilterModes[Type].State=State; FilterModes[Type].Param1=Param1; FilterModes[Type].Param2=Param2; } } break; case 'M': break; case 'D': { if ((WinSize=atoi(&Switch[2]))==0) WinSize=0x10000<<(toupper(Switch[2])-'A'); else WinSize*=1024; if (!CheckWinSize()) BadSwitch(Switch); } break; case 'S': { char *Names=Switch+2,DefNames[512]; if (*Names==0) { strcpy(DefNames,DefaultStoreList); Names=DefNames; } while (*Names!=0) { char *End=strchr(Names,';'); if (End!=NULL) *End=0; if (*Names=='.') Names++; char Mask[NM]; if (strpbrk(Names,"*?.")==NULL) sprintf(Mask,"*.%s",Names); else strcpy(Mask,Names); StoreArgs->AddString(Mask); if (End==NULL) break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -