using System; using System.Collections; using M17N.Core; namespace M17N.Core { public class MSymbol { static private Hashtable pool = new Hashtable (); private class MSymbolData { public string name; public object value; public MPlist plist; public MSymbolData (string name) { this.name = name; } } private MSymbolData data; public static MSymbol nil = new MSymbol ("nil"); public static MSymbol t = new MSymbol ("t"); public static MSymbol symbol = new MSymbol ("symbol"); public static MSymbol mtext = new MSymbol ("mtext"); public static MSymbol plist = new MSymbol ("plist"); public static MSymbol integer = new MSymbol ("integer"); public MSymbol (string name) { if (! pool.ContainsKey (name)) { data = new MSymbolData (name); pool.Add (name, data); } else data = (MSymbolData) pool[name]; } public override string ToString () { string str = ""; foreach (char c in data.name) { if (c == '\\' || c == ' ' || c == '\'' || c == '\"' || c == ':') str += "\\"; str += c; } return str; } public static bool operator== (MSymbol sym1, MSymbol sym2) { if (System.Object.ReferenceEquals(sym1, sym2)) return true; if (((object) sym1 == null) || ((object) sym2 == null)) return false; return sym1.data == sym2.data; } public static bool operator!= (MSymbol sym1, MSymbol sym2) { return ! (sym1 == sym2); } public override bool Equals (object sym) { if (sym == null) return false; return (this.data == ((MSymbol) sym).data); } public override int GetHashCode () { return (data.name.GetHashCode ()); } public MPlist Find (MSymbol key) { return (data.plist == null ? null : data.plist.Find (key)); } public object Get (MSymbol key) { return (data.plist == null ? null : data.plist.Get (key)); } public object Put (MSymbol key, object val) { if (data.plist == null) data.plist = new MPlist (); return data.plist.Put (key, val); } } }