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;