mirror of
https://github.com/Ellpeck/MLEM.git
synced 2024-11-22 04:53:29 +01:00
Throw an exception when text formatter macros resolve recursively too many times
This commit is contained in:
parent
84e2544dc8
commit
c9c9e566b1
3 changed files with 12 additions and 0 deletions
|
@ -20,6 +20,7 @@ Improvements
|
|||
- Exposed Camera's RoundPosition
|
||||
- Exposed the epsilon value used by Camera
|
||||
- Added Padding.Empty
|
||||
- Throw an exception when text formatter macros resolve recursively too many times
|
||||
|
||||
### MLEM.Ui
|
||||
Additions
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
|
@ -114,6 +115,7 @@ namespace MLEM.Formatting {
|
|||
/// <returns>The final, recursively resolved string</returns>
|
||||
public string ResolveMacros(string s) {
|
||||
// resolve macros that resolve into macros
|
||||
var rec = 0;
|
||||
bool matched;
|
||||
do {
|
||||
matched = false;
|
||||
|
@ -124,6 +126,9 @@ namespace MLEM.Formatting {
|
|||
return macro.Value(this, m, macro.Key);
|
||||
});
|
||||
}
|
||||
rec++;
|
||||
if (rec >= 16)
|
||||
throw new ArithmeticException($"A string resolved macros recursively too many times. Does it contain any conflicting macros?\n{s}");
|
||||
} while (matched);
|
||||
return s;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
@ -107,6 +108,11 @@ namespace Tests {
|
|||
const string strg = "This text uses a bunch of non-breaking~spaces to see if macros work. Additionally, it uses a macro that resolves into a bunch of other macros and then, at the end, into <testmacro> text</c>.";
|
||||
const string goal = "This text uses a bunch of non-breaking\u00A0spaces to see if macros work. Additionally, it uses a macro that resolves into a bunch of other macros and then, at the end, into <c Blue>blue text</c>.";
|
||||
Assert.AreEqual(this.formatter.ResolveMacros(strg), goal);
|
||||
|
||||
// test recursive macros
|
||||
this.formatter.Macros.Add(new Regex("<rec1>"), (f, m, r) => "<rec2>");
|
||||
this.formatter.Macros.Add(new Regex("<rec2>"), (f, m, r) => "<rec1>");
|
||||
Assert.Throws<ArithmeticException>(() => this.formatter.ResolveMacros("Test <rec1> string"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
|
Loading…
Reference in a new issue