private void CreateNestedTextModel() { this.nestedTextModel = new NestedTextModel(); var mixedCodeDataModel = combinedCodeView.MixedCodeDataView.Model as MixedCodeDataModel; if (mixedCodeDataModel == null) { return; } var dataItemNodes = mixedCodeDataModel.GetDataItemNodes(); this.nodeByAddress = new SortedList <Address, MixedCodeDataModel.DataItemNode>(); foreach (var dataItemNode in dataItemNodes) { var curAddr = dataItemNode.StartAddress; bool nodeCreated = false; ImageMapItem item; Procedure proc = dataItemNode.Proc; if (ShowItem(dataItemNode)) { if (proc != null) { var model = new ProcedureCodeModel(proc); //$TODO: make spacing between globals / procedures user adjustable model.NumEmptyLinesAfter = 2; nestedTextModel.Nodes.Add(model); nodeCreated = true; } else if (program.ImageMap.TryFindItem(curAddr, out item) && item.DataType != null && !(item.DataType is UnknownType)) { var dt = item.DataType; var name = item.Name ?? "<unnamed>"; var tsf = new TextSpanFormatter(); var fmt = new AbsynCodeFormatter(tsf); fmt.InnerFormatter.UseTabs = false; var gdw = new GlobalDataWriter(program, services); gdw.WriteGlobalVariable(curAddr, dt, name, tsf); //$TODO: make spacing between globals / procedures user adjustable tsf.WriteLine(""); nestedTextModel.Nodes.Add(tsf.GetModel()); nodeCreated = true; } } if (nodeCreated) { dataItemNode.ModelNode = nestedTextModel.Nodes.Last(); this.nodeByAddress[curAddr] = dataItemNode; } } combinedCodeView.CodeView.Model = nestedTextModel; }
public void WriteGlobals(Program program, TextWriter w) { WriteHeaderComment(Path.GetFileName(program.OutputFilename), program, w); w.WriteLine("#include \"{0}\"", Path.GetFileName(program.TypesFilename)); w.WriteLine(); var gdw = new GlobalDataWriter(program, services); gdw.WriteGlobals(new TextFormatter(w)); w.WriteLine(); }
private void RunTest(string sExp) { var sw = new StringWriter(); var gdw = new GlobalDataWriter(prog, sc); gdw.WriteGlobals(new TextFormatter(sw) { Indentation = 0, UseTabs = false, }); Assert.AreEqual(sExp, sw.ToString()); }
public void WriteGlobals(Program program, string filename, TextWriter w) { var headerfile = Path.ChangeExtension(Path.GetFileName(program.Filename), ".h"); WriteHeaderComment(filename, program, w); w.WriteLine("#include \"{0}\"", headerfile); w.WriteLine(); var gdw = new GlobalDataWriter(program, services); gdw.WriteGlobals(new TextFormatter(w)); w.WriteLine(); }
public void WriteGlobals(Program program, string filename, TextWriter w) { var headerfile = DecompiledFileService.GenerateDerivedFilename(program, ".h"); WriteHeaderComment(filename, program, w); w.WriteLine("#include \"{0}\"", headerfile); w.WriteLine(); var gdw = new GlobalDataWriter(program, new TextFormatter(w), true, true, services); gdw.Write(); w.WriteLine(); }
public void WriteDecompiledObjects(Program program, string filename, IEnumerable <IAddressable> objects, TextWriter w) { WriteHeaderComment(filename, program, w); //$REFACTOR: common code -- hardwired ".h" var headerfile = Path.ChangeExtension(Path.GetFileName(program.Filename), ".h"); w.WriteLine("#include \"{0}\"", headerfile); w.WriteLine(); var fmt = new AbsynCodeFormatter(new TextFormatter(w)); var gdw = new GlobalDataWriter(program, fmt.InnerFormatter, false, true, this.services); IAddressable?prev = null; foreach (var o in objects) { if (o is Procedure proc) { try { if (prev is GlobalVariable) { w.WriteLine(); } WriteProcedureHeader(program, proc, w); fmt.Write(proc); w.WriteLine(); } catch (Exception ex) { w.WriteLine(); w.WriteLine("// Exception {0} when writing procedure.", ex.Message); } } else if (o is GlobalVariable global) { gdw.WriteGlobalVariable(global.Address, global.DataType, global.Name); } } }
private void CreateNestedTextModel() { this.nestedTextModel = new NestedTextModel(); var mixedCodeDataModel = combinedCodeView.MixedCodeDataView.Model as MixedCodeDataModel; if (mixedCodeDataModel == null) return; var dataItemNodes = mixedCodeDataModel.GetDataItemNodes(); this.nodeByAddress = new SortedList<Address, MixedCodeDataModel.DataItemNode>(); foreach (var dataItemNode in dataItemNodes) { var curAddr = dataItemNode.StartAddress; bool nodeCreated = false; ImageMapItem item; Procedure proc = dataItemNode.Proc; if (ShowItem(dataItemNode)) { if (proc != null) { var tsf = new TextSpanFormatter(); var fmt = new AbsynCodeFormatter(tsf); fmt.InnerFormatter.UseTabs = false; fmt.Write(proc); //$TODO: make spacing between globals / procedures user adjustable tsf.WriteLine(""); tsf.WriteLine(""); nestedTextModel.Nodes.Add(tsf.GetModel()); nodeCreated = true; } else if (program.ImageMap.TryFindItem(curAddr, out item) && item.DataType != null && !(item.DataType is UnknownType)) { var dt = item.DataType; var name = item.Name ?? "<unnamed>"; var tsf = new TextSpanFormatter(); var fmt = new AbsynCodeFormatter(tsf); fmt.InnerFormatter.UseTabs = false; var gdw = new GlobalDataWriter(program, services); gdw.WriteGlobalVariable(curAddr, dt, name, tsf); //$TODO: make spacing between globals / procedures user adjustable tsf.WriteLine(""); nestedTextModel.Nodes.Add(tsf.GetModel()); nodeCreated = true; } } if (nodeCreated) { dataItemNode.ModelNode = nestedTextModel.Nodes.Last(); this.nodeByAddress[curAddr] = dataItemNode; } } combinedCodeView.CodeView.Model = nestedTextModel; }