Repository navigation
Expand file tree
/
Copy pathPreprocessor.cs
More file actions
128 lines (104 loc) · 3.6 KB
/
Copy pathPreprocessor.cs
File metadata and controls
128 lines (104 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Collections;
using System.IO;
namespace DocGen
{
/// <summary>
/// Summary description for Preprocessor.
/// </summary>
public class Preprocessor
{
private ArrayList Files = new ArrayList();
public ArrayList SortedFiles = new ArrayList();
//=====================================================================
public Preprocessor()
{
}
//=====================================================================
public void TakeFile (String name)
{
this.Files.Add(new SourceFile(name));
}
//=====================================================================
public void Preprocess()
{
foreach (SourceFile f in this.Files)
this.Preprocess(f);
this.SortFiles();
}
//=====================================================================
private void Preprocess (SourceFile file)
{
System.Console.Out.WriteLine("preprocessing " + file.FullPath);
StreamReader sr = new StreamReader(file.FullPath);
String line;
while (null != (line = sr.ReadLine()))
{
file.NumLines++;
line = line.Trim();
if (! line.StartsWith("#include"))
continue;
line = line.Substring(8).Trim();
if (line == "")
continue;
String includeFileName;
if (line[0] == '\"')
{
int n = line.IndexOf('\"', 1);
if (n < 0)
return;
includeFileName = line.Substring(1, n - 1);
}
else if (line[0] == '<')
{
int n = line.IndexOf('>', 1);
if (n < 0)
return;
includeFileName = line.Substring(1, n - 1);
}
else continue;
SourceFile includeFile = this.FindFile(includeFileName);
if (includeFile == null)
throw new Exception("unknown include file: " + includeFileName);
file.IncludeFiles.Add(includeFile);
}
sr.Close();
}
//=====================================================================
private void SortFiles ()
{
while (this.SortingPass())
{ }
foreach (SourceFile f in Files)
{
if (!f.SortFlag)
SortedFiles.Add(f);
}
if (this.Files.Count != this.SortedFiles.Count)
throw new Exception("uh-oh");
}
//=====================================================================
private bool SortingPass ()
{
bool didSomething = false;
foreach (SourceFile f in this.Files)
{
if (! (f.SortFlag || f.HasUnsortedDependencies()))
{
f.SortFlag = true;
this.SortedFiles.Add(f);
didSomething = true;
}
}
return didSomething;
}
//=====================================================================
private SourceFile FindFile (String name)
{
foreach (SourceFile f in this.Files)
if (f.ShortName == name)
return f;
return null;
}
}
}