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;
        }
Example #2
0
        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());
 }
Example #4
0
        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();
        }
Example #5
0
        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());
        }
Example #6
0
        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();
        }
Example #7
0
        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);
                }
            }
        }
Example #8
0
 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 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;
        }