diff --git a/src/HexManiac.Core/Core/SystemExtensions.cs b/src/HexManiac.Core/Core/SystemExtensions.cs index c45e3ad4..d2eb3bd8 100644 --- a/src/HexManiac.Core/Core/SystemExtensions.cs +++ b/src/HexManiac.Core/Core/SystemExtensions.cs @@ -24,6 +24,12 @@ namespace HavenSoft.HexManiac.Core { return value; } + public static bool TryParseInt(this string str, out int result) { + if (str.StartsWith("0x") && int.TryParse(str.Substring(2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out result)) return true; + if (int.TryParse(str, out result)) return true; + return false; + } + // allows writing 5.Range() instead of Enumerable.Range(0, 5) public static IEnumerable Range(this int count) => Enumerable.Range(0, count); diff --git a/src/HexManiac.Core/Models/Runs/ArrayRun.cs b/src/HexManiac.Core/Models/Runs/ArrayRun.cs index 90d176d7..f27a6bf1 100644 --- a/src/HexManiac.Core/Models/Runs/ArrayRun.cs +++ b/src/HexManiac.Core/Models/Runs/ArrayRun.cs @@ -511,7 +511,7 @@ namespace HavenSoft.HexManiac.Core.Models.Runs { ParentOffset = ParentOffset.Default; ElementCount = Math.Max(1, elementCount); // if the user said there's a format here, then there is, even if the format it wrong. FormatString += ElementCount; - } else if (int.TryParse(length, out int result)) { + } else if (length.TryParseInt(out int result)) { // fixed length is easy LengthFromAnchor = string.Empty; ParentOffset = ParentOffset.Default; diff --git a/src/HexManiac.Core/Models/Runs/ArrayRunElementSegment.cs b/src/HexManiac.Core/Models/Runs/ArrayRunElementSegment.cs index f98c7205..579f3424 100644 --- a/src/HexManiac.Core/Models/Runs/ArrayRunElementSegment.cs +++ b/src/HexManiac.Core/Models/Runs/ArrayRunElementSegment.cs @@ -312,7 +312,7 @@ namespace HavenSoft.HexManiac.Core.Models.Runs { public IEnumerable GetOptions(IDataModel model) => GetOptions(model, EnumName); public static IEnumerable GetOptions(IDataModel model, string enumName) { - if (int.TryParse(enumName, out var result)) return result.Range().Select(i => i.ToString()); + if (enumName.TryParseInt(out var result)) return result.Range().Select(i => i.ToString()); IEnumerable options = model.GetOptions(enumName); // we _need_ options for the table tool diff --git a/src/HexManiac.Tests/TableTests.cs b/src/HexManiac.Tests/TableTests.cs index e9592dae..cc491f08 100644 --- a/src/HexManiac.Tests/TableTests.cs +++ b/src/HexManiac.Tests/TableTests.cs @@ -1126,6 +1126,20 @@ namespace HavenSoft.HexManiac.Tests { Assert.Equal("0, 0,", FileSystem.CopyText.value.Trim()); } + [Fact] + public void TableWithHexLength_Parse_NoError() { + ViewPort.Edit("^table[a:: b::]0x10 "); + Assert.Equal(8 * 16, Model.GetNextRun(0).Length); + } + + [Fact] + public void TableWithHexEnum_Parse_NoErrors() { + ViewPort.Edit("^table[a::0x10 b::]10 "); + var table = Model.GetTable("table"); + var seg = (ArrayRunEnumSegment)table.ElementContent[0]; + Assert.Equal(16, seg.GetOptions(Model).Count()); + } + private void ArrangeTrainerPokemonTeamData(byte structType, byte pokemonCount, int trainerCount) { CreateTextTable(HardcodeTablesModel.PokemonNameTable, 0x180, "ABCDEFGHIJKLMNOP".Select(c => c.ToString()).ToArray()); CreateTextTable(HardcodeTablesModel.MoveNamesTable, 0x1B0, "qrstuvwxyz".Select(c => c.ToString()).ToArray());