Beispiel #1
0
wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath)
{
  const wchar *DestPtr=SrcPath;
  for (const wchar *s=DestPtr;*s!=0;s++)
    if (IsPathDiv(s[0]) && s[1]=='.' && s[2]=='.' && IsPathDiv(s[3]))
      DestPtr=s+4;
  while (*DestPtr)
  {
    const wchar *s=DestPtr;
    if (s[0] && IsDriveDiv(s[1]))
      s+=2;
    if (s[0]=='\\' && s[1]=='\\')
    {
      const wchar *Slash=strchrw(s+2,'\\');
      if (Slash!=NULL && (Slash=strchrw(Slash+1,'\\'))!=NULL)
        s=Slash+1;
    }
    for (const wchar *t=s;*t!=0;t++)
      if (IsPathDiv(*t))
        s=t+1;
      else
        if (*t!='.')
          break;
    if (s==DestPtr)
      break;
    DestPtr=s;
  }
  if (DestPath!=NULL)
  {
    wchar TmpStr[NM];
    strncpyw(TmpStr,DestPtr,sizeof(TmpStr)/sizeof(TmpStr[0])-1);
    strcpyw(DestPath,TmpStr);
  }
  return((wchar *)DestPtr);
}
Beispiel #2
0
bool match(wchar *pattern,wchar *string,bool ForceCase)
{
    for (;; ++string)
    {
        wchar stringc=touppercw(*string,ForceCase);
        wchar patternc=touppercw(*pattern++,ForceCase);
        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(mstricompcw(pattern+1,string+1,ForceCase)==0);
                }
            }

            while (*string)
                if (match(pattern,string++,ForceCase))
                    return(true);
            return(false);
        default:
            if (patternc != stringc)
            {
                // Allow "name." mask match "name" and "name.\" match "name\".
                if (patternc=='.' && (stringc==0 || stringc=='\\' || stringc=='.'))
                    return(match(pattern,string,ForceCase));
                else
                    return(false);
            }
            break;
        }
    }
}
Beispiel #3
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;
    }
  }
}
Beispiel #4
0
wchar* strpbrkw(const wchar *s1,const wchar *s2)
{
  while (*s1)
  {
    if (strchrw(s2,*s1)!=NULL)
      return((wchar *)s1);
    s1++;
  }
  return(NULL);
}