about summary refs log tree commit diff
path: root/IrcStates/Casemap.cs
diff options
context:
space:
mode:
Diffstat (limited to 'IrcStates/Casemap.cs')
-rw-r--r--IrcStates/Casemap.cs43
1 files changed, 43 insertions, 0 deletions
diff --git a/IrcStates/Casemap.cs b/IrcStates/Casemap.cs
new file mode 100644
index 0000000..484c490
--- /dev/null
+++ b/IrcStates/Casemap.cs
@@ -0,0 +1,43 @@
+using System;
+
+namespace IrcStates
+{
+    public static class Casemap
+    {
+        public enum CaseMapping
+        {
+            Rfc1459,
+            Ascii
+        }
+
+        private const string AsciiUpperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+        private const string AsciiLowerChars = "abcdefghijklmnopqrstuvwxyz";
+        private const string Rfc1459UpperChars = AsciiUpperChars + @"[]~\";
+        private const string Rfc1459LowerChars = AsciiLowerChars + @"{}^|";
+
+        private static string Replace(string s, string upper, string lower)
+        {
+            for (var i = 0; i < upper.Length; ++i)
+            {
+                s = s.Replace(upper[i], lower[i]);
+            }
+
+            return s;
+        }
+
+        public static string CaseFold(CaseMapping mapping, string s)
+        {
+            if (s != null)
+            {
+                return mapping switch
+                {
+                    CaseMapping.Rfc1459 => Replace(s, Rfc1459UpperChars, Rfc1459LowerChars),
+                    CaseMapping.Ascii => Replace(s, AsciiUpperChars, AsciiLowerChars),
+                    _ => throw new ArgumentOutOfRangeException(nameof(mapping), mapping, null)
+                };
+            }
+
+            return string.Empty;
+        }
+    }
+}