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

📄 cmddata.cpp

📁 Rar 的控制台解压程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
          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 + -