19 public bool tailp { get { return (object) key == null; } }
21 public new string ToString ()
25 for (MPlist p = this; ! p.tailp; p = p.next)
27 str += (p == this ? "(" : " ") + p.key.ToString () + ":";
29 str += ((MSymbol) p.val).ToString ();
30 else if (p.val is MPlist)
31 str += ((MPlist) p.val).ToString ();
36 public object get (MSymbol key)
38 if ((object) key == null)
40 for (MPlist p = this; ! p.tailp; p = p.next)
46 public object put (MSymbol key, object val)
50 for (p = this; ! p.tailp; p = p.next)
63 p.next = new MPlist ();
68 public object push (MSymbol key, object val)
70 MPlist p = new MPlist ();
87 object val = this.val;
89 this.key = this.next.key;
90 this.val = this.next.val;
91 this.next = this.next.next;
95 public object add (MSymbol key, object val)
99 for (p = this; ! p.tailp; p = p.next);
104 p.next = new MPlist ();
112 internal class MSymbolData
116 public MSymbolData next;
118 public MSymbolData (string name, MSymbolData next)
125 static internal class MSymbolPool
127 const int MSYMBOL_POOL_SIZE = 1024;
128 static MSymbolData[] pool = new MSymbolData[MSYMBOL_POOL_SIZE];
129 static int[] used = new int[MSYMBOL_POOL_SIZE];
131 static public MSymbolData get_data (string name)
138 for (int i = 0; i < used[0]; i++, data = data.next)
139 if (data.name == name)
142 pool[0] = data = new MSymbolData (name, pool[0]);
148 static public MSymbol nil = new MSymbol ("nil");
149 static public MSymbol t = new MSymbol ("t");
151 private MSymbolData data;
153 public MSymbol (string name)
155 data = MSymbolPool.get_data (name);
158 public new string ToString () { return data.name; }
160 public new bool Equals (object sym) { return ((object) this == sym); }
162 public new int GetHashCode () { return 0; }
164 public static bool operator== (MSymbol sym1, MSymbol sym2)
166 return ((object) sym1.data == (object) sym2.data);
169 public static bool operator!= (MSymbol sym1, MSymbol sym2)
171 return ((object) sym1.data != (object) sym2.data);
174 public object get (MSymbol key)
176 return (data.plist == null ? null : data.plist.get (key));
179 public object put (MSymbol key, object val)
181 if (data.plist == null)
182 data.plist = new MPlist ();
183 return data.plist.put (key, val);
187 public class MTextProperty
191 public enum MTextFormat
193 MTEXT_FORMAT_US_ASCII,
195 MTEXT_FORMAT_UTF_16BE,
196 MTEXT_FORMAT_UTF_16LE,
197 MTEXT_FORMAT_UTF_32BE,
198 MTEXT_FORMAT_UTF_32LE,
203 private class MTextPlist : MPlist
205 public class MInterval
209 public int start, end;
210 public MInterval prev, next;
213 MInterval head, tail;
215 public MTextPlist (MText mt)
217 head = tail = new MInterval ();
219 head.end = mt.nchars;
226 private int cache_pos;
227 private int cache_idx;
228 private MTextPlist plist;
230 public MText (byte str, MTextFormat format)
239 public static void Main()
243 sym1 = new MSymbol ("abc");
244 Console.WriteLine (sym1.ToString ());
245 sym2 = new MSymbol ("abc");
246 Console.WriteLine (sym2.ToString ());
247 Console.WriteLine (sym1 == sym2 ? "OK" : "NO");
248 sym1.put (MSymbol.nil, MSymbol.t);
250 MPlist p = new MPlist ();
252 p.put (MSymbol.t, sym1);
253 p.push (MSymbol.t, sym2);
255 MPlist pp = new MPlist ();
256 pp.put (MSymbol.t, p);
257 Console.WriteLine (pp.ToString ());
258 Console.WriteLine (p.get (MSymbol.t));