X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=MPlist.cs;h=57005c90dcc3f79a8c02cfd515c6f42b547fc2dd;hb=0179fbd6ce40563862eb01c0fd8acf6c7bbb9f45;hp=0535d8612c6ac29727f0b9c7310958e113d444ea;hpb=04d20a4293c7fb0db73511e9e6009cf4d4d2a9bd;p=m17n%2Fm17n-lib-cs.git diff --git a/MPlist.cs b/MPlist.cs index 0535d86..57005c9 100644 --- a/MPlist.cs +++ b/MPlist.cs @@ -11,7 +11,7 @@ namespace M17N.Core { public MSymbol key; public object val; - private MPlist next; + public MPlist next; public MSymbol Key { get { return key; } } public object Val { get { return val; } } @@ -54,6 +54,34 @@ namespace M17N.Core next = new MPlist (); } + public MPlist (FileStream stream, MSymbol stop) + { + MStreamReader reader = new MStreamReader (stream); + bool result; + + key = MSymbol.nil; + val = null; + while (true) + { + MSymbol this_key; + object this_val; + + result = reader.ReadElement (out this_key, out this_val); + if (! result) + return; + if (this_key == MSymbol.plist) + { + MPlist plist = (MPlist) this_val; + + if (plist.IsSymbol && plist.Symbol == stop) + return; + } + key = this_key; + val = this_val; + next = new MPlist (reader, stop); + } + } + public MPlist (FileStream stream, MSymbol target, MSymbol stop) { MStreamReader reader = new MStreamReader (stream); @@ -107,6 +135,44 @@ namespace M17N.Core next = new MPlist (); } + private MPlist (MStreamReader reader, MSymbol stop) + { + bool result; + MPlist next_plist = null; + + key = MSymbol.nil; + val = null; + while (true) + { + MSymbol this_key; + object this_val; + + result = reader.ReadElement (out this_key, out this_val); + if (! result) + return; + if (this_key == MSymbol.plist) + { + MPlist plist = (MPlist) this_val; + + if (plist.IsSymbol && plist.Symbol == stop) + return; + } + if (next_plist == null) + { + key = this_key; + val = this_val; + next = next_plist = new MPlist (); + } + else + { + next_plist.key = this_key; + next_plist.val = this_val; + next_plist.next = new MPlist (); + next_plist = next_plist.next; + } + } + } + private MPlist (MStreamReader reader, MSymbol target, MSymbol stop) { bool result; @@ -149,15 +215,15 @@ namespace M17N.Core public bool IsEmpty { get { return next == null; } } - internal bool IsSymbol { get { return Key == MSymbol.symbol; } } - internal bool IsMText { get { return Key == MSymbol.mtext; } } - internal bool IsPlist { get { return Key == MSymbol.plist; } } - internal bool IsInteger { get { return Key == MSymbol.integer; } } + public bool IsSymbol { get { return Key == MSymbol.symbol; } } + public bool IsMText { get { return Key == MSymbol.mtext; } } + public bool IsPlist { get { return Key == MSymbol.plist; } } + public bool IsInteger { get { return Key == MSymbol.integer; } } - internal MSymbol Symbol { get { return (MSymbol) val; } } - internal MText Text { get { return (MText) val; } } - internal MPlist Plist { get { return (MPlist) val; } } - internal int Integer { get { return (int) val; } } + public MSymbol Symbol { get { return (MSymbol) val; } } + public MText Text { get { return (MText) val; } } + public MPlist Plist { get { return (MPlist) val; } } + public int Integer { get { return (int) val; } } public int Count { @@ -170,6 +236,15 @@ namespace M17N.Core } } + public MPlist this[int i] + { + get { + MPlist p; + for (p = this; ! p.IsEmpty && i > 0; i--, p = p.next); + return (i == 0 ? p : null); + } + } + public MPlist Clone () { MPlist plist = new MPlist (), pl = plist; @@ -249,7 +324,10 @@ namespace M17N.Core if (IsEmpty) Push (key, val); else - this.val = val; + { + this.key = key; + this.val = val; + } return this; } @@ -312,6 +390,15 @@ namespace M17N.Core return p.Push (key, val); } + public MPlist Cons (MSymbol key, object val) + { + MPlist plist = new MPlist (); + plist.key = key; + plist.val = val; + plist.next = this; + return plist; + } + public MPlist Clear () { key = MSymbol.nil; @@ -604,7 +691,7 @@ namespace M17N.Core val = new MPlist (this); key = MSymbol.plist; } - else if (c == '"' || c == '\\') + else if (c == '"') { MText mt; ReadMText (out mt);