Skip to content

Commit 6716481

Browse files
committed
ConfigHeader: update meson escaping behavior to match upstream
1 parent 71e13cb commit 6716481

File tree

1 file changed

+16
-24
lines changed

1 file changed

+16
-24
lines changed

lib/std/Build/Step/ConfigHeader.zig

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -937,7 +937,7 @@ fn expand_variables_meson(
937937
try buffer.appendNTimes('\\', escapes / 2);
938938

939939
// candidate for expansion
940-
if (escapes % 2 == 0) {
940+
if (escapes == 0) {
941941
break;
942942
}
943943

@@ -952,16 +952,13 @@ fn expand_variables_meson(
952952
};
953953

954954
if (contents[valid_varname_end] != '@') {
955-
if (std.mem.indexOfScalarPos(u8, contents, current + 1, '@') != null) {
956-
// return the failed expansion
957-
buffer.clearRetainingCapacity();
958-
try buffer.appendSlice(contents[current .. valid_varname_end + 1]);
959-
return error.InvalidCharacter;
960-
} else {
955+
try buffer.append('@');
956+
prev = current + 1;
957+
current = std.mem.indexOfScalarPos(u8, contents, current + 1, '@') orelse {
961958
// nothing more to expand
962-
try buffer.append('@');
963959
break;
964-
}
960+
};
961+
continue;
965962
}
966963

967964
if (current + 1 == valid_varname_end) {
@@ -1393,10 +1390,6 @@ test "expand_variables_meson simple cases" {
13931390

13941391
// unknown key leads to an error
13951392
try std.testing.expectError(error.MissingValue, testReplaceVariablesMeson(allocator, "@bad@", "", values));
1396-
1397-
// invalid characters lead to an error
1398-
try std.testing.expectError(error.InvalidCharacter, testReplaceVariablesMeson(allocator, "@str*ing@", "", values));
1399-
try std.testing.expectError(error.InvalidCharacter, testReplaceVariablesMeson(allocator, "@str$ing@", "", values));
14001393
}
14011394

14021395
test "expand_variables_meson escapes" {
@@ -1407,27 +1400,26 @@ test "expand_variables_meson escapes" {
14071400
try values.putNoClobber("var0", Value{ .string = "foo" });
14081401
try values.putNoClobber("var1", Value{ .string = "bar" });
14091402

1410-
try testReplaceVariablesMeson(allocator, "\\@var0@", "@var0@", values);
1411-
1412-
// multiple escapes before a @ will be simplified to half as many escapes
1413-
// even numbers of escapes: substitution still happens
1414-
try testReplaceVariablesMeson(allocator, "\\\\@var0@", "\\foo", values);
1415-
try testReplaceVariablesMeson(allocator, "\\\\\\\\@var0@", "\\\\foo", values);
1416-
try testReplaceVariablesMeson(allocator, "\\\\var0", "\\\\var0", values);
1417-
try testReplaceVariablesMeson(allocator, "\\\\\\\\var0", "\\\\\\\\var0", values);
1403+
try testReplaceVariablesMeson(allocator, "\\@var0\\@", "@var0@", values);
14181404

14191405
// multiple escapes before a @ will be simplified to half as many escapes (rounded down)
1420-
// odd numbers of escapes: substitution does not happen
1421-
// 2 escapes followed by a single escape to prevent replacement
1406+
try testReplaceVariablesMeson(allocator, "\\\\@var0@", "\\@var0@", values);
14221407
try testReplaceVariablesMeson(allocator, "\\\\\\@var0@", "\\@var0@", values);
1408+
try testReplaceVariablesMeson(allocator, "\\\\\\\\@var0@", "\\\\@var0@", values);
14231409
try testReplaceVariablesMeson(allocator, "\\\\\\\\\\@var0@", "\\\\@var0@", values);
1410+
1411+
// backslashes not before a @ are kept as-is
1412+
try testReplaceVariablesMeson(allocator, "\\\\var0", "\\\\var0", values);
14241413
try testReplaceVariablesMeson(allocator, "\\\\\\var0", "\\\\\\var0", values);
1425-
try testReplaceVariablesMeson(allocator, "\\\\\\\\\\var0", "\\\\\\\\\\var0", values);
1414+
1415+
// escapes and backslashes
1416+
try testReplaceVariablesMeson(allocator, "\\\\ @ \\\\\\\\@", "\\\\ @ \\\\@", values);
14261417

14271418
// escape doesn't affect later substitutions
14281419
try testReplaceVariablesMeson(allocator, "\\@var0@var1@", "@var0bar", values);
14291420

14301421
// escaping is not required when there is no matching @
1422+
try testReplaceVariablesMeson(allocator, "@var0", "@var0", values);
14311423
try testReplaceVariablesMeson(allocator, "@var0:var1", "@var0:var1", values);
14321424
try testReplaceVariablesMeson(allocator, "prefix @ suffix", "prefix @ suffix", values);
14331425
}

0 commit comments

Comments
 (0)