tools/incparser/ParseWriter.cs
author David Anderson <dvander@alliedmods.net>
Wed Feb 25 20:07:12 2009 -0500 (2009-02-25)
changeset 2607 f3b8bbe17f85
parent 2019 9f473114a511
permissions -rw-r--r--
Backed out changeset fa286305bd3f
dvander@824
     1
using System;
pred@2019
     2
using System.Collections;
dvander@824
     3
using System.Collections.Generic;
dvander@824
     4
using System.Text;
pred@2019
     5
using System.IO;
dvander@824
     6
dvander@824
     7
namespace incparser
dvander@824
     8
{
dvander@824
     9
    class ParseWriter
dvander@824
    10
    {
dvander@824
    11
        private int level;
dvander@824
    12
        private StringBuilder data;
dvander@824
    13
pred@2019
    14
        public ArrayList enumList = new ArrayList();
pred@2019
    15
        public ArrayList defineList = new ArrayList();
pred@2019
    16
        public ArrayList enumTypeList = new ArrayList();
pred@2019
    17
        public ArrayList forwardList = new ArrayList();
pred@2019
    18
        public ArrayList nativeList = new ArrayList();
pred@2019
    19
        public ArrayList stockList = new ArrayList();
pred@2019
    20
        public ArrayList funcenumList = new ArrayList();
pred@2019
    21
        public ArrayList functagList = new ArrayList();
pred@2019
    22
        public ArrayList structList = new ArrayList();
pred@2019
    23
dvander@824
    24
        public int Level
dvander@824
    25
        {
dvander@824
    26
            get
dvander@824
    27
            {
dvander@824
    28
                return level;
dvander@824
    29
            }
dvander@824
    30
        }
dvander@824
    31
dvander@824
    32
        public string Contents
dvander@824
    33
        {
dvander@824
    34
            get
dvander@824
    35
            {
dvander@824
    36
                return data.ToString();
dvander@824
    37
            }
dvander@824
    38
        }
dvander@824
    39
pred@2019
    40
        public void Reset()
pred@2019
    41
        {
pred@2019
    42
            level = 0;
pred@2019
    43
            data = new StringBuilder();
pred@2019
    44
        }
pred@2019
    45
dvander@824
    46
        public ParseWriter()
dvander@824
    47
        {
dvander@824
    48
            level = 0;
dvander@824
    49
            data = new StringBuilder();
dvander@824
    50
        }
dvander@824
    51
dvander@824
    52
        public void BeginSection(string name)
dvander@824
    53
        {
dvander@824
    54
            WriteLine("\"" + PrepString(name) + "\"");
dvander@824
    55
            WriteLine("{");
dvander@824
    56
            level++;
dvander@824
    57
        }
dvander@824
    58
dvander@824
    59
        public void WritePair(string key, string value)
dvander@824
    60
        {
dvander@824
    61
            WriteLine("\"" + PrepString(key) + "\"\t\t\"" + PrepString(value) + "\"");
dvander@824
    62
        }
dvander@824
    63
dvander@824
    64
        public void EndSection()
dvander@824
    65
        {
dvander@824
    66
            if (--level < 0)
dvander@824
    67
            {
dvander@824
    68
                throw new System.Exception("Writer nesting level went out of bounds");
dvander@824
    69
            }
dvander@824
    70
            WriteLine("}");
dvander@824
    71
        }
dvander@824
    72
pred@2019
    73
        public void WriteFiles(string template, string outputfile)
pred@2019
    74
        {
pred@2019
    75
            StreamReader sr = null;
pred@2019
    76
pred@2019
    77
            try
pred@2019
    78
            {
pred@2019
    79
                sr = File.OpenText(template);
pred@2019
    80
            }
pred@2019
    81
            catch (Exception e)
pred@2019
    82
            {
pred@2019
    83
                Console.WriteLine("Failed to open template file: " + e.Message);
pred@2019
    84
                return;
pred@2019
    85
            }
pred@2019
    86
pred@2019
    87
            string contents = sr.ReadToEnd();
pred@2019
    88
pred@2019
    89
            string replace = ToOutputString(defineList);
pred@2019
    90
            contents = contents.Replace("$defines", replace);
pred@2019
    91
pred@2019
    92
            replace = ToOutputString(enumList);
pred@2019
    93
            contents = contents.Replace("$enums", replace);
pred@2019
    94
pred@2019
    95
            replace = ToOutputString(enumTypeList);
pred@2019
    96
            contents = contents.Replace("$enumtypes", replace);
pred@2019
    97
pred@2019
    98
            replace = ToOutputString(forwardList);
pred@2019
    99
            contents = contents.Replace("$forwards", replace);
pred@2019
   100
pred@2019
   101
            replace = ToOutputString(nativeList);
pred@2019
   102
            contents = contents.Replace("$natives", replace);
pred@2019
   103
pred@2019
   104
            replace = ToOutputString(stockList);
pred@2019
   105
            contents = contents.Replace("$stocks", replace);
pred@2019
   106
pred@2019
   107
            replace = ToOutputString(funcenumList);
pred@2019
   108
            contents = contents.Replace("$funcenums", replace);
pred@2019
   109
pred@2019
   110
            replace = ToOutputString(functagList);
pred@2019
   111
            contents = contents.Replace("$functags", replace);
pred@2019
   112
pred@2019
   113
            replace = ToOutputString(structList);
pred@2019
   114
            contents = contents.Replace("$structs", replace);
pred@2019
   115
pred@2019
   116
            StreamWriter sw;
pred@2019
   117
            sw = File.CreateText(outputfile);
pred@2019
   118
pred@2019
   119
            sw.Write(contents);
pred@2019
   120
pred@2019
   121
            sr.Close();
pred@2019
   122
            sw.Close();
pred@2019
   123
        }
pred@2019
   124
pred@2019
   125
        private string ToOutputString(ArrayList a)
pred@2019
   126
        {
pred@2019
   127
            string defines = "";
pred@2019
   128
            int count = 0;
pred@2019
   129
pred@2019
   130
            foreach (object o in a)
pred@2019
   131
            {
pred@2019
   132
              defines += o;
pred@2019
   133
              defines += " ";
pred@2019
   134
              count += o.ToString().Length;
pred@2019
   135
pred@2019
   136
              if (count > 180)
pred@2019
   137
              {
pred@2019
   138
                defines += "\r\n";
pred@2019
   139
                count = 0;
pred@2019
   140
              }
pred@2019
   141
            }
pred@2019
   142
pred@2019
   143
            return defines;
pred@2019
   144
        }
pred@2019
   145
dvander@824
   146
        private void WriteLine(string line)
dvander@824
   147
        {
dvander@824
   148
            Tabinate();
dvander@824
   149
            data.Append(line + "\n");
dvander@824
   150
        }
dvander@824
   151
dvander@824
   152
        private void Tabinate()
dvander@824
   153
        {
dvander@824
   154
            for (int i = 0; i < level; i++)
dvander@824
   155
            {
dvander@824
   156
                data.Append("\t");
dvander@824
   157
            }
dvander@824
   158
        }
dvander@824
   159
dvander@824
   160
        private string PrepString(string text)
dvander@824
   161
        {
dvander@824
   162
            /* Escape all escaped newlines (so they can be unescaped later) */
dvander@824
   163
            text = text.Replace("\\n", "\\\\n");
dvander@824
   164
            /* Escape all literal newlines */
dvander@824
   165
            text = text.Replace("\n", "\\n");
dvander@824
   166
            text = text.Replace("\r", "");
dvander@824
   167
            /* Remove escaped quotations */
dvander@824
   168
            text = text.Replace("\\\"", "\"");
dvander@824
   169
            /* Replace all quotations with escaped ones now */
dvander@824
   170
            text = text.Replace("\"", "\\\"");
dvander@824
   171
            return text;
dvander@824
   172
        }
dvander@824
   173
    }
dvander@824
   174
}