--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%402088
		
			
				
	
	
		
			175 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Text;
 | 
						|
using System.IO;
 | 
						|
 | 
						|
namespace incparser
 | 
						|
{
 | 
						|
    class ParseWriter
 | 
						|
    {
 | 
						|
        private int level;
 | 
						|
        private StringBuilder data;
 | 
						|
 | 
						|
        public ArrayList enumList = new ArrayList();
 | 
						|
        public ArrayList defineList = new ArrayList();
 | 
						|
        public ArrayList enumTypeList = new ArrayList();
 | 
						|
        public ArrayList forwardList = new ArrayList();
 | 
						|
        public ArrayList nativeList = new ArrayList();
 | 
						|
        public ArrayList stockList = new ArrayList();
 | 
						|
        public ArrayList funcenumList = new ArrayList();
 | 
						|
        public ArrayList functagList = new ArrayList();
 | 
						|
        public ArrayList structList = new ArrayList();
 | 
						|
 | 
						|
        public int Level
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return level;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public string Contents
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return data.ToString();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void Reset()
 | 
						|
        {
 | 
						|
            level = 0;
 | 
						|
            data = new StringBuilder();
 | 
						|
        }
 | 
						|
 | 
						|
        public ParseWriter()
 | 
						|
        {
 | 
						|
            level = 0;
 | 
						|
            data = new StringBuilder();
 | 
						|
        }
 | 
						|
 | 
						|
        public void BeginSection(string name)
 | 
						|
        {
 | 
						|
            WriteLine("\"" + PrepString(name) + "\"");
 | 
						|
            WriteLine("{");
 | 
						|
            level++;
 | 
						|
        }
 | 
						|
 | 
						|
        public void WritePair(string key, string value)
 | 
						|
        {
 | 
						|
            WriteLine("\"" + PrepString(key) + "\"\t\t\"" + PrepString(value) + "\"");
 | 
						|
        }
 | 
						|
 | 
						|
        public void EndSection()
 | 
						|
        {
 | 
						|
            if (--level < 0)
 | 
						|
            {
 | 
						|
                throw new System.Exception("Writer nesting level went out of bounds");
 | 
						|
            }
 | 
						|
            WriteLine("}");
 | 
						|
        }
 | 
						|
 | 
						|
        public void WriteFiles(string template, string outputfile)
 | 
						|
        {
 | 
						|
            StreamReader sr = null;
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                sr = File.OpenText(template);
 | 
						|
            }
 | 
						|
            catch (Exception e)
 | 
						|
            {
 | 
						|
                Console.WriteLine("Failed to open template file: " + e.Message);
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            string contents = sr.ReadToEnd();
 | 
						|
 | 
						|
            string replace = ToOutputString(defineList);
 | 
						|
            contents = contents.Replace("$defines", replace);
 | 
						|
 | 
						|
            replace = ToOutputString(enumList);
 | 
						|
            contents = contents.Replace("$enums", replace);
 | 
						|
 | 
						|
            replace = ToOutputString(enumTypeList);
 | 
						|
            contents = contents.Replace("$enumtypes", replace);
 | 
						|
 | 
						|
            replace = ToOutputString(forwardList);
 | 
						|
            contents = contents.Replace("$forwards", replace);
 | 
						|
 | 
						|
            replace = ToOutputString(nativeList);
 | 
						|
            contents = contents.Replace("$natives", replace);
 | 
						|
 | 
						|
            replace = ToOutputString(stockList);
 | 
						|
            contents = contents.Replace("$stocks", replace);
 | 
						|
 | 
						|
            replace = ToOutputString(funcenumList);
 | 
						|
            contents = contents.Replace("$funcenums", replace);
 | 
						|
 | 
						|
            replace = ToOutputString(functagList);
 | 
						|
            contents = contents.Replace("$functags", replace);
 | 
						|
 | 
						|
            replace = ToOutputString(structList);
 | 
						|
            contents = contents.Replace("$structs", replace);
 | 
						|
 | 
						|
            StreamWriter sw;
 | 
						|
            sw = File.CreateText(outputfile);
 | 
						|
 | 
						|
            sw.Write(contents);
 | 
						|
 | 
						|
            sr.Close();
 | 
						|
            sw.Close();
 | 
						|
        }
 | 
						|
 | 
						|
        private string ToOutputString(ArrayList a)
 | 
						|
        {
 | 
						|
            string defines = "";
 | 
						|
            int count = 0;
 | 
						|
 | 
						|
            foreach (object o in a)
 | 
						|
            {
 | 
						|
              defines += o;
 | 
						|
              defines += " ";
 | 
						|
              count += o.ToString().Length;
 | 
						|
 | 
						|
              if (count > 180)
 | 
						|
              {
 | 
						|
                defines += "\r\n";
 | 
						|
                count = 0;
 | 
						|
              }
 | 
						|
            }
 | 
						|
 | 
						|
            return defines;
 | 
						|
        }
 | 
						|
 | 
						|
        private void WriteLine(string line)
 | 
						|
        {
 | 
						|
            Tabinate();
 | 
						|
            data.Append(line + "\n");
 | 
						|
        }
 | 
						|
 | 
						|
        private void Tabinate()
 | 
						|
        {
 | 
						|
            for (int i = 0; i < level; i++)
 | 
						|
            {
 | 
						|
                data.Append("\t");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private string PrepString(string text)
 | 
						|
        {
 | 
						|
            /* Escape all escaped newlines (so they can be unescaped later) */
 | 
						|
            text = text.Replace("\\n", "\\\\n");
 | 
						|
            /* Escape all literal newlines */
 | 
						|
            text = text.Replace("\n", "\\n");
 | 
						|
            text = text.Replace("\r", "");
 | 
						|
            /* Remove escaped quotations */
 | 
						|
            text = text.Replace("\\\"", "\"");
 | 
						|
            /* Replace all quotations with escaped ones now */
 | 
						|
            text = text.Replace("\"", "\\\"");
 | 
						|
            return text;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |