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

📄 cmddata.cpp

📁 source code for unrar3.3.4,uppack the .rar files,for multi-os
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -