The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!./perl -w
BEGIN {
chdir ".." if -e "./test.pl";
push @INC, "lib";
}
use strict;
require './t/test.pl';
skip_all("Sorting order differs under EBCDIC") if $::IS_EBCDIC || $::IS_EBCDIC;
use Config;
my %legacy_different = (
# define # string
'VMS_WE_ARE_CASE_SENSITIVE' => 'VMS_SYMBOL_CASE_AS_IS',
'WIN32_NO_REGISTRY' => 'USE_NO_REGISTRY',
);
# As we need to call it direct, we'll take advantage of its result ordering:
my @to_check = qw(bincompat_options non_bincompat_options);
my @file = qw(perl.h perl.c);
my @var = qw(PL_bincompat_options non_bincompat_options);
my @V = map {s/^ //r} Internals::V();
while (my ($index, $sub) = each @to_check) {
my $got = join ' ', sort &{Config->can($sub)}();
is($got, $V[$index], "C source code has $sub in sorted order");
open my $fh, "<", $file[$index]
or die "Failed to open '$file[$index]': $!";
my @strs;
my @define;
while (<$fh>) {
if (/$var[$index]\[\]\s*=/ .. /^\s*"";/) {
if (/ifdef\s+(\w+)/) {
my $name = $1;
# ignore PERL_HASH_ vars as they are handled differently
# from the rest.
$name=~/PERL_HASH_/ and next;
push @define, $name;
}
elsif (/" ([^"]+)"/) {
my $name = $1;
# ignore PERL_HASH_ vars as they are handled differently
# from the rest.
$name=~/PERL_HASH_/ and next;
push @strs, $name;
}
}
}
foreach my $j (0 .. $#strs) {
my $want = $legacy_different{$define[$j]} || $define[$j];
my $str = $strs[$j];
is($strs[$j],$want, "String and define $j are the same ($strs[$j]) for $var[$index] in $file[$index]");
}
my @sorted_strs = sort @strs;
is("@strs","@sorted_strs", "Strings are sorted for $var[$index] in $file[$index]");
}
done_testing();