*** 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 class MPlist
7   {
8     private MSymbol key;
9     private object val;
10     private MPlist next;
11
12     public MPlist ()
13     {
14       key = null;
15       val = null;
16       next = null;
17     }
18
19     public bool tailp { get { return (object) key == null; } }
20
21     public new string ToString ()
22     {
23       string str = "";
24
25       for (MPlist p = this; ! p.tailp; p = p.next)
26         {
27           str += (p == this ? "(" : " ") + p.key.ToString () + ":";
28           if (p.val is MSymbol)
29             str += ((MSymbol) p.val).ToString ();
30           else if (p.val is MPlist)
31             str += ((MPlist) p.val).ToString ();
32         }
33       return str + ")";
34     }
35
36     public object get (MSymbol key)
37     {
38       if ((object) key == null)
39         return null;
40       for (MPlist p = this; ! p.tailp; p = p.next)
41         if (p.key == key)
42           return p.val;
43       return null;
44     }
45
46     public object put (MSymbol key, object val)
47     {
48       MPlist p;
49
50       for (p = this; ! p.tailp; p = p.next)
51         if (p.key == key)
52           {
53             if (val != null)
54               p.val = val;
55             else
56               p.pop ();
57             return val;
58           }
59       if (val != null)
60         {
61           p.key = key;
62           p.val = val;
63           p.next = new MPlist ();
64         }
65       return val;
66     }
67
68     public object push (MSymbol key, object val)
69     {
70       MPlist p = new MPlist ();
71
72       p.key = this.key;
73       p.val = this.val;
74       p.next = this.next;
75       this.key = key;
76       this.val = val;
77       this.next = p;
78
79       return val;
80     }
81
82     public object pop ()
83     {
84       if (tailp)
85         return null;
86
87       object val = this.val;
88
89       this.key = this.next.key;
90       this.val = this.next.val;
91       this.next = this.next.next;
92       return val;
93     }
94
95     public object add (MSymbol key, object val)
96     {
97       MPlist p;
98
99       for (p = this; ! p.tailp; p = p.next);
100       if (val != null)
101         {
102           p.key = key;
103           p.val = val;
104           p.next = new MPlist ();
105         }
106       return val;
107     }
108   }
109 }