*** empty log message ***
[m17n/m17n-lib-cs.git] / MPlist.cs
1 using System;
2 using M17N.Core;
3
4 namespace M17N.Core
5 {
6   public struct MProperty
7   {
8     internal MSymbol key;
9     internal object val;
10
11     public MSymbol Key { get { return this.key;} }
12     public object Val { get { return this.val; } }
13
14     public MProperty (MSymbol key, object val)
15       {
16         this.key = key;
17         this.val = val;
18       }
19   }
20
21   public class MPlist
22   {
23     private MProperty prop;
24     private MPlist next;
25
26     public MPlist ()
27     {
28       prop = new MProperty (MSymbol.nil, null);
29     }
30
31     public bool tailp { get { return prop.key == MSymbol.nil; } }
32
33     public new string ToString ()
34     {
35       string str = "";
36
37       for (MPlist p = this; ! p.tailp; p = p.next)
38         {
39           str += (p == this ? "(" : " ") + p.prop.key.ToString () + ":";
40           if (p.prop.val is MSymbol)
41             str += ((MSymbol) p.prop.val).ToString ();
42           else if (p.prop.val is MPlist)
43             str += ((MPlist) p.prop.val).ToString ();
44         }
45       return str + ")";
46     }
47
48     public object get (MSymbol key)
49     {
50       if ((object) key == null)
51         return null;
52       for (MPlist p = this; ! p.tailp; p = p.next)
53         if (p.prop.key == key)
54           return p.prop.val;
55       return null;
56     }
57
58     public object put (MSymbol key, object val)
59     {
60       MPlist p;
61
62       for (p = this; ! p.tailp; p = p.next)
63         if (p.prop.key == key)
64           {
65             if (val != null)
66               p.prop.val = val;
67             else
68               p.pop ();
69             return val;
70           }
71       if (val != null)
72         {
73           p.prop.key = key;
74           p.prop.val = val;
75           p.next = new MPlist ();
76         }
77       return val;
78     }
79
80     public object push (MSymbol key, object val)
81     {
82       MPlist p = new MPlist ();
83
84       p.prop.key = this.prop.key;
85       p.prop.val = this.prop.val;
86       p.next = this.next;
87       this.prop.key = key;
88       this.prop.val = val;
89       this.next = p;
90
91       return val;
92     }
93
94     public object pop ()
95     {
96       if (tailp)
97         return null;
98
99       object val = this.prop.val;
100
101       this.prop.key = this.next.prop.key;
102       this.prop.val = this.next.prop.val;
103       this.next = this.next.next;
104       return val;
105     }
106
107     public object add (MSymbol key, object val)
108     {
109       MPlist p;
110
111       for (p = this; ! p.tailp; p = p.next);
112       if (val != null)
113         {
114           p.prop.key = key;
115           p.prop.val = val;
116           p.next = new MPlist ();
117         }
118       return val;
119     }
120   }
121 }