From a3d7e73b11fca0dba46e8d906080a675dc5b7a79 Mon Sep 17 00:00:00 2001 From: Yoshi Askharoun Date: Thu, 13 Jun 2024 17:30:27 -0500 Subject: [PATCH] Add de/compile + settings --- UIXC/Commands/CompileCommand.cs | 20 ++--------- UIXC/Commands/DecompileCommand.cs | 58 ++++++++++++++++++++++--------- UIXC/CommonSettings.cs | 34 ++++++++++++++++++ 3 files changed, 77 insertions(+), 35 deletions(-) create mode 100644 UIXC/CommonSettings.cs diff --git a/UIXC/Commands/CompileCommand.cs b/UIXC/Commands/CompileCommand.cs index 0aa62d1..2f38647 100644 --- a/UIXC/Commands/CompileCommand.cs +++ b/UIXC/Commands/CompileCommand.cs @@ -23,7 +23,7 @@ public class CompileCommand : Command CompilerInput[] compilands = new CompilerInput[settings.Compilands.Length]; for (int c = 0; c < settings.Compilands.Length; c++) { - string sourcePath = settings.Compilands[0]; + string sourcePath = settings.Compilands[c]; compilands[c] = new() { SourceFileName = sourcePath, @@ -88,26 +88,10 @@ public class CompileCommand : Command return Path.Combine(outputDir, Path.ChangeExtension(sourceFilePath, ".uib")); } - public sealed class Settings : CommandSettings + public sealed class Settings : CompilerSettings { [Description("The source files to compile.")] [CommandArgument(0, "[compilands]")] public required string[] Compilands { get; init; } - - [Description("Directories to search for imported files in.")] - [CommandOption("-I ")] - public required string[] IncludeDirectories { get; init; } - - [Description("A shared binary data table to compile with.")] - [CommandOption("-t|--dataTable")] - public string? DataTable { get; init; } - - [Description("The directory to output to.")] - [CommandOption("-o|--output ")] - public string? OutputDir { get; init; } - - [CommandOption("--verbose")] - [DefaultValue(false)] - public bool Verbose { get; init; } } } diff --git a/UIXC/Commands/DecompileCommand.cs b/UIXC/Commands/DecompileCommand.cs index b0a25e4..f60cab4 100644 --- a/UIXC/Commands/DecompileCommand.cs +++ b/UIXC/Commands/DecompileCommand.cs @@ -1,9 +1,11 @@ using Microsoft.Iris.Asm; using Microsoft.Iris.Debug; using Microsoft.Iris.Markup; +using Microsoft.Iris.Session; using Spectre.Console; using Spectre.Console.Cli; using System.ComponentModel; +using System.Runtime.Loader; namespace UIXC.Commands; @@ -29,6 +31,43 @@ public class DecompileCommand : Command }; } + ErrorManager.OnErrors += (errors) => + { + foreach (ErrorRecord error in errors) + { + var (color, type) = error.Warning + ? ("yellow", "WARN") : ("red", "ERROR"); + + AnsiConsole.MarkupLineInterpolated($"[{color}]{type}: {error.Message}[/]"); + } + }; + + foreach (var givenPath in settings.Assemblies ?? []) + { + try + { + var assemblyPath = givenPath; + if (!Path.IsPathFullyQualified(givenPath)) + { + assemblyPath = Path.GetFullPath(givenPath); + } + + _ = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath); + } + catch (Exception ex) + { + AnsiConsole.WriteException(ex); + if (!AnsiConsole.Ask("Do you want to continue?", false)) + return -1; + } + } + + foreach (var redirectOption in settings.ImportRedirects ?? []) + { + var parts = redirectOption.Split('>'); + MarkupSystem.AddImportRedirect(parts[0], parts[1]); + } + MarkupSystem.Startup(true); bool success = false; @@ -77,37 +116,22 @@ public class DecompileCommand : Command return 0; } } + private static string GetOutputPath(Settings settings, string inputFilePath) { var outputDir = settings.OutputDir ?? Environment.CurrentDirectory; return Path.Combine(outputDir, Path.ChangeExtension(inputFilePath, settings.Language.GetExtension())); } - public sealed class Settings : CommandSettings + public sealed class Settings : CompilerSettings { [Description("The UIB files to decompile.")] [CommandArgument(0, "[inputs]")] public required string[] Inputs { get; init; } - [Description("Directories to search for imported files in.")] - [CommandOption("-I ")] - public required string[] IncludeDirectories { get; init; } - - [Description("A shared binary data table to decompile with.")] - [CommandOption("-t|--dataTable")] - public string? DataTable { get; init; } - - [Description("The directory to output to.")] - [CommandOption("-o|--output ")] - public string? OutputDir { get; init; } - // TODO: Enum options [Description("The language to decompile to.")] [CommandOption("-l|--lang ")] public SourceLanguage Language { get; init; } = SourceLanguage.Asm; - - [CommandOption("--verbose")] - [DefaultValue(false)] - public bool Verbose { get; init; } } } diff --git a/UIXC/CommonSettings.cs b/UIXC/CommonSettings.cs new file mode 100644 index 0000000..4488551 --- /dev/null +++ b/UIXC/CommonSettings.cs @@ -0,0 +1,34 @@ +using Spectre.Console.Cli; +using System.ComponentModel; + +namespace UIXC; + +public abstract class CommonSettings : CommandSettings +{ + [CommandOption("--verbose")] + [DefaultValue(false)] + public bool Verbose { get; init; } +} + +public abstract class CompilerSettings : CommonSettings +{ + [Description("The directory to output to.")] + [CommandOption("-o|--output ")] + public string? OutputDir { get; init; } + + [Description("The shared binary data table to use.")] + [CommandOption("-t|--dataTable")] + public string? DataTable { get; init; } + + [Description("Directories to search for imported files in.")] + [CommandOption("-I ")] + public required string[] IncludeDirectories { get; init; } + + [Description("External assemblies to load.")] + [CommandOption("-A ")] + public required string[] Assemblies { get; init; } + + [Description("Redirects imports.")] + [CommandOption("--ir ")] + public required string[] ImportRedirects { get; init; } +}