public static void WriteStringsToStreamAsXml(StreamWriter sw, Hashtable Strings, AdvancedOptions adv_opt)
        {
            XmlWriterSettings xwr = new XmlWriterSettings();

            xwr.Indent             = true;
            xwr.OmitXmlDeclaration = false;
            xwr.Encoding           = sw.Encoding;
            xwr.CloseOutput        = true;
            XmlWriter writer = XmlWriter.Create(sw.BaseStream, xwr);

            //writer.WriteStartElement("options");
            writer.WriteStartElement("general_options");
            foreach (string key in Strings.Keys)
            {
                writer.WriteStartElement("option");
                writer.WriteAttributeString("name", key);
                writer.WriteString(Convert.ToString(Strings[key]));
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            /*writer.WriteStartElement("advanced_options");
             * writer.WriteStartElement("open_files");
             * foreach (SourceFileInfo fi in adv_opt.open_files)
             * {
             *      writer.WriteStartElement("open_file");
             *      writer.WriteAttributeString("name",fi.FileName);
             *      writer.WriteAttributeString("line",Convert.ToString(fi.Line.ToString()));
             *      writer.WriteAttributeString("column",Convert.ToString(fi.Column.ToString()));
             *      writer.WriteEndElement();
             * }
             * writer.WriteEndElement();
             *
             * writer.WriteStartElement("watch_list");
             * foreach (string s in adv_opt.watch_list)
             * {
             *      writer.WriteStartElement("watch_expr");
             *      writer.WriteAttributeString("expr",s);
             *      writer.WriteEndElement();
             * }
             * writer.WriteEndElement();
             *
             * writer.WriteStartElement("breakpoints_list");
             * foreach (BreakpointInfo br in adv_opt.breakpoints)
             * {
             *      writer.WriteStartElement("breakpoint");
             *      writer.WriteAttributeString("file_name",br.FileName);
             *      writer.WriteAttributeString("line",br.Line.ToString());
             *      writer.WriteAttributeString("is_conditional",br.IsConditional.ToString());
             *      writer.WriteAttributeString("expression",br.Expression);
             *      writer.WriteAttributeString("concrete_condition",br.ConcreteCondition.ToString());
             *      writer.WriteEndElement();
             * }
             * writer.WriteEndElement();
             *
             * writer.WriteStartElement("bookmarks_list");
             * foreach (BookmarkInfo br in adv_opt.bookmarks)
             * {
             *      writer.WriteStartElement("bookmark");
             *      writer.WriteAttributeString("file_name",br.FileName);
             *      writer.WriteAttributeString("line",br.Line.ToString());
             *      writer.WriteEndElement();
             * }
             * writer.WriteEndElement();
             * writer.WriteEndElement();
             * writer.WriteEndElement();*/
            writer.Close();
        }
        public static void ReadStringsFromStreamAsXml(string FileName, StreamReader sr, Hashtable Strings, AdvancedOptions adv_opt)
        {
            XmlReaderSettings xrs = new XmlReaderSettings();

            //xrs.IgnoreWhitespace = true;
            xrs.CloseInput = true;
            XmlReader reader = XmlTextReader.Create(new StreamReader(FileName, System.Text.Encoding.UTF8), xrs);

            try
            {
                reader.Read();
            }
            catch
            {
                System.Text.Encoding enc = sr.CurrentEncoding;
                reader.Close();
                sr.Close();
                ReadStringsFromStream(new StreamReader(FileName, enc), Strings);
                return;
            }
            //reader.ReadStartElement("options");
            reader.ReadStartElement("general_options");
            string prefix = "";

            while (reader.ReadToNextSibling("option"))
            {
                string option_name  = reader.GetAttribute("name");
                string option_value = reader.ReadString();
                if (option_name == "%PREFIX%")
                {
                    prefix = option_value;
                }
                else
                {
                    Strings[prefix + option_name] = option_value;
                }
            }
            reader.ReadEndElement();

            /*reader.ReadEndElement();
            *  if (!reader.EOF)
            *  {
            *       reader.ReadStartElement("advanced_options");
            *       if (!reader.IsEmptyElement)
            *       {
            *               reader.ReadStartElement("open_files");
            *               while (reader.ReadToNextSibling("open_file"))
            *               {
            *                       adv_opt.open_files.Add(new SourceFileInfo(reader.GetAttribute("file_name"),
            *                                                         Convert.ToInt32(reader.GetAttribute("line")),Convert.ToInt32(reader.GetAttribute("column"))));
            *
            *               }
            *               reader.ReadEndElement();
            *       }
            *       else
            *               reader.ReadStartElement("open_files");
            *       reader.ReadStartElement("watch_list");
            *       if (!reader.IsEmptyElement)
            *       {
            *
            *               while (reader.ReadToNextSibling("watch_expr"))
            *               {
            *                       adv_opt.watch_list.Add(reader.GetAttribute("expr"));
            *               }
            *               reader.ReadEndElement();
            *       }
            *       reader.ReadStartElement("breakpoints_list");
            *       if (!reader.IsEmptyElement)
            *       {
            *
            *               while (reader.ReadToNextSibling("breakpoint"))
            *               {
            *                       adv_opt.breakpoints.Add(new BreakpointInfo(reader.GetAttribute("file_name"),
            *                                                          Convert.ToInt32(reader.GetAttribute("line")),Convert.ToBoolean(reader.GetAttribute("is_conditional")),
            *                                                          reader.GetAttribute("expression"),Convert.ToInt32(reader.GetAttribute("concrete_condition"))));
            *
            *               }
            *               reader.ReadEndElement();
            *       }
            *       if (!reader.IsEmptyElement)
            *       {
            *               reader.ReadStartElement("bookmarks_list");
            *               while (reader.ReadToNextSibling("bookmark"))
            *               {
            *                       adv_opt.bookmarks.Add(new BookmarkInfo(reader.GetAttribute("file_name"),
            *                                                         Convert.ToInt32(reader.GetAttribute("line"))));
            *
            *               }
            *               reader.ReadEndElement();
            *       }
            *       reader.ReadEndElement();
            *  }
            *  reader.ReadEndElement();*/
            reader.Close();
            sr.Close();
        }