*** empty log message ***
[m17n/m17n-lib-cs.git] / XmlExpr.cs
index f877772..41501be 100644 (file)
@@ -321,8 +321,8 @@ namespace System.Xml
            return true;
          }
 
-       public StrType (Domain domain, Symbol name, string str, string desc,
-                   string[] range)
+       public StrType (Domain domain, Symbol name, Str str, string desc,
+                       string[] range)
          : base (domain, name, new Term (str), desc)
          {
            this.range = range;
@@ -336,7 +336,7 @@ namespace System.Xml
              if (range == null)
                return true;
              Str str = val.Strval;
-             foreach (Str s in range)
+             foreach (string s in range)
                if (str.Equals (s))
                  return true;
            }
@@ -415,6 +415,8 @@ namespace System.Xml
       // single list.
       internal readonly int max_args;
 
+      public delegate Term Builtin (Domain domain, Variable vari, Term[] terms);
+
       public Function () { }
 
       public Function (Symbol name, bool with_var, int min_args, int max_args)
@@ -434,10 +436,9 @@ namespace System.Xml
 
       internal class Subroutine : Function
       {
-       public Func<Domain, Variable, Term[], Term> builtin;
+       public Builtin builtin;
 
-       public Subroutine (Func<Domain, Variable, Term[], Term> builtin,
-                          Symbol name, bool with_var,
+       public Subroutine (Builtin builtin, Symbol name, bool with_var,
                           int min_args, int max_args)
          : base (name, with_var, min_args, max_args)
          {
@@ -462,10 +463,9 @@ namespace System.Xml
 
       internal class SpecialForm : Function
       {
-       public Func<Domain, Variable, Term[], Term> builtin;
+       public Builtin builtin;
 
-       public SpecialForm (Func<Domain, Variable, Term[], Term> builtin,
-                           Symbol name, bool with_var,
+       public SpecialForm (Builtin builtin, Symbol name, bool with_var,
                            int min_args, int max_args)
          : base (name, with_var, min_args, max_args)
          {
@@ -796,18 +796,16 @@ namespace System.Xml
          }
       }
 
-      public void DefSubr (Func<Domain, Variable, Term[], Term> builtin,
-                          Symbol name, bool with_var,
-                          int min_args, int max_args)
+      public void DefSubr (Function.Builtin builtin, Symbol name,
+                          bool with_var, int min_args, int max_args)
       {
        check_func_head (name, with_var, min_args, max_args, false);
        functions[name] = new Function.Subroutine (builtin, name, with_var,
                                                   min_args, max_args);
       }
 
-      public void DefSpecial (Func<Domain, Variable, Term[], Term> builtin,
-                             Symbol name, bool with_var,
-                             int min_args, int max_args)
+      public void DefSpecial (Function.Builtin builtin, Symbol name,
+                             bool with_var, int min_args, int max_args)
       {
        check_func_head (name, with_var, min_args, max_args, false);
        functions[name] = new Function.SpecialForm (builtin, name, with_var,
@@ -914,7 +912,8 @@ namespace System.Xml
          }
        else
          {
-           vari = new Variable.StrType (this, name, str, desc, range);
+           vari = new Variable.StrType (this, name, new Str (str), desc,
+                                        range);
            variables[name] = vari;
          }
        return vari;
@@ -1337,8 +1336,6 @@ namespace System.Xml
 
     private static Term Fnth (Domain domain, Variable vari, Term[] args)
     {
-      Term result;
-
       if (args[1].IsStr)
        return new Term (args[1].Strval.Nth (args[0].Intval));
       if (args[1].IsList)
@@ -1880,15 +1877,19 @@ namespace System.Xml
 
       public Str Clone (Str str) { return new Str (str.str); }
 
+      public bool Equals (string str) { return this.str == str; }
+
       public bool Equals (Str str) { return this.str == str.str; }
 
       public bool Matches (Str str)
       {
-       if (regex = null)
+       if (regex != null)
          regex = new Regex (this.str);
        return regex.IsMatch (str.str);
       }
 
+      public int Nth (int index) { return (int) str[index]; }
+
       public void Insert (int index, Str str)
       {
        if (index < 0)
@@ -1912,6 +1913,8 @@ namespace System.Xml
        this.str = this.str.Remove (from, to - from);
        regex = null;
       }
+
+      public override string ToString () { return str; }
     }
 
     public struct Term
@@ -1924,7 +1927,7 @@ namespace System.Xml
       // <symbol>...</symbol>
       public Term (Symbol name) { intval = 0; objval = name; }
       // <string>...</string>
-      public Term (string str) { intval = 0; objval = new StringBuilder (str); }
+      public Term (string str) { intval = 0; objval = new Str (str); }
       // <list>...</list>
       public Term (List<Term> list) { intval = 0; objval = list; }
       // <error ename="ERROR-NAME">ERROR-MESSASGE</error>
@@ -1934,6 +1937,7 @@ namespace System.Xml
          objval = new ErrorTerm (name, message);
        }
 
+      public Term (Str str) { intval = 0; objval = str; }
       public Term (TermValue obj) { intval = 0; objval = obj; }
 
       // <varref vname="VNAME"/>
@@ -2019,14 +2023,14 @@ namespace System.Xml
       }
 
       public bool IsInt { get { return (objval == null); } }
-      public bool IsStr { get { return (objval is StringBuilder); } }
+      public bool IsStr { get { return (objval is Str); } }
       public bool IsSymbol { get { return (objval is Symbol); } }
       public bool IsList { get { return (objval is List<Term>); } }
       public bool IsError { get { return (objval is ErrorTerm); } }
 
       internal Term Eval (Domain domain)
       {
-       if (objval == null || objval is Symbol || objval is string
+       if (objval == null || objval is Symbol || objval is Str
            || objval is List<Term>)
          return this;
        try {
@@ -2045,8 +2049,8 @@ namespace System.Xml
       {
        if (objval == null || objval is Symbol)
          return this;
-       if (objval is StringBuilder)
-         return new Term (((StringBuilder) objval).ToString ());
+       if (objval is Str)
+         return new Term (((Str) objval).ToString ());
        if (objval is List<Term>)
          {
            List<Term> list = new List<Term> ();
@@ -2128,7 +2132,7 @@ namespace System.Xml
          str = "<integer>" + intval + "</integer>";
        else if (objval is Symbol)
          str = "<symbol>" + objval + "</symbol>";
-       else if (objval is string)
+       else if (objval is Str)
          str = "<string>" + objval + "</string>";
        else if (objval is List<Term>)
          {
@@ -2340,9 +2344,10 @@ namespace System.Xml
       Function func = domain.GetFunc (name);
 
       for (node = node.FirstChild; node != null; node = node.NextSibling)
-       if (node.Name != Qdescription
-           && node.Name != Qargs)
+       if (node.Name != Qdescription && node.Name != Qargs)
          break;
+      Console.WriteLine ("found body " + node.Name);
+      
       Term[] body = Parse (domain, node, null);
       if (is_defun)
        ((Function.Lambda) func).SetBody (body);
@@ -2402,8 +2407,9 @@ namespace System.Xml
 
     private static bool default_stop (XmlNode n) { return n == null; }
 
-    public static Term[] Parse (Domain domain, XmlNode node,
-                               Func<XmlNode, bool> stop)
+    public delegate bool ParseStop (XmlNode node);
+
+    public static Term[] Parse (Domain domain, XmlNode node, ParseStop stop)
     {
       if (stop == null)
        stop = default_stop;
@@ -2451,8 +2457,9 @@ namespace System.Xml
       XmlDocument doc = new XmlDocument (Symbol.NameTable);
       XmlNode node;
 
-      using (XmlTextReader reader = new XmlTextReader (url, doc.NameTable))
+      using (XmlTextReader reader = new XmlTextReader (url, Symbol.NameTable))
        {
+         reader.WhitespaceHandling = WhitespaceHandling.None;
          do {
            reader.Read ();
          } while (reader.NodeType != XmlNodeType.None