/*
|
Directory utility functions that are common to all posix and posix-like platforms.
|
*/
|
|
#include "il2cpp-config.h"
|
|
#include "StringUtils.h"
|
#include "DirectoryUtils.h"
|
|
namespace il2cpp
|
{
|
namespace utils
|
{
|
bool Match(const std::string name, size_t nameIndex, const std::string& pattern, const size_t patternIndex)
|
{
|
const size_t nameLength = name.length();
|
|
for (size_t i = patternIndex, patternLength = pattern.length(); i < patternLength; ++i)
|
{
|
const char c = pattern[i];
|
|
if (c == '*')
|
{
|
if (i + 1 == patternLength) // Star is last character, match everything.
|
return true;
|
|
do
|
{
|
// Check that we match the rest of the pattern against name.
|
if (Match(name, nameIndex, pattern, i + 1))
|
return true;
|
}
|
while (nameIndex++ < nameLength);
|
|
return false;
|
}
|
else if (c == '?')
|
{
|
if (nameIndex == nameLength)
|
return false;
|
|
nameIndex++;
|
}
|
else
|
{
|
if (nameIndex == nameLength)
|
{
|
// A pattern ending with .* should match a file with no extension
|
// The pattern "file.*" should match "file"
|
if (c == '.' && i + 2 == patternLength && pattern[i + 1] == '*')
|
return true;
|
return false;
|
}
|
else if (name[nameIndex] != c)
|
{
|
return false;
|
}
|
|
nameIndex++;
|
}
|
}
|
|
// All characters matched
|
return nameIndex == nameLength;
|
}
|
|
bool Match(const std::string name, const std::string& pattern)
|
{
|
return Match(name, 0, pattern, 0);
|
}
|
|
std::string CollapseAdjacentStars(const std::string& pattern)
|
{
|
std::string matchPattern;
|
matchPattern.reserve(pattern.length());
|
|
// Collapse adjacent stars into one
|
for (size_t i = 0, length = pattern.length(); i < length; ++i)
|
{
|
if (i > 0 && pattern[i] == '*' && pattern[i - 1] == '*')
|
continue;
|
|
matchPattern.append(1, pattern[i]);
|
}
|
|
return matchPattern;
|
}
|
}
|
}
|