X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=MInputMethod.cs;h=ebb82779b9c5c9d7f3cdfcb3bdc3b6f92ffedaa7;hb=5886b86d4068fbd3a1d87d3e19a298689d65c62a;hp=0a41c184920004ab9cc6a4cfa00d69886f3e8be6;hpb=2191c6e2bd1fd2f13744a6a42f7004b43f38b5d2;p=m17n%2Fm17n-lib-cs.git
diff --git a/MInputMethod.cs b/MInputMethod.cs
index 0a41c18..ebb8277 100644
--- a/MInputMethod.cs
+++ b/MInputMethod.cs
@@ -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 "@" + tag + "";
+ }
}
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 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;