コード例 #1
0
        public void LoadUserData(UserData_v3 sUser, Program program, UserData user)
        {
            if (sUser == null)
            {
                return;
            }
            user.OnLoadedScript = sUser.OnLoadedScript;
            if (sUser.Processor != null)
            {
                program.User.Processor = sUser.Processor.Name;
                if (program.Architecture == null && !string.IsNullOrEmpty(program.User.Processor))
                {
                    program.Architecture = Services.RequireService <IConfigurationService>().GetArchitecture(program.User.Processor);
                }
                //program.Architecture.LoadUserOptions();       //$TODO
            }
            if (sUser.Procedures != null)
            {
                user.Procedures = sUser.Procedures
                                  .Select(sup =>
                {
                    Address addr;
                    program.Architecture.TryParseAddress(sup.Address, out addr);
                    return(new KeyValuePair <Address, Procedure_v1>(addr, sup));
                })
                                  .Where(kv => kv.Key != null)
                                  .ToSortedList(kv => kv.Key, kv => kv.Value);
            }

            if (sUser.PlatformOptions != null)
            {
                program.User.Environment = sUser.PlatformOptions.Name;
                program.Platform.LoadUserOptions(XmlOptions.LoadIntoDictionary(sUser.PlatformOptions.Options));
            }
            if (sUser.GlobalData != null)
            {
                user.Globals = sUser.GlobalData
                               .Select(sud =>
                {
                    Address addr;
                    program.Architecture.TryParseAddress(sud.Address, out addr);
                    return(new KeyValuePair <Address, GlobalDataItem_v2>(
                               addr,
                               sud));
                })
                               .Where(kv => kv.Key != null)
                               .ToSortedList(kv => kv.Key, kv => kv.Value);
            }

            if (sUser.Heuristics != null)
            {
                user.Heuristics.UnionWith(sUser.Heuristics.Select(h => h.Name));
            }
            program.EnvironmentMetadata = project.LoadedMetadata;
        }
コード例 #2
0
        private void Awake()
        {
            xmlOptions = new XmlOptions();
            xmlOptions.CompactOutput = false;

            xmlBuilder = new StringBuilder();
            logBuilder = new StringBuilder();

            MovieDatabase.SerializationLog = logBuilder;
            Actor.SerializationLog         = logBuilder;
            Producer.SerializationLog      = logBuilder;
            Production.SerializationLog    = logBuilder;
        }
コード例 #3
0
ファイル: ProjectLoader.cs プロジェクト: ghmole/reko
        public void LoadUserData(UserData_v3 sUser, Program program, UserData user)
        {
            if (sUser == null)
            {
                return;
            }
            user.OnLoadedScript = sUser.OnLoadedScript;
            if (sUser.Processor != null)
            {
                program.User.Processor = sUser.Processor.Name;
                if (program.Architecture == null && !string.IsNullOrEmpty(program.User.Processor))
                {
                    program.Architecture = Services.RequireService <IConfigurationService>().GetArchitecture(program.User.Processor !);
                }
                //program.Architecture.LoadUserOptions();       //$TODO
            }
            if (sUser.Procedures != null)
            {
                user.Procedures = sUser.Procedures
                                  .Select(sup => LoadUserProcedure_v1(program, sup))
                                  .Where(kv => kv.Key != null)
                                  .ToSortedList(kv => kv.Key, kv => kv.Value);
            }

            if (sUser.PlatformOptions != null)
            {
                program.User.Environment = sUser.PlatformOptions.Name;
                program.Platform.LoadUserOptions(XmlOptions.LoadIntoDictionary(sUser.PlatformOptions.Options, StringComparer.OrdinalIgnoreCase));
            }
            if (sUser.GlobalData != null)
            {
                user.Globals = sUser.GlobalData
                               .Select(sud =>
                {
                    program.Architecture !.TryParseAddress(sud.Address, out Address addr);
                    return(new KeyValuePair <Address, GlobalDataItem_v2>(
                               addr,
                               sud));
                })
                               .Where(kv => kv.Key != null)
                               .ToSortedList(kv => kv.Key, kv => kv.Value);
            }

            if (sUser.Heuristics != null)
            {
                user.Heuristics.UnionWith(sUser.Heuristics.Select(h => h.Name));
            }
            // Backwards compatibility: older versions used single file policy.
            program.User.OutputFilePolicy = Program.SingleFilePolicy;
            program.EnvironmentMetadata   = project.LoadedMetadata;
        }
コード例 #4
0
        public void AreEqual_fails(string expectedXml, string actualXml, XmlOptions options, int expectedErrors)
        {
            AssertionFailure[] failures = Capture(() => Assert.Xml.AreEqual(expectedXml, actualXml, options));

            if (expectedErrors > 0)
            {
                Assert.Count(1, failures);
                Assert.Count(expectedErrors, failures[0].InnerFailures);
            }
            else
            {
                Assert.IsEmpty(failures);
            }
        }
コード例 #5
0
ファイル: ProjectLoader.cs プロジェクト: ghmole/reko
        public Program VisitInputFile(string projectFilePath, DecompilerInput_v5 sInput)
        {
            //$REVIEW: make this null
            //if (sInput.Filename == null)
            //    return null;
            var binAbsPath = ConvertToAbsolutePath(projectFilePath, sInput.Filename) !;
            var bytes      = loader.LoadImageBytes(binAbsPath, 0);
            var sUser      = sInput.User ?? new UserData_v4
            {
                ExtractResources = true,
                OutputFilePolicy = Program.SingleFilePolicy,
            };
            var     address     = LoadAddress(sUser, this.arch);
            var     archOptions = XmlOptions.LoadIntoDictionary(sUser.Processor?.Options, StringComparer.OrdinalIgnoreCase);
            Program program;

            if (!string.IsNullOrEmpty(sUser.Loader))
            {
                // The presence of an explicit loader name prompts us to
                // use the LoadRawImage path.
                var archName = sUser.Processor?.Name;
                var platform = sUser.PlatformOptions?.Name;
                program = loader.LoadRawImage(binAbsPath, bytes, address, new LoadDetails
                {
                    LoaderName          = sUser.Loader,
                    ArchitectureName    = archName,
                    ArchitectureOptions = archOptions,
                    PlatformName        = platform,
                    LoadAddress         = sUser.LoadAddress,
                });
            }
            else
            {
                program = loader.LoadExecutable(binAbsPath, bytes, sUser.Loader, address)
                          ?? new Program(); // A previous save of the project was able to read the file,
                                            // but now we can't...
            }
            LoadUserData(sUser, program, program.User, projectFilePath);
            program.Filename             = binAbsPath;
            program.DisassemblyDirectory = ConvertToAbsolutePath(projectFilePath, sInput.DisassemblyDirectory);
            program.SourceDirectory      = ConvertToAbsolutePath(projectFilePath, sInput.SourceDirectory);
            program.IncludeDirectory     = ConvertToAbsolutePath(projectFilePath, sInput.IncludeDirectory);
            program.ResourcesDirectory   = ConvertToAbsolutePath(projectFilePath, sInput.ResourcesDirectory);
            program.EnsureDirectoryNames(program.Filename);
            program.User.LoadAddress = address;
            ProgramLoaded?.Fire(this, new ProgramEventArgs(program));
            return(program);
        }
コード例 #6
0
ファイル: ProjectLoader.cs プロジェクト: ghmole/reko
        public Program VisitInputFile(string projectFilePath, DecompilerInput_v4 sInput)
        {
            var binAbsPath = ConvertToAbsolutePath(projectFilePath, sInput.Filename) !;
            var bytes      = loader.LoadImageBytes(binAbsPath, 0);
            var sUser      = sInput.User ?? new UserData_v4
            {
                ExtractResources = true,
            };
            var     address     = LoadAddress(sUser, this.arch);
            var     archOptions = XmlOptions.LoadIntoDictionary(sUser.Processor?.Options, StringComparer.OrdinalIgnoreCase);
            Program program;

            if (!string.IsNullOrEmpty(sUser.Loader))
            {
                // The presence of an explicit loader name prompts us to
                // use the LoadRawImage path.
                var archName = sUser.Processor?.Name;
                var platform = sUser.PlatformOptions?.Name;
                program = loader.LoadRawImage(binAbsPath, bytes, address, new LoadDetails
                {
                    LoaderName          = sUser.Loader,
                    ArchitectureName    = archName,
                    ArchitectureOptions = archOptions,
                    PlatformName        = platform,
                    LoadAddress         = sUser.LoadAddress,
                });
            }
            else
            {
                program = loader.LoadExecutable(binAbsPath, bytes, sUser.Loader, address)
                          ?? new Program(); // A previous save of the project was able to read the file,
                                            // but now we can't...
            }
            LoadUserData(sUser, program, program.User, projectFilePath);
            program.Filename             = binAbsPath;
            program.DisassemblyDirectory = ConvertToAbsolutePath(projectFilePath, Path.GetDirectoryName(sInput.DisassemblyFilename));
            program.SourceDirectory      = ConvertToAbsolutePath(projectFilePath, Path.GetDirectoryName(sInput.OutputFilename));
            program.IncludeDirectory     = ConvertToAbsolutePath(projectFilePath, Path.GetDirectoryName(sInput.TypesFilename));
            program.ResourcesDirectory   = ConvertToAbsolutePath(projectFilePath, sInput.ResourcesDirectory);
            program.EnsureDirectoryNames(binAbsPath);
            program.User.LoadAddress = address;
            // We are fettered by backwards compatibility here, don't suddenly change behavior
            // but keep all code in one file. After loading users can change to other policies.
            program.User.OutputFilePolicy = program.User.OutputFilePolicy ?? Program.SingleFilePolicy;
            ProgramLoaded?.Invoke(this, new ProgramEventArgs(program));
            return(program);
        }
コード例 #7
0
 public XmlFormatter(
     Func <Stream> outputStreamFactory,
     IReadOnlyList <string> outputPrefix,
     XmlOptions xmlOptions,
     IReadOnlyDictionary <QualifiedName, string> keys,
     IReadOnlyList <QualifiedName> hiddenKeys,
     IReadOnlyList <QualifiedName> csvArrays,
     IReadOnlyList <QualifiedName> xmlElements)
     : base(outputStreamFactory)
 {
     this.outputPrefix = outputPrefix;
     this.xmlOptions   = xmlOptions;
     this.keys         = keys;
     this.hiddenKeys   = new HashSet <QualifiedName>(hiddenKeys);
     this.csvArrays    = new HashSet <QualifiedName>(csvArrays);
     this.xmlElements  = new HashSet <QualifiedName>(xmlElements);
 }
コード例 #8
0
 private OperatingEnvironment LoadEnvironment(Environment_v1 env)
 {
     return(new OperatingEnvironmentElement
     {
         Name = env.Name,
         Description = env.Description,
         MemoryMapFile = env.MemoryMap,
         TypeName = env.Type,
         Heuristics = env.Heuristics,
         TypeLibraries = LoadCollection(env.TypeLibraries, LoadTypeLibraryReference),
         CharacteristicsLibraries = LoadCollection(env.Characteristics, LoadTypeLibraryReference),
         Options = env.Options != null
             ? XmlOptions.LoadIntoDictionary(env.Options
                                             .SelectMany(o => o.ChildNodes.OfType <XmlElement>())
                                             .ToArray())
             : new Dictionary <string, object>()
     });
 }
コード例 #9
0
 private PlatformDefinition LoadEnvironment(Environment_v1 env)
 {
     return(new PlatformDefinition
     {
         Name = env.Name,
         Description = env.Description,
         MemoryMapFile = env.MemoryMap,
         TypeName = env.Type,
         Heuristics = env.Heuristics,
         TypeLibraries = LoadCollection(env.TypeLibraries, LoadTypeLibraryReference),
         CharacteristicsLibraries = LoadCollection(env.Characteristics, LoadTypeLibraryReference),
         Architectures = LoadCollection(env.Architectures, LoadPlatformArchitecture),
         Options = env.Options != null
             ? XmlOptions.LoadIntoDictionary(env.Options
                                             .SelectMany(o => o.ChildNodes.OfType <XmlElement>())
                                             .ToArray(),
                                             StringComparer.OrdinalIgnoreCase)
             : new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase)
     });
 }
コード例 #10
0
        public Program VisitInputFile(string projectFilePath, DecompilerInput_v4 sInput)
        {
            var     binAbsPath  = ConvertToAbsolutePath(projectFilePath, sInput.Filename);
            var     bytes       = loader.LoadImageBytes(ConvertToAbsolutePath(projectFilePath, sInput.Filename), 0);
            var     sUser       = sInput.User ?? new UserData_v4();
            var     address     = LoadAddress(sUser, this.arch);
            var     archOptions = XmlOptions.LoadIntoDictionary(sUser.Processor?.Options, StringComparer.OrdinalIgnoreCase);
            Program program;

            if (!string.IsNullOrEmpty(sUser.Loader))
            {
                // The presence of an explicit loader name prompts us to
                // use the LoadRawImage path.
                var arch     = sUser.Processor.Name;
                var platform = sUser.PlatformOptions?.Name;
                program = loader.LoadRawImage(binAbsPath, bytes, address, new LoadDetails
                {
                    LoaderName          = sUser.Loader,
                    ArchitectureName    = arch,
                    ArchitectureOptions = archOptions,
                    PlatformName        = platform,
                    LoadAddress         = sUser.LoadAddress,
                });
            }
            else
            {
                program = loader.LoadExecutable(binAbsPath, bytes, sUser.Loader, address);
            }
            LoadUserData(sUser, program, program.User);
            program.Filename             = binAbsPath;
            program.DisassemblyFilename  = ConvertToAbsolutePath(projectFilePath, sInput.DisassemblyFilename);
            program.IntermediateFilename = ConvertToAbsolutePath(projectFilePath, sInput.IntermediateFilename);
            program.OutputFilename       = ConvertToAbsolutePath(projectFilePath, sInput.OutputFilename);
            program.TypesFilename        = ConvertToAbsolutePath(projectFilePath, sInput.TypesFilename);
            program.GlobalsFilename      = ConvertToAbsolutePath(projectFilePath, sInput.GlobalsFilename);
            program.EnsureFilenames(program.Filename);
            program.User.LoadAddress = address;
            ProgramLoaded.Fire(this, new ProgramEventArgs(program));
            return(program);
        }
コード例 #11
0
ファイル: ProjectLoader.cs プロジェクト: claunia/reko
        private Program LoadProgram(string projectFilePath, DecompilerInput_v5 sInput)
        {
            var binAbsPath = ConvertToAbsolutePath(projectFilePath, sInput.Filename) !;
            var bytes      = loader.LoadImageBytes(binAbsPath, 0);
            var sUser      = sInput.User ?? new UserData_v4
            {
                ExtractResources = true,
                OutputFilePolicy = Program.SingleFilePolicy,
            };
            var     address     = LoadAddress(sUser, this.arch !);
            var     archOptions = XmlOptions.LoadIntoDictionary(sUser.Processor?.Options, StringComparer.OrdinalIgnoreCase);
            Program program;

            if (!string.IsNullOrEmpty(sUser.Loader))
            {
                // The presence of an explicit loader name prompts us to
                // use the LoadRawImage path.
                var archName = sUser.Processor?.Name;
                var platform = sUser.PlatformOptions?.Name;
                program = loader.LoadRawImage(binAbsPath, bytes, address, new LoadDetails
                {
                    LoaderName          = sUser.Loader,
                    ArchitectureName    = archName,
                    ArchitectureOptions = archOptions,
                    PlatformName        = platform,
                    LoadAddress         = sUser.LoadAddress,
                });
            }
            else
            {
                program = loader.LoadExecutable(binAbsPath, bytes, sUser.Loader, address)
                          ?? new Program(); // A previous save of the project was able to read the file,
                                            // but now we can't...
            }
            return(program);
        }
コード例 #12
0
ファイル: ProjectLoader.cs プロジェクト: chostelet/reko
        /// <summary>
        /// Loads the user-specified data.
        /// </summary>
        /// <param name="sUser"></param>
        /// <param name="program"></param>
        /// <param name="user"></param>
        public void LoadUserData(UserData_v4 sUser, Program program, UserData user, string projectFilePath)
        {
            if (sUser == null)
            {
                return;
            }
            user.OnLoadedScript = sUser.OnLoadedScript;
            if (sUser.Processor != null)
            {
                user.Processor = sUser.Processor.Name;
                if (program.Architecture == null && !string.IsNullOrEmpty(user.Processor))
                {
                    program.Architecture = Services.RequireService <IConfigurationService>().GetArchitecture(user.Processor);
                }
                program.Architecture.LoadUserOptions(XmlOptions.LoadIntoDictionary(sUser.Processor.Options, StringComparer.OrdinalIgnoreCase));
            }
            if (sUser.PlatformOptions != null)
            {
                user.Environment = sUser.PlatformOptions.Name;
                program.Platform.LoadUserOptions(XmlOptions.LoadIntoDictionary(sUser.PlatformOptions.Options, StringComparer.OrdinalIgnoreCase));
            }
            if (sUser.Procedures != null)
            {
                user.Procedures = sUser.Procedures
                                  .Select(sup => LoadUserProcedure_v1(program, sup))
                                  .Where(kv => kv.Key != null)
                                  .ToSortedList(kv => kv.Key, kv => kv.Value);
                user.ProcedureSourceFiles = user.Procedures
                                            .Where(kv => !string.IsNullOrEmpty(kv.Value.OutputFile))
                                            .ToDictionary(kv => kv.Key, kv => ConvertToAbsolutePath(projectFilePath, kv.Value.OutputFile));
            }
            if (sUser.GlobalData != null)
            {
                user.Globals = sUser.GlobalData
                               .Select(sud =>
                {
                    program.Architecture.TryParseAddress(sud.Address, out Address addr);
                    return(new KeyValuePair <Address, GlobalDataItem_v2>(
                               addr,
                               sud));
                })
                               .Where(kv => kv.Key != null)
                               .ToSortedList(kv => kv.Key, kv => kv.Value);
            }

            if (sUser.Annotations != null)
            {
                user.Annotations = new AnnotationList(sUser.Annotations
                                                      .Select(LoadAnnotation)
                                                      .Where(a => a.Address != null)
                                                      .ToList());
            }
            if (sUser.Heuristics != null)
            {
                user.Heuristics.UnionWith(sUser.Heuristics.Select(h => h.Name));
            }
            if (sUser.TextEncoding != null)
            {
                Encoding enc = null;
                try
                {
                    enc = Encoding.GetEncoding(sUser.TextEncoding);
                }
                catch
                {
                    var diagSvc = Services.RequireService <IDiagnosticsService>();
                    diagSvc.Warn(
                        "Unknown text encoding '{0}'. Defaulting to platform text encoding.",
                        sUser.TextEncoding);
                }
                user.TextEncoding = enc;
            }
            program.EnvironmentMetadata = project.LoadedMetadata;
            if (sUser.Calls != null)
            {
                program.User.Calls = sUser.Calls
                                     .Select(c => LoadUserCall(c, program))
                                     .Where(c => c != null)
                                     .ToSortedList(k => k.Address, v => v);
            }
            if (sUser.RegisterValues != null)
            {
                program.User.RegisterValues = LoadRegisterValues(sUser.RegisterValues);
            }
            if (sUser.JumpTables != null)
            {
                program.User.JumpTables = sUser.JumpTables.Select(LoadJumpTable_v4)
                                          .Where(t => t != null)
                                          .ToSortedList(k => k.Address, v => v);
            }
            if (sUser.IndirectJumps != null)
            {
                program.User.IndirectJumps = sUser.IndirectJumps
                                             .Select(ij => LoadIndirectJump_v4(ij, program))
                                             .Where(ij => ij != null)
                                             .ToSortedList(k => k.Item1, v => v.Item2);
            }
            if (sUser.Segments != null)
            {
                program.User.Segments = sUser.Segments
                                        .Select(s => LoadUserSegment_v4(s))
                                        .Where(s => s != null)
                                        .ToList();
            }
            program.User.ShowAddressesInDisassembly = sUser.ShowAddressesInDisassembly;
            program.User.ShowBytesInDisassembly     = sUser.ShowBytesInDisassembly;
            program.User.ExtractResources           = sUser.ExtractResources;
        }
コード例 #13
0
 public string FromModel <T>(T model, XmlOptions options) => Xml.FromModel(model, options);
コード例 #14
0
        public Data transform(Data data, XMLCryptoContext context)
        {
            LOG.Log(POILogger.DEBUG, "transform(data,context)");
            LOG.Log(POILogger.DEBUG, "data java type: " + data.Class.Name);
            OctetStreamData octetStreamData = (OctetStreamData)data;

            LOG.Log(POILogger.DEBUG, "URI: " + octetStreamData.URI);
            InputStream octetStream = octetStreamData.OctetStream;

            RelationshipsDocument relDoc;

            try {
                relDoc = RelationshipsDocument.Factory.Parse(octetStream);
            } catch (Exception e) {
                throw new TransformException(e.Message, e);
            }
            LOG.Log(POILogger.DEBUG, "relationships document", relDoc);

            CTRelationships           rels    = relDoc.Relationships;
            List <CTRelationship>     relList = rels.RelationshipList;
            Iterator <CTRelationship> relIter = rels.RelationshipList.Iterator();

            while (relIter.HasNext())
            {
                CTRelationship rel = relIter.Next();

                /*
                 * See: ISO/IEC 29500-2:2008(E) - 13.2.4.24 Relationships Transform
                 * Algorithm.
                 */
                if (!this.sourceIds.Contains(rel.Id))
                {
                    LOG.Log(POILogger.DEBUG, "removing element: " + rel.Id);
                    relIter.Remove();
                }
                else
                {
                    if (!rel.IsSetTargetMode())
                    {
                        rel.TargetMode = (/*setter*/ STTargetMode.INTERNAL);
                    }
                }
            }

            // TODO: remove non element nodes ???
            LOG.Log(POILogger.DEBUG, "# Relationship elements", relList.Size());

            //XmlSort.Sort(rels, new Comparator<XmlCursor>(){
            //    public int Compare(XmlCursor c1, XmlCursor c2) {
            //        String id1 = ((CTRelationship)c1.Object).Id;
            //        String id2 = ((CTRelationship)c2.Object).Id;
            //        return id1.CompareTo(id2);
            //    }
            //});

            try {
                MemoryStream bos = new MemoryStream();
                XmlOptions   xo  = new XmlOptions();
                xo.SaveNoXmlDecl;
                relDoc.Save(bos, xo);
                return(new OctetStreamData(new MemoryStream(bos.ToByteArray())));
            } catch (IOException e) {
                throw new TransformException(e.Message, e);
            }
        }
コード例 #15
0
 public void Assert_Exists(string description, string xml, string path, string expectedValue, XmlOptions options, bool shouldPass)
 {
     AssertionFailure[] failures = Capture(() => Assert.Xml.Exists(xml, path, options, expectedValue, description));
     Assert.AreEqual(shouldPass ? 0 : 1, failures.Length);
 }
コード例 #16
0
ファイル: ProjectLoader.cs プロジェクト: ntzwq/reko
 public void LoadUserData(UserData_v4 sUser, Program program, UserData user, string projectFilePath)
 {
     if (sUser == null)
         return;
     user.OnLoadedScript = sUser.OnLoadedScript;
     if (sUser.Processor != null)
     {
         user.Processor = sUser.Processor.Name;
         if (program.Architecture == null && !string.IsNullOrEmpty(user.Processor))
         {
             program.Architecture = Services.RequireService<IConfigurationService>().GetArchitecture(user.Processor!)!;
         }
         //$BUG: what if architecture isn't supported? fail the whole thing?
         program.Architecture!.LoadUserOptions(XmlOptions.LoadIntoDictionary(sUser.Processor.Options, StringComparer.OrdinalIgnoreCase));
     }
     if (sUser.PlatformOptions != null)
     {
         user.Environment = sUser.PlatformOptions.Name;
         program.Platform.LoadUserOptions(XmlOptions.LoadIntoDictionary(sUser.PlatformOptions.Options, StringComparer.OrdinalIgnoreCase));
     }
     if (sUser.Procedures != null)
     {
         user.Procedures = sUser.Procedures
             .Select(sup => LoadUserProcedure_v1(program, sup))
             .Where(kv => !(kv.Key is null))
             .ToSortedList(kv => kv.Key, kv => kv.Value);
         user.ProcedureSourceFiles = user.Procedures
             .Where(kv => !string.IsNullOrEmpty(kv.Value.OutputFile))
             .ToDictionary(kv => kv.Key!, kv => ConvertToAbsolutePath(projectFilePath, kv.Value.OutputFile)!);
     }
     if (sUser.GlobalData != null)
     {
         user.Globals = sUser.GlobalData
             .Select(sud =>
             {
                 program.Architecture.TryParseAddress(sud.Address, out Address addr);
                 return new KeyValuePair<Address, GlobalDataItem_v2>(
                     addr,
                     sud);
             })
             .Where(kv => !(kv.Key is null))
            .ToSortedList(kv => kv.Key, kv => kv.Value);
     }
   
     if (sUser.Annotations != null)
     {
         user.Annotations = new AnnotationList(sUser.Annotations
             .Select(LoadAnnotation)
             .Where(a => !(a.Address is null))
             .ToList());
     }
     if (sUser.Heuristics != null)
     {
         user.Heuristics.UnionWith(sUser.Heuristics
             .Where(h => !(h.Name is null))
             .Select(h => h.Name!));
     }
     if (sUser.TextEncoding != null)
     {
         Encoding enc = null;
         try
         {
             enc = Encoding.GetEncoding(sUser.TextEncoding);
         }
         catch
         {
             listener.Warn(
                 "Unknown text encoding '{0}'. Defaulting to platform text encoding.", 
                 sUser.TextEncoding);
         }
         user.TextEncoding = enc;
     }
     program.EnvironmentMetadata = project.LoadedMetadata;
     if (sUser.Calls != null)
     {
         program.User.Calls = sUser.Calls
             .Select(c => LoadUserCall(c, program))
             .Where(c => c != null && !(c.Address is null))
             .ToSortedList(k => k!.Address!, v => v!);
     }
     if (sUser.RegisterValues != null)
     {
         program.User.RegisterValues = LoadRegisterValues(sUser.RegisterValues);
     }
     if (sUser.JumpTables != null)
     {
         program.User.JumpTables = sUser.JumpTables.Select(LoadJumpTable_v4)
             .Where(t => t != null && t.Address != null)
             .ToSortedList(k => k!.Address, v => v);
     }
     if (sUser.IndirectJumps != null)
     {
         program.User.IndirectJumps = sUser.IndirectJumps
             .Select(ij => LoadIndirectJump_v4(ij, program))
             .Where(ij => ij.Item1 != null)
             .ToSortedList(k => k!.Item1, v => v!.Item2);
     }
     if (sUser.Segments != null)
     {
         program.User.Segments = sUser.Segments
             .Select(s => LoadUserSegment_v4(s))
             .Where(s => s != null)
             .ToList();
     }
     program.User.ShowAddressesInDisassembly = sUser.ShowAddressesInDisassembly;
     program.User.ShowBytesInDisassembly = sUser.ShowBytesInDisassembly;
     program.User.ExtractResources = sUser.ExtractResources;
     // Backwards compatibility: older versions used single file policy.
     program.User.OutputFilePolicy = sUser.OutputFilePolicy ?? Program.SingleFilePolicy;
     program.User.AggressiveBranchRemoval = sUser.AggressiveBranchRemoval;
 }
コード例 #17
0
ファイル: ProjectLoader.cs プロジェクト: Eng-RSMY/reko
        public void LoadUserData(UserData_v4 sUser, Program program, UserData user)
        {
            if (sUser == null)
            {
                return;
            }
            user.OnLoadedScript = sUser.OnLoadedScript;
            if (sUser.Processor != null)
            {
                program.User.Processor = sUser.Processor.Name;
                if (program.Architecture == null && !string.IsNullOrEmpty(program.User.Processor))
                {
                    program.Architecture = Services.RequireService <IConfigurationService>().GetArchitecture(program.User.Processor);
                }
                program.Architecture.LoadUserOptions(XmlOptions.LoadIntoDictionary(sUser.Processor.Options));
            }
            if (sUser.Procedures != null)
            {
                user.Procedures = sUser.Procedures
                                  .Select(sup => LoadUserProcedure_v1(program, sup))
                                  .Where(kv => kv.Key != null)
                                  .ToSortedList(kv => kv.Key, kv => kv.Value);
            }

            if (sUser.PlatformOptions != null)
            {
                program.User.Environment = sUser.PlatformOptions.Name;
                program.Platform.LoadUserOptions(XmlOptions.LoadIntoDictionary(sUser.PlatformOptions.Options));
            }
            if (sUser.GlobalData != null)
            {
                user.Globals = sUser.GlobalData
                               .Select(sud =>
                {
                    Address addr;
                    program.Architecture.TryParseAddress(sud.Address, out addr);
                    return(new KeyValuePair <Address, GlobalDataItem_v2>(
                               addr,
                               sud));
                })
                               .Where(kv => kv.Key != null)
                               .ToSortedList(kv => kv.Key, kv => kv.Value);
            }

            if (sUser.Heuristics != null)
            {
                user.Heuristics.UnionWith(sUser.Heuristics.Select(h => h.Name));
            }
            if (sUser.TextEncoding != null)
            {
                Encoding enc = null;
                try
                {
                    enc = Encoding.GetEncoding(sUser.TextEncoding);
                } catch
                {
                    var diagSvc = Services.RequireService <IDiagnosticsService>();
                    diagSvc.Warn(
                        "Unknown text encoding '{0}'. Defaulting to platform text encoding.",
                        sUser.TextEncoding);
                }
                user.TextEncoding = enc;
            }
            program.EnvironmentMetadata = project.LoadedMetadata;
            if (sUser.Calls != null)
            {
                program.User.Calls = sUser.Calls
                                     .Select(c => LoadUserCall(c, program))
                                     .Where(c => c != null)
                                     .ToSortedList(k => k.Address, v => v);
            }
            if (sUser.RegisterValues != null)
            {
                program.User.RegisterValues = LoadRegisterValues(sUser.RegisterValues);
            }
            if (sUser.JumpTables != null)
            {
                program.User.JumpTables = sUser.JumpTables.Select(LoadJumpTable_v4)
                                          .Where(t => t != null)
                                          .ToSortedList(k => k.Address, v => v);
            }
            if (user.IndirectJumps != null)
            {
                program.User.IndirectJumps = sUser.IndirectJumps
                                             .Select(ij => LoadIndirectJump_v4(ij, program))
                                             .Where(ij => ij != null)
                                             .ToSortedList(k => k.Item1, v => v.Item2);
            }
        }