@@ -937,7 +937,7 @@ fn expand_variables_meson(
937
937
try buffer .appendNTimes ('\\ ' , escapes / 2 );
938
938
939
939
// candidate for expansion
940
- if (escapes % 2 == 0 ) {
940
+ if (escapes == 0 ) {
941
941
break ;
942
942
}
943
943
@@ -952,16 +952,13 @@ fn expand_variables_meson(
952
952
};
953
953
954
954
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 {
961
958
// nothing more to expand
962
- try buffer .append ('@' );
963
959
break ;
964
- }
960
+ };
961
+ continue ;
965
962
}
966
963
967
964
if (current + 1 == valid_varname_end ) {
@@ -1393,10 +1390,6 @@ test "expand_variables_meson simple cases" {
1393
1390
1394
1391
// unknown key leads to an error
1395
1392
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 ));
1400
1393
}
1401
1394
1402
1395
test "expand_variables_meson escapes" {
@@ -1407,27 +1400,26 @@ test "expand_variables_meson escapes" {
1407
1400
try values .putNoClobber ("var0" , Value { .string = "foo" });
1408
1401
try values .putNoClobber ("var1" , Value { .string = "bar" });
1409
1402
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 );
1418
1404
1419
1405
// 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 );
1422
1407
try testReplaceVariablesMeson (allocator , "\\\\\\ @var0@" , "\\ @var0@" , values );
1408
+ try testReplaceVariablesMeson (allocator , "\\\\\\\\ @var0@" , "\\\\ @var0@" , values );
1423
1409
try testReplaceVariablesMeson (allocator , "\\\\\\\\\\ @var0@" , "\\\\ @var0@" , values );
1410
+
1411
+ // backslashes not before a @ are kept as-is
1412
+ try testReplaceVariablesMeson (allocator , "\\\\ var0" , "\\\\ var0" , values );
1424
1413
try testReplaceVariablesMeson (allocator , "\\\\\\ var0" , "\\\\\\ var0" , values );
1425
- try testReplaceVariablesMeson (allocator , "\\\\\\\\\\ var0" , "\\\\\\\\\\ var0" , values );
1414
+
1415
+ // escapes and backslashes
1416
+ try testReplaceVariablesMeson (allocator , "\\\\ @ \\\\\\\\ @" , "\\\\ @ \\\\ @" , values );
1426
1417
1427
1418
// escape doesn't affect later substitutions
1428
1419
try testReplaceVariablesMeson (allocator , "\\ @var0@var1@" , "@var0bar" , values );
1429
1420
1430
1421
// escaping is not required when there is no matching @
1422
+ try testReplaceVariablesMeson (allocator , "@var0" , "@var0" , values );
1431
1423
try testReplaceVariablesMeson (allocator , "@var0:var1" , "@var0:var1" , values );
1432
1424
try testReplaceVariablesMeson (allocator , "prefix @ suffix" , "prefix @ suffix" , values );
1433
1425
}
0 commit comments