2 using System.Collections;
9 static private Hashtable pool = new Hashtable ();
11 private class MSymbolData
13 public readonly string Name;
14 public readonly MTextProperty.Flags Flags;
18 public MSymbolData (string name, MTextProperty.Flags flags)
25 private MSymbolData data;
27 public static MSymbol nil = new MSymbol ("nil");
28 public static MSymbol t = new MSymbol ("t");
29 public static MSymbol symbol = new MSymbol ("symbol");
30 public static MSymbol mtext = new MSymbol ("mtext");
31 public static MSymbol plist = new MSymbol ("plist");
32 public static MSymbol integer = new MSymbol ("integer");
34 public MSymbol (string name)
36 if (! pool.ContainsKey (name))
38 data = new MSymbolData (name, MTextProperty.Flags.None);
39 pool.Add (name, data);
42 data = (MSymbolData) pool[name];
45 public MSymbol (string name, MTextProperty.Flags flags)
47 if (! pool.ContainsKey (name))
49 data = new MSymbolData (name, flags);
50 pool.Add (name, data);
54 if (((MSymbolData) pool[name]).Flags != flags)
55 throw new ArgumentException ("Invalid MTextProperty.Flags");
59 public MTextProperty.Flags TextPropertyFlags { get { return data.Flags; } }
61 public override string ToString ()
65 foreach (char c in data.Name)
67 if (c == '\\' || c == ' ' || c == '\'' || c == '\"' || c == ':')
74 public static bool operator== (MSymbol sym1, MSymbol sym2)
76 if (System.Object.ReferenceEquals(sym1, sym2))
78 if (((object) sym1 == null) || ((object) sym2 == null))
80 return sym1.data == sym2.data;
83 public static bool operator!= (MSymbol sym1, MSymbol sym2)
85 return ! (sym1 == sym2);
88 public override bool Equals (object sym)
92 return (this.data == ((MSymbol) sym).data);
95 public override int GetHashCode ()
97 return (data.Name.GetHashCode ());
100 public MPlist Find (MSymbol key)
102 return (data.Plist == null ? null : data.Plist.Find (key));
105 public object Get (MSymbol key)
107 return (data.Plist == null ? null : data.Plist.Get (key));
110 public object Put (MSymbol key, object val)
112 if (data.Plist == null)
113 data.Plist = new MPlist ();
114 return data.Plist.Put (key, val);