ConfigParser.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: ConfigParser.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  4. */
  5. using System;
  6. using System.IO;
  7. using System.Collections;
  8. namespace Poderosa.Config
  9. {
  10. public class ConfigNode {
  11. private string _name;
  12. private Hashtable _data;
  13. private ArrayList _childConfigNodes;
  14. public string Name {
  15. get {
  16. return _name;
  17. }
  18. }
  19. public IDictionaryEnumerator GetPairEnumerator() {
  20. return _data.GetEnumerator();
  21. }
  22. public Hashtable InnerHashtable {
  23. get {
  24. return _data;
  25. }
  26. }
  27. public string this[string name] {
  28. get {
  29. return (string)_data[name];
  30. }
  31. set {
  32. _data[name] = value;
  33. }
  34. }
  35. public string GetValue(string name, string defval) {
  36. object t = _data[name];
  37. return t==null? defval : (string)t;
  38. }
  39. public bool Contains(string name) {
  40. return _data.Contains(name);
  41. }
  42. public bool HasChild {
  43. get {
  44. return _childConfigNodes.Count>0;
  45. }
  46. }
  47. public IEnumerable Children {
  48. get {
  49. return _childConfigNodes;
  50. }
  51. }
  52. public void AddChild(ConfigNode child) {
  53. _childConfigNodes.Add(child);
  54. }
  55. public ConfigNode FindChildConfigNode(string name) {
  56. foreach(ConfigNode s in _childConfigNodes) {
  57. if(s.Name==name) return s;
  58. }
  59. return null;
  60. }
  61. public ConfigNode(string name) {
  62. _name = name;
  63. _data = new Hashtable();
  64. _childConfigNodes = new ArrayList();
  65. }
  66. public ConfigNode(string name, TextReader reader) {
  67. _name = name;
  68. _data = new Hashtable();
  69. _childConfigNodes = new ArrayList();
  70. ReadFrom(reader);
  71. }
  72. public void ReadFrom(TextReader reader) {
  73. string line = ReadLine(reader);
  74. while(line!=null) {
  75. int e = line.IndexOf('=');
  76. if(e!=-1) {
  77. string name0 = Normalize(line.Substring(0, e));
  78. string value = e==line.Length-1? "" : Normalize(line.Substring(e+1));
  79. _data[name0] = value;
  80. }
  81. else if(line.EndsWith("{")) {
  82. string[] v = line.Split(' ');
  83. foreach(string t in v) {
  84. if(t.Length>0) {
  85. _childConfigNodes.Add(new ConfigNode(t, reader));
  86. break;
  87. }
  88. }
  89. }
  90. else if(line.EndsWith("}")) {
  91. break;
  92. }
  93. line = ReadLine(reader);
  94. }
  95. }
  96. private static string ReadLine(TextReader reader) {
  97. string line = reader.ReadLine();
  98. return Normalize(line);
  99. }
  100. private static string Normalize(string s) {
  101. int i=0;
  102. if(s==null) return null;
  103. do {
  104. if(i==s.Length) return "";
  105. char ch = s[i++];
  106. if(ch!=' ' && ch!='t') return s.Substring(i-1);
  107. } while(true);
  108. }
  109. public void WriteTo(TextWriter writer) {
  110. WriteTo(writer, 0);
  111. }
  112. private void WriteTo(TextWriter writer, int indent) {
  113. WriteIndent(writer, indent);
  114. writer.Write(_name);
  115. writer.WriteLine(" {");
  116. indent += 2;
  117. IDictionaryEnumerator i = _data.GetEnumerator();
  118. while(i.MoveNext()) {
  119. object v = i.Value;
  120. if(v!=null) {
  121. WriteIndent(writer, indent);
  122. writer.Write(i.Key.ToString());
  123. writer.Write('=');
  124. writer.WriteLine(v.ToString());
  125. }
  126. }
  127. foreach(ConfigNode ch in _childConfigNodes)
  128. ch.WriteTo(writer, indent);
  129. indent -= 2;
  130. WriteIndent(writer, indent);
  131. writer.WriteLine("}");
  132. }
  133. private void WriteIndent(TextWriter writer, int indent) {
  134. for(int i=0; i<indent; i++)
  135. writer.Write(' ');
  136. }
  137. public static ConfigNode CreateIndirect(string name, Hashtable values) {
  138. ConfigNode n = new ConfigNode(name);
  139. n._data = (Hashtable)values.Clone();
  140. return n;
  141. }
  142. }
  143. }