From: Clark C . E. <cc...@cl...> - 2001-06-06 04:19:25
|
I updated the interface proposal below with Jason's ReadCharacter() variants... I'm sure I'm totally botching C# by now... so forgive me. But this is a simpler way to express stuff than the C interface. namespace YAML { public function IYamlIterator Parser(input-stream); public function IYamlVisitor Printer(input-stream); pubic interface IYamlEvent { string Key { get; } /* if parent is a map */ int Index { get; } /* if parent is a list */ string Anchor { get; } IYamlNodeType Type { get; } IYamlNode Node { get; } /* optional in-memory repr */ } public interface IYamlValueIterator { int ReadCharacter(); int ReadCharacters(char[] buffer, int offset, int length); string ReadCharacters(); int ReadByte(); int ReadBytes(byte[] buffer, int offset, int length); byte[] ReadBytes(); } public interface IYamlIterator : extends IYamlEvent, IYamlValueIter { bool Next(); IYamlIterator First(); IYamlIterator Parent { get; } } public interface IYamlValueVisitor { int WriteCharacter(); int WriteCharacters(char[] buffer, int offset, int length); int WriteCharacters(string); int WriteByte(); int WriteBytes(byte[] buffer, int offset, int length); int WriteBytes(byte[]); } public interface IYamlVisitor : extends IYamlValueVisitor { IYamlVisitor Begin( IYamlEvent event ); void End( IYamlEvent event); } public enum YamlNodeType { Scalar, List, Map, Reference } // // in-memory directed graph nodes... // public interface IYamlNode { YamlNodeType Type { get; } string Characters() { get; } byte[] Bytes() { get; } IYamlNode Child(string key); /* maps only */ IYamlNode Child(int index); /* lists only */ int Size() { get; } /* lists only */ IYamlIterator Children(); IYamlIterator Parents(); void VisitChildren(IYamlVisitor); void VisitParents(IYamlVisitor); } void YamlConect( IYamlVisitor writer, IYamlIterator reader ) { do { IYamlVisitor childWriter = writer->Begin(reader); if(childWriter) { switch(reader.Type) { case Map: case List: IYamlIterator childReader = reader->First(); if(childReader) YamlConnect(childWriter,childReader); case Scalar: childWriter->WriteBytes(reader->ReadBytes()); } } writer->End(reader); } while(reader.Next()); } } |