bool CmpName(wchar *Wildcard,wchar *Name,int CmpPath) { if (CmpPath!=MATCH_NAMES) { int WildLength=strlenw(Wildcard); if (CmpPath!=MATCH_EXACTPATH && strnicompcw(Wildcard,Name,WildLength)==0) { wchar NextCh=Name[WildLength]; if (NextCh==L'\\' || NextCh==L'/' || NextCh==0) return(true); } wchar Path1[NM],Path2[NM]; GetFilePath(Wildcard,Path1); GetFilePath(Name,Path2); if ((CmpPath==MATCH_PATH || CmpPath==MATCH_EXACTPATH) && stricompcw(Path1,Path2)!=0) return(false); if (CmpPath==MATCH_SUBPATH || CmpPath==MATCH_WILDSUBPATH) if (IsWildcard(NULL,Path1)) return(match(Wildcard,Name)); else if (CmpPath==MATCH_SUBPATH || IsWildcard(NULL,Wildcard)) { if (*Path1 && strnicompcw(Path1,Path2,strlenw(Path1))!=0) return(false); } else if (stricompcw(Path1,Path2)!=0) return(false); } wchar *Name1=PointToName(Wildcard); wchar *Name2=PointToName(Name); if (strnicompcw(L"__rar_",Name2,6)==0) return(false); return(match(Name1,Name2)); }
int 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); }
int 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); #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; if (ArgNameW==NULL) { CharToWide(ArgName,ArgW); ArgNameW=ArgW; } if ((NewLhd.Flags & LHD_UNICODE)==0) { CharToWide(NewLhd.FileName,NameW); NamePtr=NameW; } if (CmpName(ArgNameW,NamePtr,MatchType)) { if (ExactMatch!=NULL) *ExactMatch=stricompcw(ArgNameW,NamePtr)==0; return(StringCount); } continue; } #endif if (CmpName(ArgName,NewLhd.FileName,MatchType)) { if (ExactMatch!=NULL) *ExactMatch=stricompc(ArgName,NewLhd.FileName)==0; return(StringCount); } } return(0); }
bool match(wchar *pattern,wchar *string) { for (;; ++string) { wchar stringc=touppercw(*string); wchar patternc=touppercw(*pattern++); switch (patternc) { case 0: return(stringc==0); case '?': if (stringc == 0) return(false); break; case '*': if (*pattern==0) return(true); if (*pattern=='.') { if (pattern[1]=='*' && pattern[2]==0) return(true); wchar *dot=strchrw(string,'.'); if (pattern[1]==0) return (dot==NULL || dot[1]==0); if (dot!=NULL) { string=dot; if (strpbrkw(pattern,L"*?")==NULL && strchrw(string+1,'.')==NULL) return(stricompcw(pattern+1,string+1)==0); } } while (*string) if (match(pattern,string++)) return(true); return(false); default: if (patternc != stringc) if (patternc=='.' && stringc==0) return(match(pattern,string)); else return(false); break; } } }
int mstricompcw(const wchar *Str1,const wchar *Str2,bool ForceCase) { if (ForceCase) return(strcmpw(Str1,Str2)); return(stricompcw(Str1,Str2)); }