internal void Save(string fn)
{
Directory.CreateDirectory(Path.GetDirectoryName(fn));
using (var sw = File.CreateText(fn))
{
if (Vectors[0].Name != "_estack" || Vectors[1].Name != "Reset_Handler")
throw new Exception("Unexpected vector table layout");
var templateLines = File.ReadAllLines("StartupFileTemplate.c");
for (int l = 0; l < templateLines.Length; l++ )
{
var line = templateLines[l];
if (line.Contains("$$EXTRA_RESET_HANDLER_CODE$$"))
{
if (AdditionalResetHandlerLines != null)
foreach (var l2 in AdditionalResetHandlerLines)
sw.WriteLine(line.Replace("$$EXTRA_RESET_HANDLER_CODE$$", l2));
}
else if (line.Contains("$$VECTOR$$"))
{
List<string> lines = new List<string>();
int extraLines = 0;
int idx = line.IndexOf("$@+");
if (idx != -1)
{
extraLines = int.Parse(line.Substring(idx + 3));
line = line.Substring(0, idx);
}
for (int i = 2; i < Vectors.Length; i++)
{
if (Vectors[i] != null && Vectors[i].SpecialVectorValue == null)
{
lines.Add(line.Replace("$$VECTOR$$", Vectors[i].Name));
for (int j = 1; j <= extraLines; j++)
lines.Add(templateLines[l + j].Replace("$$VECTOR$$", Vectors[i].Name));
}
}
if (line.Contains("$$ALIGN_SPACE_OFFSET$$"))
lines = AlignSpaceOffset(lines);
foreach (var l2 in lines)
sw.WriteLine(l2);
l += extraLines;
}
else if (line.Contains("$$VECTOR_TABLE_SIZE$$"))
{
sw.WriteLine(line.Replace("$$VECTOR_TABLE_SIZE$$", string.Format("0x{0:x}", Vectors.Length)));
}
else if (line.Contains("$$VECTOR_POINTER$$"))
{
for (int i = 2; i < Vectors.Length; i++)
{
if (Vectors[i] == null)
sw.WriteLine(line.Replace("$$VECTOR_POINTER$$", "NULL"));
else if (Vectors[i].SpecialVectorValue == null)
sw.WriteLine(line.Replace("$$VECTOR_POINTER$$", "&" + Vectors[i].Name));
else
sw.WriteLine(line.Replace("$$VECTOR_POINTER$$", "(void *)" + Vectors[i].SpecialVectorValue + " /* " + Vectors[i].Name + " */"));
}
}
else
sw.WriteLine(line);
}
}
}