*** empty log message ***
[m17n/m17n-lib-cs.git] / MInputMethod.cs
index 0a41c18..ebb8277 100644 (file)
@@ -411,6 +411,25 @@ namespace M17N.Input
                   : new KeySeq (term.Listval));
         }
 
+       public override bool Equals (object obj)
+       {
+        KeySeq ks = obj as KeySeq;
+        if (ks == null || ks.keyseq.Count != keyseq.Count)
+          return false;
+        for (int i = 0; i < keyseq.Count; i++)
+          if (keyseq[i] != ks.keyseq[i])
+            return false;
+        return true;
+       }
+
+       public override int GetHashCode ()
+       {
+        int code = 0;
+        for (int i = 0; i < keyseq.Count; i++)
+          code ^= keyseq[i].GetHashCode ();
+        return code;
+       }
+
        public override string ToString ()
        {
         MText mt;
@@ -581,6 +600,15 @@ namespace M17N.Input
         return Get ((MSymbol) node.InnerText);
        }
 
+       
+       public override bool Equals (object obj)
+       {
+        Marker m = obj as Marker;
+        return (m != null && m.mname == mname);
+       }
+
+       public override int GetHashCode () { return mname.GetHashCode (); }
+
        public class Named : Marker
        {
         public Named (MSymbol mname) : base (mname) { }
@@ -1035,6 +1063,19 @@ namespace M17N.Input
          throw new Exception ("Invalid selector name: " + name);
        return selector;
       }
+
+      public override bool Equals (object obj)
+      {
+       Selector s = obj as Selector;
+       return (s != null && s.tag == tag);
+      }
+
+      public override int GetHashCode () { return (int) tag; }
+
+      public override string ToString ()
+      {
+       return "<selector>@" + tag + "</selector>";
+      }
     }
 
     internal class Map
@@ -1065,6 +1106,31 @@ namespace M17N.Input
       }
     }
 
+    protected class Action
+    {
+      private Xex.Term action;
+
+      public Action (Xex.Domain domain, Xex.Term[] terms)
+      {
+       Xex.Term[] args = new Xex.Term[terms.Length];
+       args[0] = Tcatch_tag;
+       for (int i = 0; i < terms.Length; i++)
+         args[i + 1] = terms[i];
+       action = new Xex.Term (domain, Qcatch, args);
+      }
+
+      public bool Run (Xex.Domain domain)
+      {
+       Xex.Term result = action.Eval (domain);
+       if (result.IsError)
+         {
+           ((Context) domain.context).Error = result.ToString ();
+           return false;
+         }
+       return (result != Tcatch_tag);
+      }
+    }
+
     internal class Keymap
     {
       public Dictionary<Key, Keymap> submaps;
@@ -2066,6 +2132,44 @@ namespace M17N.Input
       return terms;
     }
 
+    private Xex.Variable[] parse_args (Xex.Domain domain, Xex.Symbol[] args)
+    {
+      int nfixed = 0;
+      int noptional = 0;
+      int nrest = 0;
+
+      if (args.Length > 0)
+       {
+         int i = 0;
+         for (i = 0; i < args.Length; i++, nfixed++)
+           if (args[i] == Qoptional || args[i] == Qrest)
+             break;
+         if (i < args.Length)
+           {
+             if (args[i] == Qoptional)
+               {
+                 for (i++; i < args.Length; i++, noptional++)
+                   if (args[i] == Qrest)
+                     break;
+                 if (i < args.Length)
+                   nrest = 1;
+               }
+           }
+         min_args = nfixed;
+         max_args = nfixed + noptional + nrest;
+         this.args = new Variable[max_args];
+         int j;
+         for (i = j = 0; j < this.args.Length; i++)
+           if (args[i] != Qoptional || args[i] != Qrest)
+             this.args[j++] = domain.Defvar (args[i]);
+       }
+      else
+       {
+         min_args = max_args = 0;
+       }
+      with_var = false;
+    }
+
     private void parse_macros (MPlist plist)
     {
       for (MPlist pl = plist; ! pl.IsEmpty; pl = pl.next)
@@ -2269,9 +2373,7 @@ namespace M17N.Input
                                       Xex.Term[] args)
     {
       ((Context) domain.context).commit ();
-      args = new Xex.Term[2];
-      args[0] = args[1] = Tcatch_tag;
-      return Xex.Fthrow (domain, vari, args);
+      return Xex.Fthrow (domain, vari, new Xex.Term[1] { Tcatch_tag });
     }
 
     private static Xex.Term Fshift (Xex.Domain domain, Xex.Variable vari,
@@ -2388,6 +2490,12 @@ namespace M17N.Input
 
       internal ChangedStatus changed;
 
+      private string error_message;
+      public string Error {
+       get { return error_message; }
+       set { error_message = value; }
+      }
+
       private void set_cursor (string prefix, int pos)
       {
        cursor_pos = pos;