salty-ircd/source/ircd/helpers.d

72 lines
1.7 KiB
D

module ircd.helpers;
import std.range : array, empty, front, popFront, save;
import std.algorithm : map;
//Based on std.path.globMatch (https://github.com/dlang/phobos/blob/v2.073.2/std/path.d#L3164)
//License: Boost License 1.0 (http://www.boost.org/LICENSE_1_0.txt)
//Copyright (c) Lars T. Kyllingstad, Walter Bright
@safe pure bool wildcardMatch(string input, string pattern)
{
foreach (ref pi; 0 .. pattern.length)
{
const pc = pattern[pi];
switch (pc)
{
case '*':
if (pi + 1 == pattern.length)
{
return true;
}
for (; !input.empty; input.popFront())
{
auto p = input.save;
if (wildcardMatch(p, pattern[pi + 1 .. pattern.length]))
{
return true;
}
}
return false;
case '?':
if (input.empty)
{
return false;
}
input.popFront();
break;
default:
if (input.empty || pc != input.front)
{
return false;
}
input.popFront();
break;
}
}
return input.empty;
}
@safe pure dchar toIRCLower(dchar input)
{
import std.uni : toLower;
switch (input)
{
case '[':
return '{';
case ']':
return '}';
case '\\':
return '|';
default:
return input.toLower;
}
}
@safe pure string toIRCLower(string input)
{
import std.utf : byChar;
return input.map!toIRCLower.byChar.array.idup;
}