static IEnumerable<StartupFileGenerator.InterruptVectorTable> ParseStartupFiles(string startupFileName, MCUFamilyBuilder fam)
{
string aStartNewName;
string strPrefFam;
if (fam.Definition.Name.StartsWith("AT"))
strPrefFam = fam.Definition.Name.Substring(2, fam.Definition.Name.Length - 2);
else
strPrefFam = fam.Definition.Name;
if(strPrefFam != "SAMG51")
strPrefFam = strPrefFam.Substring(0, strPrefFam.Length - 1);
if (strPrefFam == "SAM4cm3")
strPrefFam = strPrefFam.Substring(0, strPrefFam.Length - 1);
foreach (var fl in Directory.GetFiles(Path.GetDirectoryName(startupFileName), strPrefFam + "*.h", SearchOption.AllDirectories/* TopDirectoryOnly*/))
{
if (fl.Contains("\\pio\\"))
continue;
string aNameFl = fl.Substring(fl.LastIndexOf("\\")+1, fl.Length - fl.LastIndexOf("\\")-1);
if (Path.GetFileNameWithoutExtension(aNameFl).ToUpper() == strPrefFam.ToUpper())
continue;
if (aNameFl.EndsWith("_1.h"))
continue;
if (aNameFl.EndsWith("_0.h"))
aNameFl = aNameFl.Replace("_0.h", ".h");
aStartNewName = "startup_" + aNameFl;
List<StartupFileGenerator.InterruptVector[]> list = new List<StartupFileGenerator.InterruptVector[]>();
list.Add(StartupFileGenerator.ParseInterruptVectors(fl,
@"^typedef struct _DeviceVectors.*",
@"} DeviceVectors;.*",
@"[ \t]+void\*[ ]+([\w]+).*",
@"([^ \t,]+)[,]?.*",
@"^[ \t]*[/{]+.*",
null,
1,
2));
List<StartupFileGenerator.InterruptVector> vectors = new List<StartupFileGenerator.InterruptVector>(list[0]);
list.RemoveAt(0);
//Fix the vector names from comments
for (int i = 0; i < vectors.Count; i++)
{
if (vectors[i] == null)
continue;
if (i == 0)
{
vectors[i].Name = "_estack";
continue;
}
else if (i == 1)
{
vectors[i].Name = "Reset_Handler";
continue;
}
else if (vectors[i].Name.StartsWith("pvReserved"))
{
vectors[i] = null;
continue;
}
else
{
if (vectors[i] == null)
continue;
if (!vectors[i].Name.StartsWith("pfn"))
throw new Exception("no pfn Func Startup Header");
vectors[i].Name = vectors[i].Name.Substring(3, vectors[i].Name.Length - 3);
}
}
yield return new StartupFileGenerator.InterruptVectorTable
{
FileName = Path.ChangeExtension(Path.GetFileName(aStartNewName), ".c"),
MatchPredicate = m =>(Path.GetFileNameWithoutExtension(aNameFl).ToUpper() == m.Name.Substring(2).ToUpper()),
Vectors = vectors.ToArray()
};
}
}