authorgravatar for aidenhaledev@gmail.comMrDmitry <aidenhaledev@gmail.com> 2024-01-25 22:03:01-05:00
committergravatar for aidenhaledev@gmail.comMrDmitry <aidenhaledev@gmail.com> 2024-01-26 13:33:17-05:00
log3e6f07e617707ddebab138d9d3208b69b43065eb
tree0e4997db640794013e08fbae89662963e33a2049
parent0307f8771537e01627faa34352b9b4abc3bd073c

Add escaped character processing


3 files changed, 34 insertions(+), 0 deletions(-)

lib/std/Build/Step/ConfigHeader.zig+24
...@@ -633,6 +633,10 @@ fn expand_variables_cmake(...@@ -633,6 +633,10 @@ fn expand_variables_cmake(
633633
634 continue :loop;634 continue :loop;
635 },635 },
636 '\\' => {
637 // backslash is not considered a special character
638 continue :loop;
639 },
636 else => {},640 else => {},
637 }641 }
638642
...@@ -811,3 +815,23 @@ test "expand_variables_cmake edge cases" {...@@ -811,3 +815,23 @@ test "expand_variables_cmake edge cases" {
811 try std.testing.expectError(error.InvalidCharacter, testReplaceVariables(allocator, "${str$ing}", "", values));815 try std.testing.expectError(error.InvalidCharacter, testReplaceVariables(allocator, "${str$ing}", "", values));
812 try std.testing.expectError(error.InvalidCharacter, testReplaceVariables(allocator, "${str@ing}", "", values));816 try std.testing.expectError(error.InvalidCharacter, testReplaceVariables(allocator, "${str@ing}", "", values));
813}817}
818
819test "expand_variables_cmake escaped characters" {
820 const allocator = std.testing.allocator;
821 var values = std.StringArrayHashMap(Value).init(allocator);
822 defer values.deinit();
823
824 try values.putNoClobber("string", Value{ .string = "text" });
825
826 // backslash is an invalid character for @ lookup
827 try testReplaceVariables(allocator, "\\@string\\@", "\\@string\\@", values);
828
829 // backslash is preserved, but doesn't affect ${} variable expansion
830 try testReplaceVariables(allocator, "\\${string}", "\\text", values);
831
832 // backslash breaks ${} opening bracket identification
833 try testReplaceVariables(allocator, "$\\{string}", "$\\{string}", values);
834
835 // backslash is skipped when checking for invalid characters, yet it mangles the key
836 try testReplaceVariables(allocator, "${string\\}", "", values);
837}
test/standalone/cmakedefine/expected_wrapper.h+5
...@@ -28,3 +28,8 @@...@@ -28,3 +28,8 @@
28// becomes `empty`28// becomes `empty`
29#define 29#define
30#define 30#define
31
32#define \@STRING_VAR\@
33#define \${STRING}
34#define $\{STRING_VAR}
35#define
test/standalone/cmakedefine/wrapper.h.in+5
...@@ -28,3 +28,8 @@...@@ -28,3 +28,8 @@
28// becomes `empty`28// becomes `empty`
29#define ${${STRING_VAR}}29#define ${${STRING_VAR}}
30#define ${@STRING_VAR@}30#define ${@STRING_VAR@}
31
32#define \@STRING_VAR\@
33#define \${STRING_VAR}
34#define $\{STRING_VAR}
35#define ${STRING_VAR\}