Commit 3e6f07e617

MrDmitry <aidenhaledev@gmail.com>
2024-01-26 04:03:01
Add escaped character processing
1 parent 0307f87
Changed files (3)
lib
std
Build
test
standalone
lib/std/Build/Step/ConfigHeader.zig
@@ -633,6 +633,10 @@ fn expand_variables_cmake(
 
                 continue :loop;
             },
+            '\\' => {
+                // backslash is not considered a special character
+                continue :loop;
+            },
             else => {},
         }
 
@@ -811,3 +815,23 @@ test "expand_variables_cmake edge cases" {
     try std.testing.expectError(error.InvalidCharacter, testReplaceVariables(allocator, "${str$ing}", "", values));
     try std.testing.expectError(error.InvalidCharacter, testReplaceVariables(allocator, "${str@ing}", "", values));
 }
+
+test "expand_variables_cmake escaped characters" {
+    const allocator = std.testing.allocator;
+    var values = std.StringArrayHashMap(Value).init(allocator);
+    defer values.deinit();
+
+    try values.putNoClobber("string", Value{ .string = "text" });
+
+    // backslash is an invalid character for @ lookup
+    try testReplaceVariables(allocator, "\\@string\\@", "\\@string\\@", values);
+
+    // backslash is preserved, but doesn't affect ${} variable expansion
+    try testReplaceVariables(allocator, "\\${string}", "\\text", values);
+
+    // backslash breaks ${} opening bracket identification
+    try testReplaceVariables(allocator, "$\\{string}", "$\\{string}", values);
+
+    // backslash is skipped when checking for invalid characters, yet it mangles the key
+    try testReplaceVariables(allocator, "${string\\}", "", values);
+}
test/standalone/cmakedefine/expected_wrapper.h
@@ -28,3 +28,8 @@
 // becomes `empty`
 #define 
 #define 
+
+#define \@STRING_VAR\@
+#define \${STRING}
+#define $\{STRING_VAR}
+#define 
test/standalone/cmakedefine/wrapper.h.in
@@ -28,3 +28,8 @@
 // becomes `empty`
 #define ${${STRING_VAR}}
 #define ${@STRING_VAR@}
+
+#define \@STRING_VAR\@
+#define \${STRING_VAR}
+#define $\{STRING_VAR}
+#define ${STRING_VAR\}