+ public void Defun (Name name, int nargs, bool specialp)
+ {
+ Function func;
+
+ if (functions.TryGetValue (name, out func))
+ {
+ if (func.min_arg < nargs || func.max_arg > nargs)
+ throw new Exception ("Incompatible argument numbers to override: "
+ + name);
+ func.min_arg = func.max_arg = nargs;
+ func.specialp = specialp;
+ func.builtin = null;
+ }
+ else
+ {
+ func = new Function (name, nargs, specialp);
+ functions[name] = func;
+ }
+ }
+
+ public void Defvar (Name name, XmlNode node)
+ {
+ Variable vari;
+
+ if (node.Name == Ndescription)
+ node = node.NextSibling;
+ if (node.Name == Nconst)
+ {
+ Name type = (Name) node.Attributes[Ntype].Value;
+ string val = node.Value;
+ XmlNodeList range_list = null;
+ int nranges = 0;
+
+ node = node.NextSibling;
+ if (node.Name == Npossible_value)
+ {
+ range_list = node.ChildNodes;
+ nranges = range_list.Count;
+ }
+
+ if (type == Ninteger)
+ {
+ VarInt vi = new VarInt (name, parse_integer (val));
+ if (range_list != null)
+ {
+ vi.ranges = new VarInt.Range[nranges];
+
+ for (int i = 0; i < nranges; i++)
+ {
+ XmlNode n = range_list[i];
+
+ if (n.Name == Nconst)
+ {
+ int num = parse_integer (n.Value);
+ vi.ranges[i].from = vi.ranges[i].to = num;
+ }
+ else // range_list[i].Name == "range"
+ {
+ vi.ranges[i].from =
+ parse_integer (n.FirstChild.Value);
+ vi.ranges[i].to =
+ parse_integer (n.LastChild.Value);
+ }
+ }
+ }
+ vari = vi;
+ }
+ else if (type == Nstring)
+ {
+ VarStr vs = new VarStr (name, val);
+ if (range_list != null)
+ vs.ranges = new string[nranges];
+ for (int i = 0; i < nranges; i++)
+ vs.ranges[i] = range_list[i].Value;
+ vari = vs;
+ }
+ else if (type == Nboolean)
+ {
+ vari = new VarBool (name, val == "true");
+ }
+ else
+ throw new Exception ("Unknown type: " + type);
+ }
+ else
+ vari = new VarMisc (name, null);
+ variables[name] = vari;
+ }
+