public static void Test(HashSet <ArgMatchTest> a, Message msg) { List <Signature> sigs = new List <Signature> (); sigs.AddRange(msg.Signature.GetParts()); if (sigs.Count == 0) { a.Clear(); return; } a.RemoveWhere(delegate(ArgMatchTest t) { return(t.ArgNum >= sigs.Count || t.Signature != sigs[t.ArgNum]); }); // Sorting the list here is not ideal List <ArgMatchTest> tests = new List <ArgMatchTest> (a); tests.Sort(delegate(ArgMatchTest aa, ArgMatchTest bb) { return(aa.ArgNum - bb.ArgNum); }); if (tests.Count == 0) { a.Clear(); return; } MessageReader reader = new MessageReader(msg); int argNum = 0; foreach (ArgMatchTest test in tests) { if (argNum > test.ArgNum) { // This test cannot pass because a previous test already did. // So we already know it will fail without even trying. // This logic will need to be changed to support wildcards. a.Remove(test); continue; } while (argNum != test.ArgNum) { Signature sig = sigs[argNum]; if (!reader.StepOver(sig)) { throw new Exception(); } argNum++; } // TODO: Avoid re-reading values int savedPos = reader.pos; if (!reader.ReadValue(test.Signature[0]).Equals(test.Value)) { a.Remove(test); reader.pos = savedPos; continue; } argNum++; } }
public static void Test(HashSet<ArgMatchTest> a, Message msg) { List<Signature> sigs = new List<Signature> (); sigs.AddRange (msg.Signature.GetParts ()); if (sigs.Count == 0) { a.Clear (); return; } a.RemoveWhere ( delegate (ArgMatchTest t) { return t.ArgNum >= sigs.Count || t.Signature != sigs[t.ArgNum]; } ); // Sorting the list here is not ideal List<ArgMatchTest> tests = new List<ArgMatchTest> (a); tests.Sort ( delegate (ArgMatchTest aa, ArgMatchTest bb) { return aa.ArgNum - bb.ArgNum; } ); if (tests.Count == 0) { a.Clear (); return; } MessageReader reader = new MessageReader (msg); int argNum = 0; foreach (ArgMatchTest test in tests) { if (argNum > test.ArgNum) { // This test cannot pass because a previous test already did. // So we already know it will fail without even trying. // This logic will need to be changed to support wildcards. a.Remove (test); continue; } while (argNum != test.ArgNum) { Signature sig = sigs[argNum]; if (!reader.StepOver (sig)) throw new Exception (); argNum++; } // TODO: Avoid re-reading values int savedPos = reader.pos; if (!reader.ReadValue (test.Signature[0]).Equals (test.Value)) { a.Remove (test); reader.pos = savedPos; continue; } argNum++; } }
static void PrintValue (MessageReader reader, Signature sig, int depth) { string indent = new String (' ', depth * 2); indent += " "; //Console.Write (indent + indent + "arg" + argNum + " " + sig + ": "); Console.Write (indent); if (sig == Signature.VariantSig) { foreach (Signature elemSig in reader.StepInto (sig)) { Console.WriteLine ("Variant '{0}' (", elemSig); PrintValue (reader, elemSig, depth + 1); Console.WriteLine (indent + ")"); } } else if (sig.IsPrimitive) { object arg = reader.ReadValue (sig[0]); Type argType = sig.ToType (); if (sig == Signature.StringSig || sig == Signature.ObjectPathSig) Console.WriteLine ("{0} \"{1}\"", argType.Name, arg); else if (sig == Signature.SignatureSig) Console.WriteLine ("{0} '{1}'", argType.Name, arg); else Console.WriteLine ("{0} {1}", argType.Name, arg); } else if (sig.IsArray) { Console.WriteLine ("Array ["); foreach (Signature elemSig in reader.StepInto (sig)) PrintValue (reader, elemSig, depth + 1); Console.WriteLine (indent + "]"); } else if (sig.IsDictEntry) { Console.WriteLine ("DictEntry {"); foreach (Signature elemSig in reader.StepInto (sig)) PrintValue (reader, elemSig, depth + 1); Console.WriteLine (indent + "}"); } else if (sig.IsStruct) { Console.WriteLine ("Struct {"); foreach (Signature elemSig in reader.StepInto (sig)) PrintValue (reader, elemSig, depth + 1); Console.WriteLine (indent + "}"); } else { reader.StepOver (sig); Console.WriteLine ("'{0}'?", sig); } }