about summary refs log tree commit diff
path: root/IrcTokens/Line.cs
diff options
context:
space:
mode:
Diffstat (limited to 'IrcTokens/Line.cs')
-rw-r--r--IrcTokens/Line.cs30
1 files changed, 17 insertions, 13 deletions
diff --git a/IrcTokens/Line.cs b/IrcTokens/Line.cs
index 6198c04..27d9c0d 100644
--- a/IrcTokens/Line.cs
+++ b/IrcTokens/Line.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.Linq;
 
 namespace IrcTokens
@@ -20,7 +21,7 @@ namespace IrcTokens
         public override string ToString() =>
             $"Line(source={Source}, command={Command}, tags={string.Join(";", Tags.Select(kvp => $"{kvp.Key}={kvp.Value}"))}, params={string.Join(",", Params)})";
 
-        public override int GetHashCode() => Format().GetHashCode();
+        public override int GetHashCode() => Format().GetHashCode(StringComparison.Ordinal);
 
         public override bool Equals(object obj)
         {
@@ -41,6 +42,9 @@ namespace IrcTokens
         /// <param name="line">irc line to parse</param>
         public Line(string line)
         {
+            if (string.IsNullOrWhiteSpace(line))
+                throw new ArgumentNullException(nameof(line));
+
             _rawLine = line;
             string[] split;
 
@@ -54,9 +58,9 @@ namespace IrcTokens
 
                 foreach (var part in messageTags.Substring(1).Split(';'))
                 {
-                    if (part.Contains('='))
+                    if (part.Contains('=', StringComparison.Ordinal))
                     {
-                        split = part.Split('=');
+                        split = part.Split('=', 2);
                         Tags[split[0]] = Protocol.UnescapeTag(split[1]);
                     }
                     else
@@ -67,19 +71,19 @@ namespace IrcTokens
             }
 
             string trailing;
-            if (line.Contains(" :"))
+            if (line.Contains(" :", StringComparison.Ordinal))
             {
-                split = line.Split(" :");
+                split = line.Split(" :", 2);
                 line = split[0];
-                trailing = string.Join(" :", split.Skip(1));
+                trailing = split[1];
             }
             else
             {
                 trailing = null;
             }
 
-            Params = line.Contains(' ')
-                ? line.Split(' ').Where(p => !string.IsNullOrWhiteSpace(p)).ToList()
+            Params = line.Contains(' ', StringComparison.Ordinal)
+                ? line.Split(' ', StringSplitOptions.RemoveEmptyEntries).ToList()
                 : new List<string> {line};
 
             if (Params[0].StartsWith(':'))
@@ -90,7 +94,7 @@ namespace IrcTokens
 
             if (Params.Count > 0)
             {
-                Command = Params[0].ToUpper();
+                Command = Params[0].ToUpper(CultureInfo.InvariantCulture);
                 Params.RemoveAt(0);
             }
 
@@ -129,14 +133,14 @@ namespace IrcTokens
 
                 foreach (var p in Params)
                 {
-                    if (p.Contains(' '))
-                        throw new ArgumentException("non-last parameters cannot have spaces", p);
+                    if (p.Contains(' ', StringComparison.Ordinal))
+                        throw new ArgumentException(@"non-last parameters cannot have spaces", p);
                     if (p.StartsWith(':'))
-                        throw new ArgumentException("non-last parameters cannot start with colon", p);
+                        throw new ArgumentException(@"non-last parameters cannot start with colon", p);
                 }
                 outs.AddRange(Params);
 
-                if (string.IsNullOrWhiteSpace(last) || last.Contains(' ') || last.StartsWith(':'))
+                if (string.IsNullOrWhiteSpace(last) || last.Contains(' ', StringComparison.Ordinal) || last.StartsWith(':'))
                     last = $":{last}";
                 outs.Add(last);
             }