|
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 |
} |