*** empty log message ***
[m17n/m17n-lib-cs.git] / MSymbol.cs
index 67fa7e9..fe2a698 100644 (file)
@@ -10,64 +10,108 @@ namespace M17N.Core
 
     private class MSymbolData
     {
-      public string name;
-      public Object value;
-      public MPlist plist;
+      public readonly string Name;
+      public readonly MTextProperty.Flags Flags;
+      public object Value;
+      public MPlist Plist;
 
-      public MSymbolData (string name)
+      public MSymbolData (string name, MTextProperty.Flags flags)
       {
-       this.name = name;
+       Name = name;
+       Flags = flags;
       }
     }
 
     private MSymbolData data;
 
-    static public MSymbol nil = new MSymbol ("nil");
-    static public MSymbol t = new MSymbol ("t");
+    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);
+         data = new MSymbolData (name, MTextProperty.Flags.None);
          pool.Add (name, data);
        }
       else
        data = (MSymbolData) pool[name];
     }
 
-    public override string ToString () { return data.name; }
-
-    public override bool Equals (Object sym)
+    public MSymbol (string name, MTextProperty.Flags flags)
     {
-      return (this.data == ((MSymbol) sym).data);
+      if (! pool.ContainsKey (name))
+       {
+         data = new MSymbolData (name, flags);
+         pool.Add (name, data);
+       }
+      else
+       {
+         if (((MSymbolData) pool[name]).Flags != flags)
+           throw new ArgumentException ("Invalid MTextProperty.Flags");
+       }
     }
 
-    public override int GetHashCode ()
+    public MTextProperty.Flags TextPropertyFlags { get { return data.Flags; } }
+
+    public override string ToString ()
     {
-      return (data.name.GetHashCode ());
+      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)
     {
-      return ((object) sym1.data == (object) sym2.data);
+      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 ((object) sym1.data != (object) sym2.data);
+      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)
+    public object Get (MSymbol key)
     {
-      return (data.plist == null ? null : data.plist.get (key));
+      return (data.Plist == null ? null : data.Plist.Get (key));
     }
 
-    public object put (MSymbol key, object val)
+    public object Put (MSymbol key, object val)
     {
-      if (data.plist == null)
-       data.plist = new MPlist ();
-      return data.plist.put (key, val);
+      if (data.Plist == null)
+       data.Plist = new MPlist ();
+      return data.Plist.Put (key, val);
     }
   }
 }