public PrjGroup(ref PrjGroup parent) { Parent = parent; Excludes = new List <string>(); Files = new List <PrjFile>(); SubGroups = new List <PrjGroup>(); }
PrjGroup GetTopGroup(ref XmlReader reader, PrjGroup parent, string NodeName) { if (reader.EOF) { return(null); } var ret = new PrjGroup(ref parent); ret.Name = string.Empty; do { if (reader.Depth != 1) { continue; } XmlReader subReader = reader.ReadSubtree(); if (subReader.Read() && subReader.NodeType == XmlNodeType.Element) { var subsubReader = subReader.ReadSubtree(); do { subsubReader.Read(); switch (subsubReader.Name) { case "name": subsubReader.Read(); if (subsubReader.NodeType == XmlNodeType.Text && subsubReader.HasValue && subsubReader.Depth == 2) { ret.Files.Add(new PrjGroup.PrjFile()); ret.Files.Last().Name = subsubReader.Value; } break; case "excluded": if (subsubReader.NodeType == XmlNodeType.Element) { var subsubsubReader = subsubReader.ReadSubtree(); do { subsubsubReader.Read(); if (subsubsubReader.NodeType == XmlNodeType.Text) { ret.Files.Last().Excludes.Add(subsubsubReader.Value); } }while (!subsubsubReader.EOF); subsubsubReader.Close(); } break; } }while (!subsubReader.EOF); subsubReader.Close(); } }while (reader.ReadToNextSibling(NodeName)); return(ret); }
PrjGroup GetSubGroup(ref XmlReader reader, PrjGroup parent, string NodeName) { if (reader.NodeType != XmlNodeType.Element || reader.Name != NodeName) { reader.ReadToFollowing(NodeName); } if (reader.EOF) { return(null); } var ret = new PrjGroup(ref parent); XmlReader subReader = reader.ReadSubtree(); do { subReader.Read(); }while (subReader.NodeType != XmlNodeType.Text); ret.Name = subReader.Value; do { if (subReader.Read() && subReader.NodeType == XmlNodeType.Element) { switch (subReader.Name) { case "group": ret.SubGroups.Add(GetSubGroup(ref subReader, ret, NodeName)); break; case "file": var subsubReader = subReader.ReadSubtree(); do { subsubReader.Read(); switch (subsubReader.Name) { case "name": subsubReader.Read(); if (subsubReader.NodeType == XmlNodeType.Text && subsubReader.HasValue && subsubReader.Depth == 2) { ret.Files.Add(new PrjGroup.PrjFile()); ret.Files.Last().Name = subsubReader.Value; } break; case "excluded": if (subsubReader.NodeType == XmlNodeType.Element) { var subsubsubReader = subsubReader.ReadSubtree(); do { subsubsubReader.Read(); if (subsubsubReader.NodeType == XmlNodeType.Text) { ret.Files.Last().Excludes.Add(subsubsubReader.Value); } }while (!subsubsubReader.EOF); subsubsubReader.Close(); } break; } }while (!subsubReader.EOF); subsubReader.Close(); break; case "excluded": do { subReader.Read(); if (subReader.NodeType == XmlNodeType.Text && subReader.HasValue) { ret.Excludes.Add(subReader.Value); } }while (reader.Name != "excluded"); break; } } }while (!subReader.EOF); subReader.Close(); return(ret); }
private void btnGo_Click(object sender, EventArgs e) { try { string text = File.ReadAllText(txtPath.Text); XmlReader reader = XmlReader.Create(new StringReader(text)); List <PrjConfig> prjConfigs = new List <PrjConfig>(); List <PrjGroup> prjGroups = new List <PrjGroup>(); //read configs reader.ReadToFollowing("configuration"); do { XmlReader subReader = reader.ReadSubtree(); subReader.ReadToDescendant("name"); subReader.Read(); prjConfigs.Add(new PrjConfig()); prjConfigs.Last().Name = subReader.Value; // General settings subReader.ReadToFollowing("settings"); do { subReader.Read(); if (subReader.EOF) { break; } }while (subReader.NodeType != XmlNodeType.Text || subReader.Value == "OGUseCmsis"); do { subReader.Read(); if (subReader.EOF) { break; } }while (subReader.NodeType != XmlNodeType.Text); prjConfigs.Last().Cmsis = int.Parse(subReader.Value) > 0; //C/C++ settings subReader.ReadToFollowing("settings"); prjConfigs.Last().Defines = GetSubValue(ref subReader, "CCDefines"); //Add IAR define prjConfigs.Last().Defines.Add("_IAR_"); prjConfigs.Last().Defines.Add("__ICCARM__"); prjConfigs.Last().Defines.Add("_Pragma(x)="); prjConfigs.Last().Defines.Add("__interrupt="); prjConfigs.Last().Defines.Add("__packed="); prjConfigs.Last().Defines.Add("__weak="); prjConfigs.Last().Defines.Add("__REV(x)=x"); prjConfigs.Last().Defines.Add("__REV16(x)=x"); prjConfigs.Last().Defines.Add("__disable_irq()="); prjConfigs.Last().Defines.Add("__enable_irq()="); prjConfigs.Last().Defines.Add("__noreturn="); prjConfigs.Last().Defines.Add("__no_init="); prjConfigs.Last().Defines.Add("__I="); prjConfigs.Last().Defines.Add("__IO="); prjConfigs.Last().Defines.Add("__O="); prjConfigs.Last().Defines.Add("__ramfunc="); prjConfigs.Last().PreIncludes = GetSubValue(ref subReader, "PreInclude"); prjConfigs.Last().IncludePaths = GetSubValue(ref subReader, "CCIncludePath2"); subReader.Close(); }while (reader.ReadToNextSibling("configuration")); //read files with group reader = XmlReader.Create(new StringReader(text)); do { var ret = GetSubGroup(ref reader, null, "group"); if (ret != null) { prjGroups.Add(ret); } }while (reader.ReadToNextSibling("group")); //read files without group reader = XmlReader.Create(new StringReader(text)); do { reader.ReadToFollowing("file"); if (reader.Depth == 1 && reader.NodeType == XmlNodeType.Element) { var ret = GetTopGroup(ref reader, null, "file"); if (ret != null) { prjGroups.Add(ret); } } }while (!reader.EOF); // FormatPath(ref prjGroups); FormatCfgPath(ref prjConfigs); //write configs to script StreamWriter file = new StreamWriter(Path.GetDirectoryName(txtPath.Text) + "\\IAR_Gen.lua"); { // file.WriteLine("workspace \"" + Path.GetFileNameWithoutExtension(txtPath.Text) + "\""); file.WriteLine(" configurations { \"" + string.Join("\", \"", prjConfigs.Select(i => i.Name).ToArray()) + "\" }"); file.WriteLine("project\"" + Path.GetFileNameWithoutExtension(txtPath.Text) + "\""); file.WriteLine(" kind \"ConsoleApp\""); file.WriteLine(" language \"C\""); foreach (var conf in prjConfigs) { file.WriteLine("filter \"configurations:" + conf.Name + "\""); file.WriteLine(" sysincludedirs {\"$(VC_IncludePath)\"}"); file.WriteLine(" defines { \"" + string.Join("\", \"", conf.Defines) + "\" }"); file.WriteLine(" forceincludes { \"" + string.Join("\", \"", conf.PreIncludes) + "\" }"); file.WriteLine(" includedirs { \"" + string.Join("\", \"", conf.IncludePaths) + "\" }"); var srcFiles = PrjGroup.ReadAllFile(ref prjGroups, conf.Name); file.WriteLine(" files { \"" + string.Join("\", \"", srcFiles) + "\" }"); //file.WriteLine(" vpaths { [\"*\"] = \"..\" }"); var vGroups = PrjGroup.ReadVpath(ref prjGroups, conf.Name); file.WriteLine(" vpaths {" + string.Join(" , ", vGroups) + " }"); } //file.Write(IncOverride); file.Close(); Process proc = new Process { StartInfo = new ProcessStartInfo { FileName = "premake.exe", Arguments = "--File=\"" + Path.GetDirectoryName(txtPath.Text) + "\\IAR_Gen.lua\" " + cmbTarget.Text, UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true } }; proc.Start(); var makeOut = proc.StandardOutput.ReadToEnd(); if (proc.ExitCode == 0) { MessageBox.Show(makeOut, @"Make output"); if (cmbTarget.Text.Contains("vs")) { DialogResult dialogResult = MessageBox.Show(@"Open Project ?", Text, MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) { ProcessStartInfo psi = new ProcessStartInfo(Path.ChangeExtension(txtPath.Text, "sln")) { UseShellExecute = true }; Process.Start(psi); } } if (checkBox1.Checked) { Application.Exit(); } } else { MessageBox.Show(makeOut, @"Make output", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } catch (Exception ex) { MessageBox.Show(ex.Message, @"Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }