diff options
Diffstat (limited to 'src/grep/tests')
136 files changed, 10876 insertions, 0 deletions
diff --git a/src/grep/tests/Coreutils.pm b/src/grep/tests/Coreutils.pm new file mode 100644 index 0000000..3bb4d5d --- /dev/null +++ b/src/grep/tests/Coreutils.pm @@ -0,0 +1,620 @@ +package Coreutils; +# This is a testing framework. + +# Copyright (C) 1998-2015, 2017-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +use strict; +use vars qw($VERSION @ISA @EXPORT); + +use FileHandle; +use File::Compare qw(compare); + +@ISA = qw(Exporter); +($VERSION = '$Revision: 1.5 $ ') =~ tr/[0-9].//cd; +@EXPORT = qw (run_tests triple_test getlimits); + +my $debug = $ENV{DEBUG}; + +my @Types = qw (IN IN_PIPE OUT ERR AUX CMP EXIT PRE POST OUT_SUBST + ERR_SUBST ENV ENV_DEL); +my %Types = map {$_ => 1} @Types; +my %Zero_one_type = map {$_ => 1} + qw (OUT ERR EXIT PRE POST OUT_SUBST ERR_SUBST ENV); +my $srcdir = "$ENV{srcdir}"; +my $Global_count = 1; + +# When running in a DJGPP environment, make $ENV{SHELL} point to bash. +# Otherwise, a bad shell might be used (e.g. command.com) and many +# tests would fail. +defined $ENV{DJDIR} + and $ENV{SHELL} = "$ENV{DJDIR}/bin/bash.exe"; + +# A file spec: a scalar or a reference to a single-keyed hash +# ================ +# 'contents' contents only (file name is derived from test name) +# {filename => 'contents'} filename and contents +# {filename => undef} filename only -- $(srcdir)/tests/filename must exist +# +# FIXME: If there is more than one input file, then you can't specify 'REDIR'. +# PIPE is still ok. +# +# I/O spec: a hash ref with the following properties +# ================ +# - one key/value pair +# - the key must be one of these strings: IN, OUT, ERR, AUX, CMP, EXIT +# - the value must be a file spec +# {OUT => 'data'} put data in a temp file and compare it to stdout from cmd +# {OUT => {'filename'=>undef}} compare contents of existing filename to +# stdout from cmd +# {OUT => {'filename'=>[$CTOR, $DTOR]}} $CTOR and $DTOR are references to +# functions, each which is passed the single argument 'filename'. +# $CTOR must create 'filename'. +# DTOR may be omitted in which case 'sub{unlink @_[0]}' is used. +# FIXME: implement this +# {ERR => ...} +# Same as for OUT, but compare with stderr, not stdout. +# {OUT_SUBST => 's/variable_output/expected_output/'} +# Transform actual standard output before comparing it against expected. +# This is useful e.g. for programs like du that produce output that +# varies a lot from system. E.g., an empty file may consume zero file +# blocks, or more, depending on the OS and on the file system type. +# {ERR_SUBST => 's/variable_output/expected_output/'} +# Transform actual stderr output before comparing it against expected. +# This is useful when verifying that we get a meaningful diagnostic. +# For example, in rm/fail-2eperm, we have to account for three different +# diagnostics: Operation not permitted, Not owner, and Permission denied. +# {EXIT => N} expect exit status of cmd to be N +# {ENV => 'VAR=val ...'} +# Prepend 'VAR=val ...' to the command that we execute via 'system'. +# {ENV_DEL => 'VAR'} +# Remove VAR from the environment just before running the corresponding +# command, and restore any value just afterwards. +# +# There may be many input file specs. File names from the input specs +# are concatenated in order on the command line. +# There may be at most one of the OUT-, ERR-, and EXIT-keyed specs. +# If the OUT-(or ERR)-keyed hash ref is omitted, then expect no output +# on stdout (or stderr). +# If the EXIT-keyed one is omitted, then expect the exit status to be zero. + +# FIXME: Make sure that no junkfile is also listed as a +# non-junkfile (i.e., with undef for contents) + +sub _shell_quote ($) +{ + my ($string) = @_; + $string =~ s/\'/\'\\\'\'/g; + return "'$string'"; +} + +sub _create_file ($$$$) +{ + my ($program_name, $test_name, $file_name, $data) = @_; + my $file; + if (defined $file_name) + { + $file = $file_name; + } + else + { + $file = "$test_name.$Global_count"; + ++$Global_count; + } + + warn "creating file '$file' with contents '$data'\n" if $debug; + + # The test spec gave a string. + # Write it to a temp file and return tempfile name. + my $fh = new FileHandle "> $file"; + die "$program_name: $file: $!\n" if ! $fh; + print $fh $data; + $fh->close || die "$program_name: $file: $!\n"; + + return $file; +} + +sub _compare_files ($$$$$) +{ + my ($program_name, $test_name, $in_or_out, $actual, $expected) = @_; + + my $differ = compare ($actual, $expected); + if ($differ) + { + my $info = (defined $in_or_out ? "std$in_or_out " : ''); + warn "$program_name: test $test_name: ${info}mismatch, comparing " + . "$expected (expected) and $actual (actual)\n"; + # Ignore any failure, discard stderr. + system "diff -c $expected $actual 2>/dev/null"; + } + + return $differ; +} + +sub _process_file_spec ($$$$$) +{ + my ($program_name, $test_name, $file_spec, $type, $junk_files) = @_; + + my ($file_name, $contents); + if (!ref $file_spec) + { + ($file_name, $contents) = (undef, $file_spec); + } + elsif (ref $file_spec eq 'HASH') + { + my $n = keys %$file_spec; + die "$program_name: $test_name: $type spec has $n elements --" + . " expected 1\n" + if $n != 1; + ($file_name, $contents) = each %$file_spec; + + # This happens for the AUX hash in an io_spec like this: + # {CMP=> ['zy123utsrqponmlkji', {'@AUX@'=> undef}]}, + defined $contents + or return $file_name; + } + else + { + die "$program_name: $test_name: invalid RHS in $type-spec\n" + } + + my $is_junk_file = (! defined $file_name + || (($type eq 'IN' || $type eq 'AUX' || $type eq 'CMP') + && defined $contents)); + my $file = _create_file ($program_name, $test_name, + $file_name, $contents); + + if ($is_junk_file) + { + push @$junk_files, $file + } + else + { + # FIXME: put $srcdir in here somewhere + warn "$program_name: $test_name: specified file '$file' does" + . " not exist\n" + if ! -f "$srcdir/tests/$file"; + } + + return $file; +} + +sub _at_replace ($$) +{ + my ($map, $s) = @_; + foreach my $eo (qw (AUX OUT ERR)) + { + my $f = $map->{$eo}; + $f + and $s =~ /\@$eo\@/ + and $s =~ s/\@$eo\@/$f/g; + } + return $s; +} + +sub getlimits() +{ + my $NV; + open $NV, "getlimits |" or die "Error running getlimits\n"; + my %limits = map {split /=|\n/} <$NV>; + return \%limits; +} + +# FIXME: cleanup on interrupt +# FIXME: extract 'do_1_test' function + +# FIXME: having to include $program_name here is an expedient kludge. +# Library code doesn't 'die'. +sub run_tests ($$$$$) +{ + my ($program_name, $prog, $t_spec, $save_temps, $verbose) = @_; + + # To indicate that $prog is a shell built-in, you'd make it a string 'ref'. + # E.g., call run_tests ($prog, \$prog, \@Tests, $save_temps, $verbose); + # If it's a ref, invoke it via "env": + my @prog = ref $prog ? (qw(env --), $$prog) : $prog; + + # Warn about empty t_spec. + # FIXME + + # Remove all temp files upon interrupt. + # FIXME + + # Verify that test names are distinct. + my $bad_test_name = 0; + my %seen; + my %seen_8dot3; + my $t; + foreach $t (@$t_spec) + { + my $test_name = $t->[0]; + if ($seen{$test_name}) + { + warn "$program_name: $test_name: duplicate test name\n"; + $bad_test_name = 1; + } + $seen{$test_name} = 1; + + if (0) + { + my $t8 = lc substr $test_name, 0, 8; + if ($seen_8dot3{$t8}) + { + warn "$program_name: 8.3 test name conflict: " + . "$test_name, $seen_8dot3{$t8}\n"; + $bad_test_name = 1; + } + $seen_8dot3{$t8} = $test_name; + } + + # The test name may be no longer than 30 bytes. + # Yes, this is an arbitrary limit. If it causes trouble, + # consider removing it. + my $max = 30; + if ($max < length $test_name) + { + warn "$program_name: $test_name: test name is too long (> $max)\n"; + $bad_test_name = 1; + } + } + return 1 if $bad_test_name; + + # FIXME check exit status + system (@prog, '--version') if $verbose; + + my @junk_files; + my $fail = 0; + foreach my $tt (@$t_spec) + { + my @post_compare; + my @dummy = @$tt; + my $t = \@dummy; + my $test_name = shift @$t; + my $expect = {}; + my ($pre, $post); + + # FIXME: maybe don't reset this. + $Global_count = 1; + my @args; + my $io_spec; + my %seen_type; + my @env_delete; + my $env_prefix = ''; + my $input_pipe_cmd; + foreach $io_spec (@$t) + { + if (!ref $io_spec) + { + push @args, $io_spec; + next; + } + + if (ref $io_spec ne 'HASH') + { + eval 'use Data::Dumper'; + die "$program_name: $test_name: invalid entry in test spec; " + . "expected HASH-ref,\nbut got this:\n" + . Data::Dumper->Dump ([\$io_spec], ['$io_spec']) . "\n"; + } + + my $n = keys %$io_spec; + die "$program_name: $test_name: spec has $n elements --" + . " expected 1\n" + if $n != 1; + my ($type, $val) = each %$io_spec; + die "$program_name: $test_name: invalid key '$type' in test spec\n" + if ! $Types{$type}; + + # Make sure there's no more than one of OUT, ERR, EXIT, etc. + die "$program_name: $test_name: more than one $type spec\n" + if $Zero_one_type{$type} and $seen_type{$type}++; + + if ($type eq 'PRE' or $type eq 'POST') + { + $expect->{$type} = $val; + next; + } + + if ($type eq 'CMP') + { + my $t = ref $val; + $t && $t eq 'ARRAY' + or die "$program_name: $test_name: invalid CMP spec\n"; + @$val == 2 + or die "$program_name: $test_name: invalid CMP list; must have" + . " exactly 2 elements\n"; + my @cmp_files; + foreach my $e (@$val) + { + my $r = ref $e; + $r && $r ne 'HASH' + and die "$program_name: $test_name: invalid element ($r)" + . " in CMP list; only scalars and hash references " + . "are allowed\n"; + if ($r && $r eq 'HASH') + { + my $n = keys %$e; + $n == 1 + or die "$program_name: $test_name: CMP spec has $n " + . "elements -- expected 1\n"; + + # Replace any '@AUX@' in the key of %$e. + my ($ff, $val) = each %$e; + my $new_ff = _at_replace $expect, $ff; + if ($new_ff ne $ff) + { + $e->{$new_ff} = $val; + delete $e->{$ff}; + } + } + my $cmp_file = _process_file_spec ($program_name, $test_name, + $e, $type, \@junk_files); + push @cmp_files, $cmp_file; + } + push @post_compare, [@cmp_files]; + + $expect->{$type} = $val; + next; + } + + if ($type eq 'EXIT') + { + die "$program_name: $test_name: invalid EXIT code\n" + if $val !~ /^\d+$/; + # FIXME: make sure $data is numeric + $expect->{EXIT} = $val; + next; + } + + if ($type =~ /^(OUT|ERR)_SUBST$/) + { + $expect->{RESULT_SUBST} ||= {}; + $expect->{RESULT_SUBST}->{$1} = $val; + next; + } + + if ($type eq 'ENV') + { + $env_prefix = "$val "; + next; + } + + if ($type eq 'ENV_DEL') + { + push @env_delete, $val; + next; + } + + my $file = _process_file_spec ($program_name, $test_name, $val, + $type, \@junk_files); + + if ($type eq 'IN' || $type eq 'IN_PIPE') + { + my $quoted_file = _shell_quote $file; + if ($type eq 'IN_PIPE') + { + defined $input_pipe_cmd + and die "$program_name: $test_name: only one input" + . " may be specified with IN_PIPE\n"; + $input_pipe_cmd = "cat $quoted_file |"; + } + else + { + push @args, $quoted_file; + } + } + elsif ($type eq 'AUX' || $type eq 'OUT' || $type eq 'ERR') + { + $expect->{$type} = $file; + } + else + { + die "$program_name: $test_name: invalid type: $type\n" + } + } + + # Expect an exit status of zero if it's not specified. + $expect->{EXIT} ||= 0; + + # Allow ERR to be omitted -- in that case, expect no error output. + foreach my $eo (qw (OUT ERR)) + { + if (!exists $expect->{$eo}) + { + $expect->{$eo} = _create_file ($program_name, $test_name, + undef, ''); + push @junk_files, $expect->{$eo}; + } + } + + # FIXME: Does it ever make sense to specify a filename *and* contents + # in OUT or ERR spec? + + # FIXME: this is really suboptimal... + my @new_args; + foreach my $a (@args) + { + $a = _at_replace $expect, $a; + push @new_args, $a; + } + @args = @new_args; + + warn "$test_name...\n" if $verbose; + &{$expect->{PRE}} if $expect->{PRE}; + my %actual; + $actual{OUT} = "$test_name.O"; + $actual{ERR} = "$test_name.E"; + push @junk_files, $actual{OUT}, $actual{ERR}; + my @cmd = (@prog, @args, "> $actual{OUT}", "2> $actual{ERR}"); + $env_prefix + and unshift @cmd, $env_prefix; + defined $input_pipe_cmd + and unshift @cmd, $input_pipe_cmd; + my $cmd_str = join (' ', @cmd); + + # Delete from the environment any symbols specified by syntax + # like this: {ENV_DEL => 'TZ'}. + my %pushed_env; + foreach my $env_sym (@env_delete) + { + my $val = delete $ENV{$env_sym}; + defined $val + and $pushed_env{$env_sym} = $val; + } + + warn "Running command: '$cmd_str'\n" if $debug; + my $rc = 0xffff & system $cmd_str; + + # Restore any environment setting we changed via a deletion. + foreach my $env_sym (keys %pushed_env) + { + $ENV{$env_sym} = $pushed_env{$env_sym}; + } + + if ($rc == 0xff00) + { + warn "$program_name: test $test_name failed: command failed:\n" + . " '$cmd_str': $!\n"; + $fail = 1; + goto cleanup; + } + $rc >>= 8 if $rc > 0x80; + if ($expect->{EXIT} != $rc) + { + warn "$program_name: test $test_name failed: exit status mismatch:" + . " expected $expect->{EXIT}, got $rc\n"; + $fail = 1; + goto cleanup; + } + + my %actual_data; + # Record actual stdout and stderr contents, if POST may need them. + if ($expect->{POST}) + { + foreach my $eo (qw (OUT ERR)) + { + my $out_file = $actual{$eo}; + open IN, $out_file + or (warn + "$program_name: cannot open $out_file for reading: $!\n"), + $fail = 1, next; + $actual_data{$eo} = <IN>; + close IN + or (warn "$program_name: failed to read $out_file: $!\n"), + $fail = 1; + } + } + + foreach my $eo (qw (OUT ERR)) + { + my $subst_expr = $expect->{RESULT_SUBST}->{$eo}; + if (defined $subst_expr) + { + my $out = $actual{$eo}; + my $orig = "$out.orig"; + + # Move $out aside (to $orig), then recreate $out + # by transforming each line of $orig via $subst_expr. + rename $out, $orig + or (warn "$program_name: cannot rename $out to $orig: $!\n"), + $fail = 1, next; + open IN, $orig + or (warn "$program_name: cannot open $orig for reading: $!\n"), + $fail = 1, (unlink $orig), next; + unlink $orig + or (warn "$program_name: cannot unlink $orig: $!\n"), + $fail = 1; + open OUT, ">$out" + or (warn "$program_name: cannot open $out for writing: $!\n"), + $fail = 1, next; + while (defined (my $line = <IN>)) + { + eval "\$_ = \$line; $subst_expr; \$line = \$_"; + print OUT $line; + } + close IN; + close OUT + or (warn "$program_name: failed to write $out: $!\n"), + $fail = 1, next; + } + + my $eo_lower = lc $eo; + _compare_files ($program_name, $test_name, $eo_lower, + $actual{$eo}, $expect->{$eo}) + and $fail = 1; + } + + foreach my $pair (@post_compare) + { + my ($expected, $actual) = @$pair; + _compare_files $program_name, $test_name, undef, $actual, $expected + and $fail = 1; + } + + cleanup: + $expect->{POST} + and &{$expect->{POST}} ($actual_data{OUT}, $actual_data{ERR}); + + } + + # FIXME: maybe unlink files inside the big foreach loop? + unlink @junk_files if ! $save_temps; + + return $fail; +} + +# For each test in @$TESTS, generate two additional tests, +# one using stdin, the other using a pipe. I.e., given this one +# ['idem-0', {IN=>''}, {OUT=>''}], +# generate these: +# ['idem-0.r', '<', {IN=>''}, {OUT=>''}], +# ['idem-0.p', {IN_PIPE=>''}, {OUT=>''}], +# Generate new tests only if there is exactly one input spec. +# The returned list of tests contains each input test, followed +# by zero or two derived tests. +sub triple_test($) +{ + my ($tests) = @_; + my @new; + foreach my $t (@$tests) + { + push @new, $t; + + my @in; + my @args; + my @list_of_hash; + foreach my $e (@$t) + { + !ref $e + and push (@args, $e), next; + + ref $e && ref $e eq 'HASH' + or (warn "$0: $t->[0]: unexpected entry type\n"), next; + defined $e->{IN} + and (push @in, $e->{IN}), next; + push @list_of_hash, $e; + } + # Add variants IFF there is exactly one input file. + @in == 1 + or next; + shift @args; # discard test name + push @new, ["$t->[0].r", @args, '<', {IN => $in[0]}, @list_of_hash]; + push @new, ["$t->[0].p", @args, {IN_PIPE => $in[0]}, @list_of_hash]; + } + return @new; +} + +## package return +1; diff --git a/src/grep/tests/CuSkip.pm b/src/grep/tests/CuSkip.pm new file mode 100644 index 0000000..f5fd9f1 --- /dev/null +++ b/src/grep/tests/CuSkip.pm @@ -0,0 +1,39 @@ +package CuSkip; +# Skip a test: emit diag to log and to stderr, and exit 77 + +# Copyright (C) 2011-2015, 2017-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +use strict; +use warnings; + +our $ME = $0 || "<???>"; + +# Emit a diagnostic both to stderr and to $stderr_fileno_. +# FIXME: don't hard-code that value (9), since it's already defined in init.cfg. +sub skip ($) +{ + my ($msg) = @_; + my $stderr_fileno_ = 9; + warn $msg; + open FH, ">&$stderr_fileno_" + or warn "$ME: failed to dup stderr\n"; + print FH $msg; + close FH + or warn "$ME: failed to close FD $stderr_fileno_\n"; + exit 77; +} + +1; diff --git a/src/grep/tests/CuTmpdir.pm b/src/grep/tests/CuTmpdir.pm new file mode 100644 index 0000000..93ecd9b --- /dev/null +++ b/src/grep/tests/CuTmpdir.pm @@ -0,0 +1,111 @@ +package CuTmpdir; +# create, then chdir into a temporary sub-directory + +# Copyright (C) 2007-2015, 2017-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +use strict; +use warnings; + +use File::Temp; +use File::Find; + +our $ME = $0 || "<???>"; + +my $dir; + +sub skip_test($) +{ + warn "$ME: skipping test: unsafe working directory name: '$_[0]'\n"; + exit 77; +} + +sub chmod_1 +{ + my $name = $_; + + # Skip symlinks and non-directories. + -l $name || !-d _ + and return; + + chmod 0700, $name; +} + +sub chmod_tree +{ + # When tempdir fails, it croaks, which leaves $dir undefined. + defined $dir + or return; + + # Perform the equivalent of find "$dir" -type d -print0|xargs -0 chmod -R 700. + my $options = {untaint => 1, wanted => \&chmod_1}; + find ($options, $dir); +} + +sub import { + my $prefix = $_[1]; + + $ME eq '-' && defined $prefix + and $ME = $prefix; + + if ($prefix !~ /^\//) + { + eval 'use Cwd'; + my $cwd = $@ ? '.' : Cwd::getcwd(); + $prefix = "$cwd/$prefix"; + } + + # Untaint for the upcoming mkdir. + $prefix =~ m!^([-+\@\w./]+)$! + or skip_test $prefix; + $prefix = $1; + + my $original_pid = $$; + + my $on_sig_remove_tmpdir = sub { + my ($sig) = @_; + if ($$ == $original_pid and defined $dir) + { + chmod_tree; + # Older versions of File::Temp lack this method. + exists &File::Temp::cleanup + and &File::Temp::cleanup; + } + $SIG{$sig} = 'DEFAULT'; + kill $sig, $$; + }; + + foreach my $sig (qw (INT TERM HUP)) + { + $SIG{$sig} = $on_sig_remove_tmpdir; + } + + $dir = File::Temp::tempdir("$prefix.tmp-XXXX", CLEANUP => 1 ); + chdir $dir + or warn "$ME: failed to chdir to $dir: $!\n"; +} + +END { + # Move cwd out of the directory we're about to remove. + # This is required on some systems, and by some versions of File::Temp. + chdir '..' + or warn "$ME: failed to chdir to .. from $dir: $!\n"; + + my $saved_errno = $?; + chmod_tree; + $? = $saved_errno; +} + +1; diff --git a/src/grep/tests/Makefile.am b/src/grep/tests/Makefile.am new file mode 100644 index 0000000..c84cdc0 --- /dev/null +++ b/src/grep/tests/Makefile.am @@ -0,0 +1,279 @@ +## Process this file with automake to create Makefile.in +# Copyright 1997-1998, 2005-2021 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +TEST_EXTENSIONS = .sh .pl + +if HAVE_PERL +TESTSUITE_PERL = $(PERL) +else +TESTSUITE_PERL = $(SHELL) $(srcdir)/no-perl +endif + +# Options passed to the perl invocations running the perl test scripts. +TESTSUITE_PERL_OPTIONS = -w -I$(srcdir) -MCoreutils -MCuSkip +# '$f' is set by the Automake-generated test harness to the path of the +# current test script stripped of VPATH components, and is used by the +# CuTmpdir module to determine the name of the temporary files to be +# used. Note that $f is a shell variable, not a make macro, so the use +# of '$$f' below is correct, and not a typo. +TESTSUITE_PERL_OPTIONS += -M"CuTmpdir qw($$f)" + +SH_LOG_COMPILER = $(SHELL) +PL_LOG_COMPILER = $(TESTSUITE_PERL) $(TESTSUITE_PERL_OPTIONS) + +check_PROGRAMS = get-mb-cur-max +AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib \ + -I$(top_srcdir)/src +AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) + +# Tell the linker to omit references to unused shared libraries. +AM_LDFLAGS = $(IGNORE_UNUSED_LIBRARIES_CFLAGS) +LDADD = ../lib/libgreputils.a $(LIBINTL) ../lib/libgreputils.a + +# The triple-backref test is expected to fail with both the system +# matcher (i.e., with glibc) and with the included matcher. +# Both matchers need to be fixed. +# FIXME-2015: Remove this once the glibc and gnulib bugs are fixed. +XFAIL_TESTS = triple-backref + +# Equivalence classes are only supported when using the system +# matcher (which means only with glibc). +# The included matcher needs to be fixed. +# FIXME-2015: Remove this once the gnulib bug is fixed. +if USE_INCLUDED_REGEX +XFAIL_TESTS += equiv-classes +else +# The backref-alt test fails for glibc 2.27 and earlier. +# If you're using older glibc you can upgrade to glibc 2.28 or later, +# configure --with-included-regex, or ignore the test failure. +endif + +TESTS = \ + backref \ + backref-alt \ + backref-multibyte-slow \ + backref-word \ + backslash-dot \ + backslash-s-and-repetition-operators \ + backslash-s-vs-invalid-multibyte \ + big-hole \ + big-match \ + binary-file-matches \ + bogus-wctob \ + bre \ + c-locale \ + case-fold-backref \ + case-fold-backslash-w \ + case-fold-char-class \ + case-fold-char-range \ + case-fold-char-type \ + case-fold-titlecase \ + char-class-multibyte \ + char-class-multibyte2 \ + context-0 \ + count-newline \ + dfa-coverage \ + dfa-heap-overrun \ + dfa-infloop \ + dfa-invalid-utf8 \ + dfaexec-multibyte \ + empty \ + empty-line \ + empty-line-mb \ + encoding-error \ + epipe \ + equiv-classes \ + ere \ + euc-mb \ + false-match-mb-non-utf8 \ + fedora \ + fgrep-infloop \ + fgrep-longest \ + file \ + filename-lineno.pl \ + fmbtest \ + foad1 \ + grep-dev-null \ + grep-dev-null-out \ + grep-dir \ + hash-collision-perf \ + help-version \ + high-bit-range \ + in-eq-out-infloop \ + include-exclude \ + inconsistent-range \ + initial-tab \ + invalid-multibyte-infloop \ + khadafy \ + kwset-abuse \ + long-line-vs-2GiB-read \ + long-pattern-perf \ + many-regex-performance \ + match-lines \ + max-count-overread \ + max-count-vs-context \ + mb-dot-newline \ + mb-non-UTF8-overrun \ + mb-non-UTF8-perf-Fw \ + mb-non-UTF8-performance \ + mb-non-UTF8-word-boundary \ + multibyte-white-space \ + multiple-begin-or-end-line \ + null-byte \ + options \ + pcre \ + pcre-abort \ + pcre-context \ + pcre-count \ + pcre-infloop \ + pcre-invalid-utf8-infloop \ + pcre-invalid-utf8-input \ + pcre-jitstack \ + pcre-o \ + pcre-utf8 \ + pcre-w \ + pcre-wx-backref \ + pcre-z \ + posix-bracket \ + prefix-of-multibyte \ + proc \ + r-dot \ + repetition-overflow \ + reversed-range-endpoints \ + sjis-mb \ + skip-device \ + skip-read \ + spencer1 \ + spencer1-locale \ + stack-overflow \ + status \ + surrogate-pair \ + symlink \ + triple-backref \ + turkish-I \ + turkish-I-without-dot \ + turkish-eyes \ + two-chars \ + two-files \ + unibyte-binary \ + unibyte-bracket-expr \ + unibyte-negated-circumflex \ + utf8-bracket \ + warn-char-classes \ + word-delim-multibyte \ + word-multi-file \ + word-multibyte \ + write-error-msg \ + yesno \ + z-anchor-newline + +EXTRA_DIST = \ + $(TESTS) \ + bre.awk \ + bre.tests \ + Coreutils.pm \ + CuSkip.pm \ + CuTmpdir.pm \ + envvar-check \ + ere.awk \ + ere.tests \ + init.cfg \ + init.sh \ + khadafy.lines \ + khadafy.regexp \ + no-perl \ + spencer1.awk \ + spencer1.tests \ + spencer1-locale.awk + +# Default to a nonzero value. Environment overrides. +# https://udrepper.livejournal.com/11429.html +MALLOC_PERTURB_ = 1 + +TESTS_ENVIRONMENT = \ + tmp__=$${TMPDIR-/tmp}; \ + test -d "$$tmp__" && test -w "$$tmp__" || tmp__=.; \ + . $(srcdir)/envvar-check; \ + TMPDIR=$$tmp__; export TMPDIR; \ + \ + if test -n "$$BASH_VERSION" || (eval "export v=x") 2>/dev/null; then \ + export_with_values () { export "$$@"; }; \ + else \ + export_with_values () \ + { \ + sed_extract_var='s/=.*//'; \ + sed_quote_value="s/'/'\\\\''/g;s/=\\(.*\\)/='\\1'/";\ + for arg in "$$@"; do \ + var=`echo "$$arg" | sed "$$sed_extract_var"`; \ + arg=`echo "$$arg" | sed "$$sed_quote_value"`; \ + eval "$$arg"; \ + export "$$var"; \ + done; \ + }; \ + fi; \ + \ + : 'Test egrep/fgrep help if they use our grep.'; \ + grep=`echo grep | sed -e '$(transform)'` || exit; \ + if test "$$grep" = grep; then \ + built_programs='grep egrep fgrep'; \ + else \ + built_programs='grep'; \ + fi; \ + \ + export_with_values \ + VERSION='$(VERSION)' \ + LOCALE_FR='$(LOCALE_FR)' \ + LOCALE_FR_UTF8='$(LOCALE_FR_UTF8)' \ + AWK=$(AWK) \ + LC_ALL=C \ + abs_top_builddir='$(abs_top_builddir)' \ + abs_top_srcdir='$(abs_top_srcdir)' \ + abs_srcdir='$(abs_srcdir)' \ + built_programs="$$built_programs" \ + host_triplet='$(host_triplet)' \ + srcdir='$(srcdir)' \ + top_srcdir='$(top_srcdir)' \ + CC='$(CC)' \ + GREP_TEST_NAME=`echo $$tst|sed 's,^\./,,;s,/,-,g'` \ + MAKE=$(MAKE) \ + MALLOC_PERTURB_=$(MALLOC_PERTURB_) \ + PACKAGE_BUGREPORT='$(PACKAGE_BUGREPORT)' \ + PACKAGE_VERSION=$(PACKAGE_VERSION) \ + PERL='$(PERL)' \ + SHELL='$(SHELL)' \ + PATH='$(abs_top_builddir)/src$(PATH_SEPARATOR)'"$$PATH" \ + ; \ + \ + : 'set this envvar to indicate whether -P works'; \ + m=0; if err=`echo .|grep -Pq . 2>&1`; then \ + test -z "$$err" && m=1; fi; \ + export PCRE_WORKS=$$m; \ + 9>&2 + +LOG_COMPILER = $(SHELL) + +VERBOSE = yes + +check: check_executable_TESTS +.PHONY: check_executable_TESTS +check_executable_TESTS: Makefile + $(AM_V_GEN)fail=0; \ + cd $(srcdir) && for i in $(TESTS); do \ + test -x $$i || { fail=1; echo $$i >&2; }; \ + done; \ + test $$fail = 1 \ + && { echo the above test scripts are not executable >&2; exit 1; } \ + || : diff --git a/src/grep/tests/Makefile.in b/src/grep/tests/Makefile.in new file mode 100644 index 0000000..bc124db --- /dev/null +++ b/src/grep/tests/Makefile.in @@ -0,0 +1,3299 @@ +# Makefile.in generated by automake 1.16d from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright 1997-1998, 2005-2021 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +check_PROGRAMS = get-mb-cur-max$(EXEEXT) + +# Equivalence classes are only supported when using the system +# matcher (which means only with glibc). +# The included matcher needs to be fixed. +# FIXME-2015: Remove this once the gnulib bug is fixed. +@USE_INCLUDED_REGEX_TRUE@am__append_1 = equiv-classes +subdir = tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \ + $(top_srcdir)/m4/__inline.m4 \ + $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/alloca.m4 \ + $(top_srcdir)/m4/arpa_inet_h.m4 \ + $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/assert.m4 \ + $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \ + $(top_srcdir)/m4/c-stack.m4 $(top_srcdir)/m4/calloc.m4 \ + $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/close.m4 \ + $(top_srcdir)/m4/closedir.m4 $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/configmake.m4 $(top_srcdir)/m4/ctype_h.m4 \ + $(top_srcdir)/m4/cycle-check.m4 $(top_srcdir)/m4/d-ino.m4 \ + $(top_srcdir)/m4/d-type.m4 $(top_srcdir)/m4/dirent_h.m4 \ + $(top_srcdir)/m4/dirfd.m4 \ + $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \ + $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eealloc.m4 \ + $(top_srcdir)/m4/environ.m4 $(top_srcdir)/m4/errno_h.m4 \ + $(top_srcdir)/m4/error.m4 $(top_srcdir)/m4/exponentd.m4 \ + $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/extern-inline.m4 $(top_srcdir)/m4/fchdir.m4 \ + $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl-safer.m4 \ + $(top_srcdir)/m4/fcntl.m4 $(top_srcdir)/m4/fcntl_h.m4 \ + $(top_srcdir)/m4/fdopen.m4 $(top_srcdir)/m4/fdopendir.m4 \ + $(top_srcdir)/m4/filenamecat.m4 $(top_srcdir)/m4/flexmember.m4 \ + $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/fnmatch.m4 \ + $(top_srcdir)/m4/fnmatch_h.m4 $(top_srcdir)/m4/fopen.m4 \ + $(top_srcdir)/m4/fpending.m4 $(top_srcdir)/m4/fpieee.m4 \ + $(top_srcdir)/m4/free.m4 $(top_srcdir)/m4/fstat.m4 \ + $(top_srcdir)/m4/fstatat.m4 $(top_srcdir)/m4/ftruncate.m4 \ + $(top_srcdir)/m4/fts.m4 $(top_srcdir)/m4/getcwd.m4 \ + $(top_srcdir)/m4/getdtablesize.m4 $(top_srcdir)/m4/getopt.m4 \ + $(top_srcdir)/m4/getpagesize.m4 \ + $(top_srcdir)/m4/getprogname.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gettimeofday.m4 \ + $(top_srcdir)/m4/gnulib-common.m4 \ + $(top_srcdir)/m4/gnulib-comp.m4 \ + $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/i-ring.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \ + $(top_srcdir)/m4/iconv_open.m4 \ + $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_pton.m4 \ + $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intl-thread-locale.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax_t.m4 \ + $(top_srcdir)/m4/inttostr.m4 $(top_srcdir)/m4/inttypes.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \ + $(top_srcdir)/m4/isatty.m4 $(top_srcdir)/m4/isblank.m4 \ + $(top_srcdir)/m4/iswblank.m4 $(top_srcdir)/m4/iswctype.m4 \ + $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \ + $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \ + $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libsigsegv.m4 \ + $(top_srcdir)/m4/libunistring-base.m4 \ + $(top_srcdir)/m4/limits-h.m4 $(top_srcdir)/m4/localcharset.m4 \ + $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \ + $(top_srcdir)/m4/locale-tr.m4 $(top_srcdir)/m4/locale-zh.m4 \ + $(top_srcdir)/m4/locale_h.m4 $(top_srcdir)/m4/localeconv.m4 \ + $(top_srcdir)/m4/localename.m4 $(top_srcdir)/m4/lock.m4 \ + $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \ + $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ + $(top_srcdir)/m4/manywarnings.m4 $(top_srcdir)/m4/mbchar.m4 \ + $(top_srcdir)/m4/mbiter.m4 $(top_srcdir)/m4/mbrlen.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \ + $(top_srcdir)/m4/mbslen.m4 $(top_srcdir)/m4/mbsrtowcs.m4 \ + $(top_srcdir)/m4/mbstate_t.m4 $(top_srcdir)/m4/mbtowc.m4 \ + $(top_srcdir)/m4/memchr.m4 $(top_srcdir)/m4/mempcpy.m4 \ + $(top_srcdir)/m4/memrchr.m4 $(top_srcdir)/m4/minmax.m4 \ + $(top_srcdir)/m4/mmap-anon.m4 $(top_srcdir)/m4/mode_t.m4 \ + $(top_srcdir)/m4/msvc-inval.m4 \ + $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \ + $(top_srcdir)/m4/musl.m4 $(top_srcdir)/m4/nanosleep.m4 \ + $(top_srcdir)/m4/netinet_in_h.m4 \ + $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/obstack.m4 \ + $(top_srcdir)/m4/off_t.m4 $(top_srcdir)/m4/open-cloexec.m4 \ + $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \ + $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \ + $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pcre.m4 \ + $(top_srcdir)/m4/perl.m4 $(top_srcdir)/m4/perror.m4 \ + $(top_srcdir)/m4/pipe.m4 $(top_srcdir)/m4/pkg.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf.m4 \ + $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/pthread-thread.m4 \ + $(top_srcdir)/m4/pthread_h.m4 \ + $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \ + $(top_srcdir)/m4/pthread_sigmask.m4 $(top_srcdir)/m4/putenv.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \ + $(top_srcdir)/m4/read.m4 $(top_srcdir)/m4/readdir.m4 \ + $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/reallocarray.m4 \ + $(top_srcdir)/m4/regex.m4 $(top_srcdir)/m4/safe-read.m4 \ + $(top_srcdir)/m4/save-cwd.m4 $(top_srcdir)/m4/sched_h.m4 \ + $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/setenv.m4 \ + $(top_srcdir)/m4/setlocale.m4 \ + $(top_srcdir)/m4/setlocale_null.m4 \ + $(top_srcdir)/m4/sigaction.m4 $(top_srcdir)/m4/sigaltstack.m4 \ + $(top_srcdir)/m4/signal_h.m4 \ + $(top_srcdir)/m4/signalblocking.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/sleep.m4 \ + $(top_srcdir)/m4/snprintf.m4 $(top_srcdir)/m4/socketlib.m4 \ + $(top_srcdir)/m4/sockets.m4 $(top_srcdir)/m4/socklen.m4 \ + $(top_srcdir)/m4/sockpfaf.m4 $(top_srcdir)/m4/ssize_t.m4 \ + $(top_srcdir)/m4/stack-direction.m4 \ + $(top_srcdir)/m4/stat-time.m4 $(top_srcdir)/m4/stat.m4 \ + $(top_srcdir)/m4/stdalign.m4 $(top_srcdir)/m4/stdarg.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \ + $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \ + $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strdup.m4 \ + $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \ + $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/strstr.m4 $(top_srcdir)/m4/strtoimax.m4 \ + $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/strtoull.m4 \ + $(top_srcdir)/m4/strtoumax.m4 $(top_srcdir)/m4/symlink.m4 \ + $(top_srcdir)/m4/sys_ioctl_h.m4 \ + $(top_srcdir)/m4/sys_select_h.m4 \ + $(top_srcdir)/m4/sys_socket_h.m4 \ + $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \ + $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \ + $(top_srcdir)/m4/thread.m4 $(top_srcdir)/m4/threadlib.m4 \ + $(top_srcdir)/m4/time_h.m4 $(top_srcdir)/m4/unistd-safer.m4 \ + $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlocked-io.m4 \ + $(top_srcdir)/m4/vasnprintf.m4 $(top_srcdir)/m4/version-etc.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/warn-on-use.m4 \ + $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \ + $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \ + $(top_srcdir)/m4/wctob.m4 $(top_srcdir)/m4/wctomb.m4 \ + $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \ + $(top_srcdir)/m4/windows-stat-inodes.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \ + $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/xalloc.m4 \ + $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/m4/xstrtol.m4 \ + $(top_srcdir)/m4/year2038.m4 $(top_srcdir)/m4/zzgnulib.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +get_mb_cur_max_SOURCES = get-mb-cur-max.c +get_mb_cur_max_OBJECTS = get-mb-cur-max.$(OBJEXT) +get_mb_cur_max_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +get_mb_cur_max_DEPENDENCIES = ../lib/libgreputils.a \ + $(am__DEPENDENCIES_1) ../lib/libgreputils.a +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/get-mb-cur-max.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = get-mb-cur-max.c +DIST_SOURCES = get-mb-cur-max.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red='[0;31m'; \ + grn='[0;32m'; \ + lgn='[1;32m'; \ + blu='[1;34m'; \ + mgn='[0;35m'; \ + brg='[1m'; \ + std='[m'; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +am__test_logs3 = $(am__test_logs2:.sh.log=.log) +SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver +SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS) +TEST_LOGS = $(am__test_logs3:.pl.log=.log) +PL_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver +PL_LOG_COMPILE = $(PL_LOG_COMPILER) $(AM_PL_LOG_FLAGS) $(PL_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/build-aux/depcomp \ + $(top_srcdir)/build-aux/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +pkglibexecdir = @pkglibexecdir@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@ +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@ +BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@ +BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@ +BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@ +BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +COLORIZE_SOURCE = @COLORIZE_SOURCE@ +CONFIG_INCLUDE = @CONFIG_INCLUDE@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@ +EMULTIHOP_VALUE = @EMULTIHOP_VALUE@ +ENOLINK_HIDDEN = @ENOLINK_HIDDEN@ +ENOLINK_VALUE = @ENOLINK_VALUE@ +EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@ +EOVERFLOW_VALUE = @EOVERFLOW_VALUE@ +ERRNO_H = @ERRNO_H@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FLOAT_H = @FLOAT_H@ +FNMATCH_H = @FNMATCH_H@ +GETOPT_CDEFS_H = @GETOPT_CDEFS_H@ +GETOPT_H = @GETOPT_H@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GL_CFLAG_ALLOW_WARNINGS = @GL_CFLAG_ALLOW_WARNINGS@ +GL_CXXFLAG_ALLOW_WARNINGS = @GL_CXXFLAG_ALLOW_WARNINGS@ +GL_GNULIB_ACCEPT = @GL_GNULIB_ACCEPT@ +GL_GNULIB_ACCEPT4 = @GL_GNULIB_ACCEPT4@ +GL_GNULIB_ACCESS = @GL_GNULIB_ACCESS@ +GL_GNULIB_ALIGNED_ALLOC = @GL_GNULIB_ALIGNED_ALLOC@ +GL_GNULIB_ALPHASORT = @GL_GNULIB_ALPHASORT@ +GL_GNULIB_ATOLL = @GL_GNULIB_ATOLL@ +GL_GNULIB_BIND = @GL_GNULIB_BIND@ +GL_GNULIB_BTOWC = @GL_GNULIB_BTOWC@ +GL_GNULIB_CALLOC_POSIX = @GL_GNULIB_CALLOC_POSIX@ +GL_GNULIB_CANONICALIZE_FILE_NAME = @GL_GNULIB_CANONICALIZE_FILE_NAME@ +GL_GNULIB_CHDIR = @GL_GNULIB_CHDIR@ +GL_GNULIB_CHOWN = @GL_GNULIB_CHOWN@ +GL_GNULIB_CLOSE = @GL_GNULIB_CLOSE@ +GL_GNULIB_CLOSEDIR = @GL_GNULIB_CLOSEDIR@ +GL_GNULIB_CONNECT = @GL_GNULIB_CONNECT@ +GL_GNULIB_COPY_FILE_RANGE = @GL_GNULIB_COPY_FILE_RANGE@ +GL_GNULIB_CREAT = @GL_GNULIB_CREAT@ +GL_GNULIB_CTIME = @GL_GNULIB_CTIME@ +GL_GNULIB_DIRFD = @GL_GNULIB_DIRFD@ +GL_GNULIB_DPRINTF = @GL_GNULIB_DPRINTF@ +GL_GNULIB_DUP = @GL_GNULIB_DUP@ +GL_GNULIB_DUP2 = @GL_GNULIB_DUP2@ +GL_GNULIB_DUP3 = @GL_GNULIB_DUP3@ +GL_GNULIB_DUPLOCALE = @GL_GNULIB_DUPLOCALE@ +GL_GNULIB_ENVIRON = @GL_GNULIB_ENVIRON@ +GL_GNULIB_EUIDACCESS = @GL_GNULIB_EUIDACCESS@ +GL_GNULIB_EXECL = @GL_GNULIB_EXECL@ +GL_GNULIB_EXECLE = @GL_GNULIB_EXECLE@ +GL_GNULIB_EXECLP = @GL_GNULIB_EXECLP@ +GL_GNULIB_EXECV = @GL_GNULIB_EXECV@ +GL_GNULIB_EXECVE = @GL_GNULIB_EXECVE@ +GL_GNULIB_EXECVP = @GL_GNULIB_EXECVP@ +GL_GNULIB_EXECVPE = @GL_GNULIB_EXECVPE@ +GL_GNULIB_EXPLICIT_BZERO = @GL_GNULIB_EXPLICIT_BZERO@ +GL_GNULIB_FACCESSAT = @GL_GNULIB_FACCESSAT@ +GL_GNULIB_FCHDIR = @GL_GNULIB_FCHDIR@ +GL_GNULIB_FCHMODAT = @GL_GNULIB_FCHMODAT@ +GL_GNULIB_FCHOWNAT = @GL_GNULIB_FCHOWNAT@ +GL_GNULIB_FCLOSE = @GL_GNULIB_FCLOSE@ +GL_GNULIB_FCNTL = @GL_GNULIB_FCNTL@ +GL_GNULIB_FDATASYNC = @GL_GNULIB_FDATASYNC@ +GL_GNULIB_FDOPEN = @GL_GNULIB_FDOPEN@ +GL_GNULIB_FDOPENDIR = @GL_GNULIB_FDOPENDIR@ +GL_GNULIB_FFLUSH = @GL_GNULIB_FFLUSH@ +GL_GNULIB_FFSL = @GL_GNULIB_FFSL@ +GL_GNULIB_FFSLL = @GL_GNULIB_FFSLL@ +GL_GNULIB_FGETC = @GL_GNULIB_FGETC@ +GL_GNULIB_FGETS = @GL_GNULIB_FGETS@ +GL_GNULIB_FNMATCH = @GL_GNULIB_FNMATCH@ +GL_GNULIB_FOPEN = @GL_GNULIB_FOPEN@ +GL_GNULIB_FPRINTF = @GL_GNULIB_FPRINTF@ +GL_GNULIB_FPRINTF_POSIX = @GL_GNULIB_FPRINTF_POSIX@ +GL_GNULIB_FPURGE = @GL_GNULIB_FPURGE@ +GL_GNULIB_FPUTC = @GL_GNULIB_FPUTC@ +GL_GNULIB_FPUTS = @GL_GNULIB_FPUTS@ +GL_GNULIB_FREAD = @GL_GNULIB_FREAD@ +GL_GNULIB_FREE_POSIX = @GL_GNULIB_FREE_POSIX@ +GL_GNULIB_FREOPEN = @GL_GNULIB_FREOPEN@ +GL_GNULIB_FSCANF = @GL_GNULIB_FSCANF@ +GL_GNULIB_FSEEK = @GL_GNULIB_FSEEK@ +GL_GNULIB_FSEEKO = @GL_GNULIB_FSEEKO@ +GL_GNULIB_FSTAT = @GL_GNULIB_FSTAT@ +GL_GNULIB_FSTATAT = @GL_GNULIB_FSTATAT@ +GL_GNULIB_FSYNC = @GL_GNULIB_FSYNC@ +GL_GNULIB_FTELL = @GL_GNULIB_FTELL@ +GL_GNULIB_FTELLO = @GL_GNULIB_FTELLO@ +GL_GNULIB_FTRUNCATE = @GL_GNULIB_FTRUNCATE@ +GL_GNULIB_FUTIMENS = @GL_GNULIB_FUTIMENS@ +GL_GNULIB_FWRITE = @GL_GNULIB_FWRITE@ +GL_GNULIB_GETC = @GL_GNULIB_GETC@ +GL_GNULIB_GETCHAR = @GL_GNULIB_GETCHAR@ +GL_GNULIB_GETCWD = @GL_GNULIB_GETCWD@ +GL_GNULIB_GETDELIM = @GL_GNULIB_GETDELIM@ +GL_GNULIB_GETDOMAINNAME = @GL_GNULIB_GETDOMAINNAME@ +GL_GNULIB_GETDTABLESIZE = @GL_GNULIB_GETDTABLESIZE@ +GL_GNULIB_GETENTROPY = @GL_GNULIB_GETENTROPY@ +GL_GNULIB_GETGROUPS = @GL_GNULIB_GETGROUPS@ +GL_GNULIB_GETHOSTNAME = @GL_GNULIB_GETHOSTNAME@ +GL_GNULIB_GETLINE = @GL_GNULIB_GETLINE@ +GL_GNULIB_GETLOADAVG = @GL_GNULIB_GETLOADAVG@ +GL_GNULIB_GETLOGIN = @GL_GNULIB_GETLOGIN@ +GL_GNULIB_GETLOGIN_R = @GL_GNULIB_GETLOGIN_R@ +GL_GNULIB_GETOPT_POSIX = @GL_GNULIB_GETOPT_POSIX@ +GL_GNULIB_GETPAGESIZE = @GL_GNULIB_GETPAGESIZE@ +GL_GNULIB_GETPASS = @GL_GNULIB_GETPASS@ +GL_GNULIB_GETPEERNAME = @GL_GNULIB_GETPEERNAME@ +GL_GNULIB_GETSOCKNAME = @GL_GNULIB_GETSOCKNAME@ +GL_GNULIB_GETSOCKOPT = @GL_GNULIB_GETSOCKOPT@ +GL_GNULIB_GETSUBOPT = @GL_GNULIB_GETSUBOPT@ +GL_GNULIB_GETTIMEOFDAY = @GL_GNULIB_GETTIMEOFDAY@ +GL_GNULIB_GETUMASK = @GL_GNULIB_GETUMASK@ +GL_GNULIB_GETUSERSHELL = @GL_GNULIB_GETUSERSHELL@ +GL_GNULIB_GRANTPT = @GL_GNULIB_GRANTPT@ +GL_GNULIB_GROUP_MEMBER = @GL_GNULIB_GROUP_MEMBER@ +GL_GNULIB_ICONV = @GL_GNULIB_ICONV@ +GL_GNULIB_IMAXABS = @GL_GNULIB_IMAXABS@ +GL_GNULIB_IMAXDIV = @GL_GNULIB_IMAXDIV@ +GL_GNULIB_INET_NTOP = @GL_GNULIB_INET_NTOP@ +GL_GNULIB_INET_PTON = @GL_GNULIB_INET_PTON@ +GL_GNULIB_IOCTL = @GL_GNULIB_IOCTL@ +GL_GNULIB_ISATTY = @GL_GNULIB_ISATTY@ +GL_GNULIB_ISBLANK = @GL_GNULIB_ISBLANK@ +GL_GNULIB_ISWBLANK = @GL_GNULIB_ISWBLANK@ +GL_GNULIB_ISWCTYPE = @GL_GNULIB_ISWCTYPE@ +GL_GNULIB_ISWDIGIT = @GL_GNULIB_ISWDIGIT@ +GL_GNULIB_ISWXDIGIT = @GL_GNULIB_ISWXDIGIT@ +GL_GNULIB_LCHMOD = @GL_GNULIB_LCHMOD@ +GL_GNULIB_LCHOWN = @GL_GNULIB_LCHOWN@ +GL_GNULIB_LINK = @GL_GNULIB_LINK@ +GL_GNULIB_LINKAT = @GL_GNULIB_LINKAT@ +GL_GNULIB_LISTEN = @GL_GNULIB_LISTEN@ +GL_GNULIB_LOCALECONV = @GL_GNULIB_LOCALECONV@ +GL_GNULIB_LOCALENAME = @GL_GNULIB_LOCALENAME@ +GL_GNULIB_LOCALTIME = @GL_GNULIB_LOCALTIME@ +GL_GNULIB_LSEEK = @GL_GNULIB_LSEEK@ +GL_GNULIB_LSTAT = @GL_GNULIB_LSTAT@ +GL_GNULIB_MALLOC_POSIX = @GL_GNULIB_MALLOC_POSIX@ +GL_GNULIB_MBRLEN = @GL_GNULIB_MBRLEN@ +GL_GNULIB_MBRTOWC = @GL_GNULIB_MBRTOWC@ +GL_GNULIB_MBSCASECMP = @GL_GNULIB_MBSCASECMP@ +GL_GNULIB_MBSCASESTR = @GL_GNULIB_MBSCASESTR@ +GL_GNULIB_MBSCHR = @GL_GNULIB_MBSCHR@ +GL_GNULIB_MBSCSPN = @GL_GNULIB_MBSCSPN@ +GL_GNULIB_MBSINIT = @GL_GNULIB_MBSINIT@ +GL_GNULIB_MBSLEN = @GL_GNULIB_MBSLEN@ +GL_GNULIB_MBSNCASECMP = @GL_GNULIB_MBSNCASECMP@ +GL_GNULIB_MBSNLEN = @GL_GNULIB_MBSNLEN@ +GL_GNULIB_MBSNRTOWCS = @GL_GNULIB_MBSNRTOWCS@ +GL_GNULIB_MBSPBRK = @GL_GNULIB_MBSPBRK@ +GL_GNULIB_MBSPCASECMP = @GL_GNULIB_MBSPCASECMP@ +GL_GNULIB_MBSRCHR = @GL_GNULIB_MBSRCHR@ +GL_GNULIB_MBSRTOWCS = @GL_GNULIB_MBSRTOWCS@ +GL_GNULIB_MBSSEP = @GL_GNULIB_MBSSEP@ +GL_GNULIB_MBSSPN = @GL_GNULIB_MBSSPN@ +GL_GNULIB_MBSSTR = @GL_GNULIB_MBSSTR@ +GL_GNULIB_MBSTOK_R = @GL_GNULIB_MBSTOK_R@ +GL_GNULIB_MBTOWC = @GL_GNULIB_MBTOWC@ +GL_GNULIB_MDA_ACCESS = @GL_GNULIB_MDA_ACCESS@ +GL_GNULIB_MDA_CHDIR = @GL_GNULIB_MDA_CHDIR@ +GL_GNULIB_MDA_CHMOD = @GL_GNULIB_MDA_CHMOD@ +GL_GNULIB_MDA_CLOSE = @GL_GNULIB_MDA_CLOSE@ +GL_GNULIB_MDA_CREAT = @GL_GNULIB_MDA_CREAT@ +GL_GNULIB_MDA_DUP = @GL_GNULIB_MDA_DUP@ +GL_GNULIB_MDA_DUP2 = @GL_GNULIB_MDA_DUP2@ +GL_GNULIB_MDA_ECVT = @GL_GNULIB_MDA_ECVT@ +GL_GNULIB_MDA_EXECL = @GL_GNULIB_MDA_EXECL@ +GL_GNULIB_MDA_EXECLE = @GL_GNULIB_MDA_EXECLE@ +GL_GNULIB_MDA_EXECLP = @GL_GNULIB_MDA_EXECLP@ +GL_GNULIB_MDA_EXECV = @GL_GNULIB_MDA_EXECV@ +GL_GNULIB_MDA_EXECVE = @GL_GNULIB_MDA_EXECVE@ +GL_GNULIB_MDA_EXECVP = @GL_GNULIB_MDA_EXECVP@ +GL_GNULIB_MDA_EXECVPE = @GL_GNULIB_MDA_EXECVPE@ +GL_GNULIB_MDA_FCLOSEALL = @GL_GNULIB_MDA_FCLOSEALL@ +GL_GNULIB_MDA_FCVT = @GL_GNULIB_MDA_FCVT@ +GL_GNULIB_MDA_FDOPEN = @GL_GNULIB_MDA_FDOPEN@ +GL_GNULIB_MDA_FILENO = @GL_GNULIB_MDA_FILENO@ +GL_GNULIB_MDA_GCVT = @GL_GNULIB_MDA_GCVT@ +GL_GNULIB_MDA_GETCWD = @GL_GNULIB_MDA_GETCWD@ +GL_GNULIB_MDA_GETPID = @GL_GNULIB_MDA_GETPID@ +GL_GNULIB_MDA_GETW = @GL_GNULIB_MDA_GETW@ +GL_GNULIB_MDA_ISATTY = @GL_GNULIB_MDA_ISATTY@ +GL_GNULIB_MDA_LSEEK = @GL_GNULIB_MDA_LSEEK@ +GL_GNULIB_MDA_MEMCCPY = @GL_GNULIB_MDA_MEMCCPY@ +GL_GNULIB_MDA_MKDIR = @GL_GNULIB_MDA_MKDIR@ +GL_GNULIB_MDA_MKTEMP = @GL_GNULIB_MDA_MKTEMP@ +GL_GNULIB_MDA_OPEN = @GL_GNULIB_MDA_OPEN@ +GL_GNULIB_MDA_PUTENV = @GL_GNULIB_MDA_PUTENV@ +GL_GNULIB_MDA_PUTW = @GL_GNULIB_MDA_PUTW@ +GL_GNULIB_MDA_READ = @GL_GNULIB_MDA_READ@ +GL_GNULIB_MDA_RMDIR = @GL_GNULIB_MDA_RMDIR@ +GL_GNULIB_MDA_STRDUP = @GL_GNULIB_MDA_STRDUP@ +GL_GNULIB_MDA_SWAB = @GL_GNULIB_MDA_SWAB@ +GL_GNULIB_MDA_TEMPNAM = @GL_GNULIB_MDA_TEMPNAM@ +GL_GNULIB_MDA_TZSET = @GL_GNULIB_MDA_TZSET@ +GL_GNULIB_MDA_UMASK = @GL_GNULIB_MDA_UMASK@ +GL_GNULIB_MDA_UNLINK = @GL_GNULIB_MDA_UNLINK@ +GL_GNULIB_MDA_WCSDUP = @GL_GNULIB_MDA_WCSDUP@ +GL_GNULIB_MDA_WRITE = @GL_GNULIB_MDA_WRITE@ +GL_GNULIB_MEMCHR = @GL_GNULIB_MEMCHR@ +GL_GNULIB_MEMMEM = @GL_GNULIB_MEMMEM@ +GL_GNULIB_MEMPCPY = @GL_GNULIB_MEMPCPY@ +GL_GNULIB_MEMRCHR = @GL_GNULIB_MEMRCHR@ +GL_GNULIB_MKDIR = @GL_GNULIB_MKDIR@ +GL_GNULIB_MKDIRAT = @GL_GNULIB_MKDIRAT@ +GL_GNULIB_MKDTEMP = @GL_GNULIB_MKDTEMP@ +GL_GNULIB_MKFIFO = @GL_GNULIB_MKFIFO@ +GL_GNULIB_MKFIFOAT = @GL_GNULIB_MKFIFOAT@ +GL_GNULIB_MKNOD = @GL_GNULIB_MKNOD@ +GL_GNULIB_MKNODAT = @GL_GNULIB_MKNODAT@ +GL_GNULIB_MKOSTEMP = @GL_GNULIB_MKOSTEMP@ +GL_GNULIB_MKOSTEMPS = @GL_GNULIB_MKOSTEMPS@ +GL_GNULIB_MKSTEMP = @GL_GNULIB_MKSTEMP@ +GL_GNULIB_MKSTEMPS = @GL_GNULIB_MKSTEMPS@ +GL_GNULIB_MKTIME = @GL_GNULIB_MKTIME@ +GL_GNULIB_NANOSLEEP = @GL_GNULIB_NANOSLEEP@ +GL_GNULIB_NL_LANGINFO = @GL_GNULIB_NL_LANGINFO@ +GL_GNULIB_NONBLOCKING = @GL_GNULIB_NONBLOCKING@ +GL_GNULIB_OBSTACK_PRINTF = @GL_GNULIB_OBSTACK_PRINTF@ +GL_GNULIB_OBSTACK_PRINTF_POSIX = @GL_GNULIB_OBSTACK_PRINTF_POSIX@ +GL_GNULIB_OPEN = @GL_GNULIB_OPEN@ +GL_GNULIB_OPENAT = @GL_GNULIB_OPENAT@ +GL_GNULIB_OPENDIR = @GL_GNULIB_OPENDIR@ +GL_GNULIB_OVERRIDES_STRUCT_STAT = @GL_GNULIB_OVERRIDES_STRUCT_STAT@ +GL_GNULIB_PCLOSE = @GL_GNULIB_PCLOSE@ +GL_GNULIB_PERROR = @GL_GNULIB_PERROR@ +GL_GNULIB_PIPE = @GL_GNULIB_PIPE@ +GL_GNULIB_PIPE2 = @GL_GNULIB_PIPE2@ +GL_GNULIB_POPEN = @GL_GNULIB_POPEN@ +GL_GNULIB_POSIX_MEMALIGN = @GL_GNULIB_POSIX_MEMALIGN@ +GL_GNULIB_POSIX_OPENPT = @GL_GNULIB_POSIX_OPENPT@ +GL_GNULIB_PREAD = @GL_GNULIB_PREAD@ +GL_GNULIB_PRINTF = @GL_GNULIB_PRINTF@ +GL_GNULIB_PRINTF_POSIX = @GL_GNULIB_PRINTF_POSIX@ +GL_GNULIB_PSELECT = @GL_GNULIB_PSELECT@ +GL_GNULIB_PTHREAD_COND = @GL_GNULIB_PTHREAD_COND@ +GL_GNULIB_PTHREAD_MUTEX = @GL_GNULIB_PTHREAD_MUTEX@ +GL_GNULIB_PTHREAD_MUTEX_TIMEDLOCK = @GL_GNULIB_PTHREAD_MUTEX_TIMEDLOCK@ +GL_GNULIB_PTHREAD_ONCE = @GL_GNULIB_PTHREAD_ONCE@ +GL_GNULIB_PTHREAD_RWLOCK = @GL_GNULIB_PTHREAD_RWLOCK@ +GL_GNULIB_PTHREAD_SIGMASK = @GL_GNULIB_PTHREAD_SIGMASK@ +GL_GNULIB_PTHREAD_SPIN = @GL_GNULIB_PTHREAD_SPIN@ +GL_GNULIB_PTHREAD_THREAD = @GL_GNULIB_PTHREAD_THREAD@ +GL_GNULIB_PTHREAD_TSS = @GL_GNULIB_PTHREAD_TSS@ +GL_GNULIB_PTSNAME = @GL_GNULIB_PTSNAME@ +GL_GNULIB_PTSNAME_R = @GL_GNULIB_PTSNAME_R@ +GL_GNULIB_PUTC = @GL_GNULIB_PUTC@ +GL_GNULIB_PUTCHAR = @GL_GNULIB_PUTCHAR@ +GL_GNULIB_PUTENV = @GL_GNULIB_PUTENV@ +GL_GNULIB_PUTS = @GL_GNULIB_PUTS@ +GL_GNULIB_PWRITE = @GL_GNULIB_PWRITE@ +GL_GNULIB_QSORT_R = @GL_GNULIB_QSORT_R@ +GL_GNULIB_RAISE = @GL_GNULIB_RAISE@ +GL_GNULIB_RANDOM = @GL_GNULIB_RANDOM@ +GL_GNULIB_RANDOM_R = @GL_GNULIB_RANDOM_R@ +GL_GNULIB_RAWMEMCHR = @GL_GNULIB_RAWMEMCHR@ +GL_GNULIB_READ = @GL_GNULIB_READ@ +GL_GNULIB_READDIR = @GL_GNULIB_READDIR@ +GL_GNULIB_READLINK = @GL_GNULIB_READLINK@ +GL_GNULIB_READLINKAT = @GL_GNULIB_READLINKAT@ +GL_GNULIB_REALLOCARRAY = @GL_GNULIB_REALLOCARRAY@ +GL_GNULIB_REALLOC_POSIX = @GL_GNULIB_REALLOC_POSIX@ +GL_GNULIB_REALPATH = @GL_GNULIB_REALPATH@ +GL_GNULIB_RECV = @GL_GNULIB_RECV@ +GL_GNULIB_RECVFROM = @GL_GNULIB_RECVFROM@ +GL_GNULIB_REMOVE = @GL_GNULIB_REMOVE@ +GL_GNULIB_RENAME = @GL_GNULIB_RENAME@ +GL_GNULIB_RENAMEAT = @GL_GNULIB_RENAMEAT@ +GL_GNULIB_REWINDDIR = @GL_GNULIB_REWINDDIR@ +GL_GNULIB_RMDIR = @GL_GNULIB_RMDIR@ +GL_GNULIB_RPMATCH = @GL_GNULIB_RPMATCH@ +GL_GNULIB_SCANDIR = @GL_GNULIB_SCANDIR@ +GL_GNULIB_SCANF = @GL_GNULIB_SCANF@ +GL_GNULIB_SCHED_YIELD = @GL_GNULIB_SCHED_YIELD@ +GL_GNULIB_SECURE_GETENV = @GL_GNULIB_SECURE_GETENV@ +GL_GNULIB_SELECT = @GL_GNULIB_SELECT@ +GL_GNULIB_SEND = @GL_GNULIB_SEND@ +GL_GNULIB_SENDTO = @GL_GNULIB_SENDTO@ +GL_GNULIB_SETENV = @GL_GNULIB_SETENV@ +GL_GNULIB_SETHOSTNAME = @GL_GNULIB_SETHOSTNAME@ +GL_GNULIB_SETLOCALE = @GL_GNULIB_SETLOCALE@ +GL_GNULIB_SETLOCALE_NULL = @GL_GNULIB_SETLOCALE_NULL@ +GL_GNULIB_SETSOCKOPT = @GL_GNULIB_SETSOCKOPT@ +GL_GNULIB_SHUTDOWN = @GL_GNULIB_SHUTDOWN@ +GL_GNULIB_SIGABBREV_NP = @GL_GNULIB_SIGABBREV_NP@ +GL_GNULIB_SIGACTION = @GL_GNULIB_SIGACTION@ +GL_GNULIB_SIGDESCR_NP = @GL_GNULIB_SIGDESCR_NP@ +GL_GNULIB_SIGNAL_H_SIGPIPE = @GL_GNULIB_SIGNAL_H_SIGPIPE@ +GL_GNULIB_SIGPROCMASK = @GL_GNULIB_SIGPROCMASK@ +GL_GNULIB_SLEEP = @GL_GNULIB_SLEEP@ +GL_GNULIB_SNPRINTF = @GL_GNULIB_SNPRINTF@ +GL_GNULIB_SOCKET = @GL_GNULIB_SOCKET@ +GL_GNULIB_SPRINTF_POSIX = @GL_GNULIB_SPRINTF_POSIX@ +GL_GNULIB_STAT = @GL_GNULIB_STAT@ +GL_GNULIB_STDIO_H_NONBLOCKING = @GL_GNULIB_STDIO_H_NONBLOCKING@ +GL_GNULIB_STDIO_H_SIGPIPE = @GL_GNULIB_STDIO_H_SIGPIPE@ +GL_GNULIB_STPCPY = @GL_GNULIB_STPCPY@ +GL_GNULIB_STPNCPY = @GL_GNULIB_STPNCPY@ +GL_GNULIB_STRCASESTR = @GL_GNULIB_STRCASESTR@ +GL_GNULIB_STRCHRNUL = @GL_GNULIB_STRCHRNUL@ +GL_GNULIB_STRDUP = @GL_GNULIB_STRDUP@ +GL_GNULIB_STRERROR = @GL_GNULIB_STRERROR@ +GL_GNULIB_STRERRORNAME_NP = @GL_GNULIB_STRERRORNAME_NP@ +GL_GNULIB_STRERROR_R = @GL_GNULIB_STRERROR_R@ +GL_GNULIB_STRFTIME = @GL_GNULIB_STRFTIME@ +GL_GNULIB_STRNCAT = @GL_GNULIB_STRNCAT@ +GL_GNULIB_STRNDUP = @GL_GNULIB_STRNDUP@ +GL_GNULIB_STRNLEN = @GL_GNULIB_STRNLEN@ +GL_GNULIB_STRPBRK = @GL_GNULIB_STRPBRK@ +GL_GNULIB_STRPTIME = @GL_GNULIB_STRPTIME@ +GL_GNULIB_STRSEP = @GL_GNULIB_STRSEP@ +GL_GNULIB_STRSIGNAL = @GL_GNULIB_STRSIGNAL@ +GL_GNULIB_STRSTR = @GL_GNULIB_STRSTR@ +GL_GNULIB_STRTOD = @GL_GNULIB_STRTOD@ +GL_GNULIB_STRTOIMAX = @GL_GNULIB_STRTOIMAX@ +GL_GNULIB_STRTOK_R = @GL_GNULIB_STRTOK_R@ +GL_GNULIB_STRTOL = @GL_GNULIB_STRTOL@ +GL_GNULIB_STRTOLD = @GL_GNULIB_STRTOLD@ +GL_GNULIB_STRTOLL = @GL_GNULIB_STRTOLL@ +GL_GNULIB_STRTOUL = @GL_GNULIB_STRTOUL@ +GL_GNULIB_STRTOULL = @GL_GNULIB_STRTOULL@ +GL_GNULIB_STRTOUMAX = @GL_GNULIB_STRTOUMAX@ +GL_GNULIB_STRVERSCMP = @GL_GNULIB_STRVERSCMP@ +GL_GNULIB_SYMLINK = @GL_GNULIB_SYMLINK@ +GL_GNULIB_SYMLINKAT = @GL_GNULIB_SYMLINKAT@ +GL_GNULIB_SYSTEM_POSIX = @GL_GNULIB_SYSTEM_POSIX@ +GL_GNULIB_TIMEGM = @GL_GNULIB_TIMEGM@ +GL_GNULIB_TIMESPEC_GET = @GL_GNULIB_TIMESPEC_GET@ +GL_GNULIB_TIME_R = @GL_GNULIB_TIME_R@ +GL_GNULIB_TIME_RZ = @GL_GNULIB_TIME_RZ@ +GL_GNULIB_TMPFILE = @GL_GNULIB_TMPFILE@ +GL_GNULIB_TOWCTRANS = @GL_GNULIB_TOWCTRANS@ +GL_GNULIB_TRUNCATE = @GL_GNULIB_TRUNCATE@ +GL_GNULIB_TTYNAME_R = @GL_GNULIB_TTYNAME_R@ +GL_GNULIB_TZSET = @GL_GNULIB_TZSET@ +GL_GNULIB_UNISTD_H_GETOPT = @GL_GNULIB_UNISTD_H_GETOPT@ +GL_GNULIB_UNISTD_H_NONBLOCKING = @GL_GNULIB_UNISTD_H_NONBLOCKING@ +GL_GNULIB_UNISTD_H_SIGPIPE = @GL_GNULIB_UNISTD_H_SIGPIPE@ +GL_GNULIB_UNLINK = @GL_GNULIB_UNLINK@ +GL_GNULIB_UNLINKAT = @GL_GNULIB_UNLINKAT@ +GL_GNULIB_UNLOCKPT = @GL_GNULIB_UNLOCKPT@ +GL_GNULIB_UNSETENV = @GL_GNULIB_UNSETENV@ +GL_GNULIB_USLEEP = @GL_GNULIB_USLEEP@ +GL_GNULIB_UTIMENSAT = @GL_GNULIB_UTIMENSAT@ +GL_GNULIB_VASPRINTF = @GL_GNULIB_VASPRINTF@ +GL_GNULIB_VDPRINTF = @GL_GNULIB_VDPRINTF@ +GL_GNULIB_VFPRINTF = @GL_GNULIB_VFPRINTF@ +GL_GNULIB_VFPRINTF_POSIX = @GL_GNULIB_VFPRINTF_POSIX@ +GL_GNULIB_VFSCANF = @GL_GNULIB_VFSCANF@ +GL_GNULIB_VPRINTF = @GL_GNULIB_VPRINTF@ +GL_GNULIB_VPRINTF_POSIX = @GL_GNULIB_VPRINTF_POSIX@ +GL_GNULIB_VSCANF = @GL_GNULIB_VSCANF@ +GL_GNULIB_VSNPRINTF = @GL_GNULIB_VSNPRINTF@ +GL_GNULIB_VSPRINTF_POSIX = @GL_GNULIB_VSPRINTF_POSIX@ +GL_GNULIB_WCPCPY = @GL_GNULIB_WCPCPY@ +GL_GNULIB_WCPNCPY = @GL_GNULIB_WCPNCPY@ +GL_GNULIB_WCRTOMB = @GL_GNULIB_WCRTOMB@ +GL_GNULIB_WCSCASECMP = @GL_GNULIB_WCSCASECMP@ +GL_GNULIB_WCSCAT = @GL_GNULIB_WCSCAT@ +GL_GNULIB_WCSCHR = @GL_GNULIB_WCSCHR@ +GL_GNULIB_WCSCMP = @GL_GNULIB_WCSCMP@ +GL_GNULIB_WCSCOLL = @GL_GNULIB_WCSCOLL@ +GL_GNULIB_WCSCPY = @GL_GNULIB_WCSCPY@ +GL_GNULIB_WCSCSPN = @GL_GNULIB_WCSCSPN@ +GL_GNULIB_WCSDUP = @GL_GNULIB_WCSDUP@ +GL_GNULIB_WCSFTIME = @GL_GNULIB_WCSFTIME@ +GL_GNULIB_WCSLEN = @GL_GNULIB_WCSLEN@ +GL_GNULIB_WCSNCASECMP = @GL_GNULIB_WCSNCASECMP@ +GL_GNULIB_WCSNCAT = @GL_GNULIB_WCSNCAT@ +GL_GNULIB_WCSNCMP = @GL_GNULIB_WCSNCMP@ +GL_GNULIB_WCSNCPY = @GL_GNULIB_WCSNCPY@ +GL_GNULIB_WCSNLEN = @GL_GNULIB_WCSNLEN@ +GL_GNULIB_WCSNRTOMBS = @GL_GNULIB_WCSNRTOMBS@ +GL_GNULIB_WCSPBRK = @GL_GNULIB_WCSPBRK@ +GL_GNULIB_WCSRCHR = @GL_GNULIB_WCSRCHR@ +GL_GNULIB_WCSRTOMBS = @GL_GNULIB_WCSRTOMBS@ +GL_GNULIB_WCSSPN = @GL_GNULIB_WCSSPN@ +GL_GNULIB_WCSSTR = @GL_GNULIB_WCSSTR@ +GL_GNULIB_WCSTOK = @GL_GNULIB_WCSTOK@ +GL_GNULIB_WCSWIDTH = @GL_GNULIB_WCSWIDTH@ +GL_GNULIB_WCSXFRM = @GL_GNULIB_WCSXFRM@ +GL_GNULIB_WCTOB = @GL_GNULIB_WCTOB@ +GL_GNULIB_WCTOMB = @GL_GNULIB_WCTOMB@ +GL_GNULIB_WCTRANS = @GL_GNULIB_WCTRANS@ +GL_GNULIB_WCTYPE = @GL_GNULIB_WCTYPE@ +GL_GNULIB_WCWIDTH = @GL_GNULIB_WCWIDTH@ +GL_GNULIB_WMEMCHR = @GL_GNULIB_WMEMCHR@ +GL_GNULIB_WMEMCMP = @GL_GNULIB_WMEMCMP@ +GL_GNULIB_WMEMCPY = @GL_GNULIB_WMEMCPY@ +GL_GNULIB_WMEMMOVE = @GL_GNULIB_WMEMMOVE@ +GL_GNULIB_WMEMPCPY = @GL_GNULIB_WMEMPCPY@ +GL_GNULIB_WMEMSET = @GL_GNULIB_WMEMSET@ +GL_GNULIB_WRITE = @GL_GNULIB_WRITE@ +GL_GNULIB__EXIT = @GL_GNULIB__EXIT@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIBHEADERS_OVERRIDE_WINT_T = @GNULIBHEADERS_OVERRIDE_WINT_T@ +GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@ +GNULIB_TEST_WARN_CFLAGS = @GNULIB_TEST_WARN_CFLAGS@ +GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@ +GREP = @GREP@ +HAVE_ACCEPT4 = @HAVE_ACCEPT4@ +HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@ +HAVE_ALLOCA_H = @HAVE_ALLOCA_H@ +HAVE_ALPHASORT = @HAVE_ALPHASORT@ +HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@ +HAVE_ATOLL = @HAVE_ATOLL@ +HAVE_BTOWC = @HAVE_BTOWC@ +HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@ +HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@ +HAVE_CHOWN = @HAVE_CHOWN@ +HAVE_CLOSEDIR = @HAVE_CLOSEDIR@ +HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@ +HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@ +HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@ +HAVE_DECL_ECVT = @HAVE_DECL_ECVT@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@ +HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@ +HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@ +HAVE_DECL_FCVT = @HAVE_DECL_FCVT@ +HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@ +HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@ +HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@ +HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@ +HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@ +HAVE_DECL_GCVT = @HAVE_DECL_GCVT@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@ +HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@ +HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@ +HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@ +HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@ +HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@ +HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@ +HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@ +HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@ +HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@ +HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@ +HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@ +HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@ +HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@ +HAVE_DECL_SETENV = @HAVE_DECL_SETENV@ +HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@ +HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@ +HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@ +HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@ +HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@ +HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@ +HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@ +HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DIRENT_H = @HAVE_DIRENT_H@ +HAVE_DPRINTF = @HAVE_DPRINTF@ +HAVE_DUP3 = @HAVE_DUP3@ +HAVE_DUPLOCALE = @HAVE_DUPLOCALE@ +HAVE_EUIDACCESS = @HAVE_EUIDACCESS@ +HAVE_EXECVPE = @HAVE_EXECVPE@ +HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@ +HAVE_FACCESSAT = @HAVE_FACCESSAT@ +HAVE_FCHDIR = @HAVE_FCHDIR@ +HAVE_FCHMODAT = @HAVE_FCHMODAT@ +HAVE_FCHOWNAT = @HAVE_FCHOWNAT@ +HAVE_FCNTL = @HAVE_FCNTL@ +HAVE_FDATASYNC = @HAVE_FDATASYNC@ +HAVE_FDOPENDIR = @HAVE_FDOPENDIR@ +HAVE_FEATURES_H = @HAVE_FEATURES_H@ +HAVE_FFSL = @HAVE_FFSL@ +HAVE_FFSLL = @HAVE_FFSLL@ +HAVE_FNMATCH = @HAVE_FNMATCH@ +HAVE_FNMATCH_H = @HAVE_FNMATCH_H@ +HAVE_FREELOCALE = @HAVE_FREELOCALE@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FSTATAT = @HAVE_FSTATAT@ +HAVE_FSYNC = @HAVE_FSYNC@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_FUTIMENS = @HAVE_FUTIMENS@ +HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@ +HAVE_GETENTROPY = @HAVE_GETENTROPY@ +HAVE_GETGROUPS = @HAVE_GETGROUPS@ +HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@ +HAVE_GETLOGIN = @HAVE_GETLOGIN@ +HAVE_GETOPT_H = @HAVE_GETOPT_H@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +HAVE_GETPASS = @HAVE_GETPASS@ +HAVE_GETSUBOPT = @HAVE_GETSUBOPT@ +HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@ +HAVE_GETUMASK = @HAVE_GETUMASK@ +HAVE_GRANTPT = @HAVE_GRANTPT@ +HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@ +HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@ +HAVE_INITSTATE = @HAVE_INITSTATE@ +HAVE_INTTYPES_H = @HAVE_INTTYPES_H@ +HAVE_ISBLANK = @HAVE_ISBLANK@ +HAVE_ISWBLANK = @HAVE_ISWBLANK@ +HAVE_ISWCNTRL = @HAVE_ISWCNTRL@ +HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@ +HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@ +HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@ +HAVE_LANGINFO_H = @HAVE_LANGINFO_H@ +HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@ +HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@ +HAVE_LCHMOD = @HAVE_LCHMOD@ +HAVE_LCHOWN = @HAVE_LCHOWN@ +HAVE_LIBSIGSEGV = @HAVE_LIBSIGSEGV@ +HAVE_LINK = @HAVE_LINK@ +HAVE_LINKAT = @HAVE_LINKAT@ +HAVE_LSTAT = @HAVE_LSTAT@ +HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@ +HAVE_MBRLEN = @HAVE_MBRLEN@ +HAVE_MBRTOWC = @HAVE_MBRTOWC@ +HAVE_MBSINIT = @HAVE_MBSINIT@ +HAVE_MBSLEN = @HAVE_MBSLEN@ +HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@ +HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@ +HAVE_MBTOWC = @HAVE_MBTOWC@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDIRAT = @HAVE_MKDIRAT@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_MKFIFO = @HAVE_MKFIFO@ +HAVE_MKFIFOAT = @HAVE_MKFIFOAT@ +HAVE_MKNOD = @HAVE_MKNOD@ +HAVE_MKNODAT = @HAVE_MKNODAT@ +HAVE_MKOSTEMP = @HAVE_MKOSTEMP@ +HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@ +HAVE_MKSTEMP = @HAVE_MKSTEMP@ +HAVE_MKSTEMPS = @HAVE_MKSTEMPS@ +HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@ +HAVE_NANOSLEEP = @HAVE_NANOSLEEP@ +HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@ +HAVE_OPENAT = @HAVE_OPENAT@ +HAVE_OPENDIR = @HAVE_OPENDIR@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_PCLOSE = @HAVE_PCLOSE@ +HAVE_PIPE = @HAVE_PIPE@ +HAVE_PIPE2 = @HAVE_PIPE2@ +HAVE_POPEN = @HAVE_POPEN@ +HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@ +HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@ +HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@ +HAVE_PREAD = @HAVE_PREAD@ +HAVE_PSELECT = @HAVE_PSELECT@ +HAVE_PTHREAD_ATTR_DESTROY = @HAVE_PTHREAD_ATTR_DESTROY@ +HAVE_PTHREAD_ATTR_GETDETACHSTATE = @HAVE_PTHREAD_ATTR_GETDETACHSTATE@ +HAVE_PTHREAD_ATTR_INIT = @HAVE_PTHREAD_ATTR_INIT@ +HAVE_PTHREAD_ATTR_SETDETACHSTATE = @HAVE_PTHREAD_ATTR_SETDETACHSTATE@ +HAVE_PTHREAD_CONDATTR_DESTROY = @HAVE_PTHREAD_CONDATTR_DESTROY@ +HAVE_PTHREAD_CONDATTR_INIT = @HAVE_PTHREAD_CONDATTR_INIT@ +HAVE_PTHREAD_COND_BROADCAST = @HAVE_PTHREAD_COND_BROADCAST@ +HAVE_PTHREAD_COND_DESTROY = @HAVE_PTHREAD_COND_DESTROY@ +HAVE_PTHREAD_COND_INIT = @HAVE_PTHREAD_COND_INIT@ +HAVE_PTHREAD_COND_SIGNAL = @HAVE_PTHREAD_COND_SIGNAL@ +HAVE_PTHREAD_COND_TIMEDWAIT = @HAVE_PTHREAD_COND_TIMEDWAIT@ +HAVE_PTHREAD_COND_WAIT = @HAVE_PTHREAD_COND_WAIT@ +HAVE_PTHREAD_CREATE = @HAVE_PTHREAD_CREATE@ +HAVE_PTHREAD_CREATE_DETACHED = @HAVE_PTHREAD_CREATE_DETACHED@ +HAVE_PTHREAD_DETACH = @HAVE_PTHREAD_DETACH@ +HAVE_PTHREAD_EQUAL = @HAVE_PTHREAD_EQUAL@ +HAVE_PTHREAD_EXIT = @HAVE_PTHREAD_EXIT@ +HAVE_PTHREAD_GETSPECIFIC = @HAVE_PTHREAD_GETSPECIFIC@ +HAVE_PTHREAD_H = @HAVE_PTHREAD_H@ +HAVE_PTHREAD_JOIN = @HAVE_PTHREAD_JOIN@ +HAVE_PTHREAD_KEY_CREATE = @HAVE_PTHREAD_KEY_CREATE@ +HAVE_PTHREAD_KEY_DELETE = @HAVE_PTHREAD_KEY_DELETE@ +HAVE_PTHREAD_MUTEXATTR_DESTROY = @HAVE_PTHREAD_MUTEXATTR_DESTROY@ +HAVE_PTHREAD_MUTEXATTR_GETROBUST = @HAVE_PTHREAD_MUTEXATTR_GETROBUST@ +HAVE_PTHREAD_MUTEXATTR_GETTYPE = @HAVE_PTHREAD_MUTEXATTR_GETTYPE@ +HAVE_PTHREAD_MUTEXATTR_INIT = @HAVE_PTHREAD_MUTEXATTR_INIT@ +HAVE_PTHREAD_MUTEXATTR_SETROBUST = @HAVE_PTHREAD_MUTEXATTR_SETROBUST@ +HAVE_PTHREAD_MUTEXATTR_SETTYPE = @HAVE_PTHREAD_MUTEXATTR_SETTYPE@ +HAVE_PTHREAD_MUTEX_DESTROY = @HAVE_PTHREAD_MUTEX_DESTROY@ +HAVE_PTHREAD_MUTEX_INIT = @HAVE_PTHREAD_MUTEX_INIT@ +HAVE_PTHREAD_MUTEX_LOCK = @HAVE_PTHREAD_MUTEX_LOCK@ +HAVE_PTHREAD_MUTEX_RECURSIVE = @HAVE_PTHREAD_MUTEX_RECURSIVE@ +HAVE_PTHREAD_MUTEX_ROBUST = @HAVE_PTHREAD_MUTEX_ROBUST@ +HAVE_PTHREAD_MUTEX_TIMEDLOCK = @HAVE_PTHREAD_MUTEX_TIMEDLOCK@ +HAVE_PTHREAD_MUTEX_TRYLOCK = @HAVE_PTHREAD_MUTEX_TRYLOCK@ +HAVE_PTHREAD_MUTEX_UNLOCK = @HAVE_PTHREAD_MUTEX_UNLOCK@ +HAVE_PTHREAD_ONCE = @HAVE_PTHREAD_ONCE@ +HAVE_PTHREAD_PROCESS_SHARED = @HAVE_PTHREAD_PROCESS_SHARED@ +HAVE_PTHREAD_RWLOCKATTR_DESTROY = @HAVE_PTHREAD_RWLOCKATTR_DESTROY@ +HAVE_PTHREAD_RWLOCKATTR_INIT = @HAVE_PTHREAD_RWLOCKATTR_INIT@ +HAVE_PTHREAD_RWLOCK_DESTROY = @HAVE_PTHREAD_RWLOCK_DESTROY@ +HAVE_PTHREAD_RWLOCK_INIT = @HAVE_PTHREAD_RWLOCK_INIT@ +HAVE_PTHREAD_RWLOCK_RDLOCK = @HAVE_PTHREAD_RWLOCK_RDLOCK@ +HAVE_PTHREAD_RWLOCK_TIMEDRDLOCK = @HAVE_PTHREAD_RWLOCK_TIMEDRDLOCK@ +HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK = @HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK@ +HAVE_PTHREAD_RWLOCK_TRYRDLOCK = @HAVE_PTHREAD_RWLOCK_TRYRDLOCK@ +HAVE_PTHREAD_RWLOCK_TRYWRLOCK = @HAVE_PTHREAD_RWLOCK_TRYWRLOCK@ +HAVE_PTHREAD_RWLOCK_UNLOCK = @HAVE_PTHREAD_RWLOCK_UNLOCK@ +HAVE_PTHREAD_RWLOCK_WRLOCK = @HAVE_PTHREAD_RWLOCK_WRLOCK@ +HAVE_PTHREAD_SELF = @HAVE_PTHREAD_SELF@ +HAVE_PTHREAD_SETSPECIFIC = @HAVE_PTHREAD_SETSPECIFIC@ +HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@ +HAVE_PTHREAD_SPINLOCK_T = @HAVE_PTHREAD_SPINLOCK_T@ +HAVE_PTHREAD_SPIN_DESTROY = @HAVE_PTHREAD_SPIN_DESTROY@ +HAVE_PTHREAD_SPIN_INIT = @HAVE_PTHREAD_SPIN_INIT@ +HAVE_PTHREAD_SPIN_LOCK = @HAVE_PTHREAD_SPIN_LOCK@ +HAVE_PTHREAD_SPIN_TRYLOCK = @HAVE_PTHREAD_SPIN_TRYLOCK@ +HAVE_PTHREAD_SPIN_UNLOCK = @HAVE_PTHREAD_SPIN_UNLOCK@ +HAVE_PTHREAD_T = @HAVE_PTHREAD_T@ +HAVE_PTSNAME = @HAVE_PTSNAME@ +HAVE_PTSNAME_R = @HAVE_PTSNAME_R@ +HAVE_PWRITE = @HAVE_PWRITE@ +HAVE_QSORT_R = @HAVE_QSORT_R@ +HAVE_RAISE = @HAVE_RAISE@ +HAVE_RANDOM = @HAVE_RANDOM@ +HAVE_RANDOM_H = @HAVE_RANDOM_H@ +HAVE_RANDOM_R = @HAVE_RANDOM_R@ +HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@ +HAVE_READDIR = @HAVE_READDIR@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_READLINKAT = @HAVE_READLINKAT@ +HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@ +HAVE_REALPATH = @HAVE_REALPATH@ +HAVE_RENAMEAT = @HAVE_RENAMEAT@ +HAVE_REWINDDIR = @HAVE_REWINDDIR@ +HAVE_RPMATCH = @HAVE_RPMATCH@ +HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@ +HAVE_SCANDIR = @HAVE_SCANDIR@ +HAVE_SCHED_H = @HAVE_SCHED_H@ +HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@ +HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@ +HAVE_SETENV = @HAVE_SETENV@ +HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@ +HAVE_SETSTATE = @HAVE_SETSTATE@ +HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@ +HAVE_SIGACTION = @HAVE_SIGACTION@ +HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@ +HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@ +HAVE_SIGINFO_T = @HAVE_SIGINFO_T@ +HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@ +HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@ +HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@ +HAVE_SIGSET_T = @HAVE_SIGSET_T@ +HAVE_SLEEP = @HAVE_SLEEP@ +HAVE_STDINT_H = @HAVE_STDINT_H@ +HAVE_STPCPY = @HAVE_STPCPY@ +HAVE_STPNCPY = @HAVE_STPNCPY@ +HAVE_STRCASESTR = @HAVE_STRCASESTR@ +HAVE_STRCHRNUL = @HAVE_STRCHRNUL@ +HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@ +HAVE_STRPBRK = @HAVE_STRPBRK@ +HAVE_STRPTIME = @HAVE_STRPTIME@ +HAVE_STRSEP = @HAVE_STRSEP@ +HAVE_STRTOD = @HAVE_STRTOD@ +HAVE_STRTOL = @HAVE_STRTOL@ +HAVE_STRTOLD = @HAVE_STRTOLD@ +HAVE_STRTOLL = @HAVE_STRTOLL@ +HAVE_STRTOUL = @HAVE_STRTOUL@ +HAVE_STRTOULL = @HAVE_STRTOULL@ +HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@ +HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@ +HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@ +HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@ +HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@ +HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@ +HAVE_STRVERSCMP = @HAVE_STRVERSCMP@ +HAVE_SYMLINK = @HAVE_SYMLINK@ +HAVE_SYMLINKAT = @HAVE_SYMLINKAT@ +HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@ +HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@ +HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@ +HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@ +HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@ +HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@ +HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@ +HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@ +HAVE_TIMEGM = @HAVE_TIMEGM@ +HAVE_TIMESPEC_GET = @HAVE_TIMESPEC_GET@ +HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@ +HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNLINKAT = @HAVE_UNLINKAT@ +HAVE_UNLOCKPT = @HAVE_UNLOCKPT@ +HAVE_USLEEP = @HAVE_USLEEP@ +HAVE_UTIMENSAT = @HAVE_UTIMENSAT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_VDPRINTF = @HAVE_VDPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCHAR_T = @HAVE_WCHAR_T@ +HAVE_WCPCPY = @HAVE_WCPCPY@ +HAVE_WCPNCPY = @HAVE_WCPNCPY@ +HAVE_WCRTOMB = @HAVE_WCRTOMB@ +HAVE_WCSCASECMP = @HAVE_WCSCASECMP@ +HAVE_WCSCAT = @HAVE_WCSCAT@ +HAVE_WCSCHR = @HAVE_WCSCHR@ +HAVE_WCSCMP = @HAVE_WCSCMP@ +HAVE_WCSCOLL = @HAVE_WCSCOLL@ +HAVE_WCSCPY = @HAVE_WCSCPY@ +HAVE_WCSCSPN = @HAVE_WCSCSPN@ +HAVE_WCSDUP = @HAVE_WCSDUP@ +HAVE_WCSFTIME = @HAVE_WCSFTIME@ +HAVE_WCSLEN = @HAVE_WCSLEN@ +HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@ +HAVE_WCSNCAT = @HAVE_WCSNCAT@ +HAVE_WCSNCMP = @HAVE_WCSNCMP@ +HAVE_WCSNCPY = @HAVE_WCSNCPY@ +HAVE_WCSNLEN = @HAVE_WCSNLEN@ +HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@ +HAVE_WCSPBRK = @HAVE_WCSPBRK@ +HAVE_WCSRCHR = @HAVE_WCSRCHR@ +HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@ +HAVE_WCSSPN = @HAVE_WCSSPN@ +HAVE_WCSSTR = @HAVE_WCSSTR@ +HAVE_WCSTOK = @HAVE_WCSTOK@ +HAVE_WCSWIDTH = @HAVE_WCSWIDTH@ +HAVE_WCSXFRM = @HAVE_WCSXFRM@ +HAVE_WCTRANS_T = @HAVE_WCTRANS_T@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WCTYPE_T = @HAVE_WCTYPE_T@ +HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE_WMEMCHR = @HAVE_WMEMCHR@ +HAVE_WMEMCMP = @HAVE_WMEMCMP@ +HAVE_WMEMCPY = @HAVE_WMEMCPY@ +HAVE_WMEMMOVE = @HAVE_WMEMMOVE@ +HAVE_WMEMPCPY = @HAVE_WMEMPCPY@ +HAVE_WMEMSET = @HAVE_WMEMSET@ +HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@ +HAVE_XLOCALE_H = @HAVE_XLOCALE_H@ +HAVE__BOOL = @HAVE__BOOL@ +HAVE__EXIT = @HAVE__EXIT@ +HOST_CPU = @HOST_CPU@ +HOST_CPU_C_ABI = @HOST_CPU_C_ABI@ +ICONV_CONST = @ICONV_CONST@ +ICONV_H = @ICONV_H@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ +INET_PTON_LIB = @INET_PTON_LIB@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +LDFLAGS = @LDFLAGS@ +LIBCSTACK = @LIBCSTACK@ +LIBGREPUTILS_LIBDEPS = @LIBGREPUTILS_LIBDEPS@ +LIBGREPUTILS_LTLIBDEPS = @LIBGREPUTILS_LTLIBDEPS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPMULTITHREAD = @LIBPMULTITHREAD@ +LIBPTHREAD = @LIBPTHREAD@ +LIBS = @LIBS@ +LIBSIGSEGV = @LIBSIGSEGV@ +LIBSIGSEGV_PREFIX = @LIBSIGSEGV_PREFIX@ +LIBSOCKET = @LIBSOCKET@ +LIBSTDTHREAD = @LIBSTDTHREAD@ +LIBTESTS_LIBDEPS = @LIBTESTS_LIBDEPS@ +LIBTHREAD = @LIBTHREAD@ +LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@ +LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@ +LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@ +LIB_HARD_LOCALE = @LIB_HARD_LOCALE@ +LIB_MBRTOWC = @LIB_MBRTOWC@ +LIB_NANOSLEEP = @LIB_NANOSLEEP@ +LIB_NL_LANGINFO = @LIB_NL_LANGINFO@ +LIB_PTHREAD = @LIB_PTHREAD@ +LIB_PTHREAD_SIGMASK = @LIB_PTHREAD_SIGMASK@ +LIB_SCHED_YIELD = @LIB_SCHED_YIELD@ +LIB_SELECT = @LIB_SELECT@ +LIB_SETLOCALE = @LIB_SETLOCALE@ +LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@ +LIMITS_H = @LIMITS_H@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LOCALENAME_ENHANCE_LOCALE_FUNCS = @LOCALENAME_ENHANCE_LOCALE_FUNCS@ +LOCALE_FR = @LOCALE_FR@ +LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@ +LOCALE_JA = @LOCALE_JA@ +LOCALE_TR_UTF8 = @LOCALE_TR_UTF8@ +LOCALE_ZH_CN = @LOCALE_ZH_CN@ +LTLIBCSTACK = @LTLIBCSTACK@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBSIGSEGV = @LTLIBSIGSEGV@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NETINET_IN_H = @NETINET_IN_H@ +NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@ +NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@ +NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@ +NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@ +NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@ +NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@ +NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@ +NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@ +NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@ +NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@ +NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@ +NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@ +NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@ +NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@ +NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@ +NEXT_AS_FIRST_DIRECTIVE_PTHREAD_H = @NEXT_AS_FIRST_DIRECTIVE_PTHREAD_H@ +NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@ +NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@ +NEXT_AS_FIRST_DIRECTIVE_STDARG_H = @NEXT_AS_FIRST_DIRECTIVE_STDARG_H@ +NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@ +NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@ +NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@ +NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@ +NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@ +NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@ +NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@ +NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@ +NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@ +NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@ +NEXT_CTYPE_H = @NEXT_CTYPE_H@ +NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_ERRNO_H = @NEXT_ERRNO_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_FNMATCH_H = @NEXT_FNMATCH_H@ +NEXT_GETOPT_H = @NEXT_GETOPT_H@ +NEXT_ICONV_H = @NEXT_ICONV_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_LANGINFO_H = @NEXT_LANGINFO_H@ +NEXT_LIMITS_H = @NEXT_LIMITS_H@ +NEXT_LOCALE_H = @NEXT_LOCALE_H@ +NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@ +NEXT_PTHREAD_H = @NEXT_PTHREAD_H@ +NEXT_SCHED_H = @NEXT_SCHED_H@ +NEXT_SIGNAL_H = @NEXT_SIGNAL_H@ +NEXT_STDARG_H = @NEXT_STDARG_H@ +NEXT_STDDEF_H = @NEXT_STDDEF_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@ +NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@ +NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ +NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@ +NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRAGMA_COLUMNS = @PRAGMA_COLUMNS@ +PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@ +PRIPTR_PREFIX = @PRIPTR_PREFIX@ +PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ +PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@ +RANLIB = @RANLIB@ +REPLACE_ACCESS = @REPLACE_ACCESS@ +REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@ +REPLACE_BTOWC = @REPLACE_BTOWC@ +REPLACE_CALLOC = @REPLACE_CALLOC@ +REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@ +REPLACE_CHOWN = @REPLACE_CHOWN@ +REPLACE_CLOSE = @REPLACE_CLOSE@ +REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@ +REPLACE_CREAT = @REPLACE_CREAT@ +REPLACE_CTIME = @REPLACE_CTIME@ +REPLACE_DIRFD = @REPLACE_DIRFD@ +REPLACE_DPRINTF = @REPLACE_DPRINTF@ +REPLACE_DUP = @REPLACE_DUP@ +REPLACE_DUP2 = @REPLACE_DUP2@ +REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@ +REPLACE_EXECL = @REPLACE_EXECL@ +REPLACE_EXECLE = @REPLACE_EXECLE@ +REPLACE_EXECLP = @REPLACE_EXECLP@ +REPLACE_EXECV = @REPLACE_EXECV@ +REPLACE_EXECVE = @REPLACE_EXECVE@ +REPLACE_EXECVP = @REPLACE_EXECVP@ +REPLACE_EXECVPE = @REPLACE_EXECVPE@ +REPLACE_FACCESSAT = @REPLACE_FACCESSAT@ +REPLACE_FCHMODAT = @REPLACE_FCHMODAT@ +REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@ +REPLACE_FCLOSE = @REPLACE_FCLOSE@ +REPLACE_FCNTL = @REPLACE_FCNTL@ +REPLACE_FDOPEN = @REPLACE_FDOPEN@ +REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@ +REPLACE_FFLUSH = @REPLACE_FFLUSH@ +REPLACE_FFSLL = @REPLACE_FFSLL@ +REPLACE_FNMATCH = @REPLACE_FNMATCH@ +REPLACE_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FPURGE = @REPLACE_FPURGE@ +REPLACE_FREE = @REPLACE_FREE@ +REPLACE_FREELOCALE = @REPLACE_FREELOCALE@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FSTAT = @REPLACE_FSTAT@ +REPLACE_FSTATAT = @REPLACE_FSTATAT@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@ +REPLACE_FUTIMENS = @REPLACE_FUTIMENS@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETDELIM = @REPLACE_GETDELIM@ +REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@ +REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@ +REPLACE_GETGROUPS = @REPLACE_GETGROUPS@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETPASS = @REPLACE_GETPASS@ +REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_GMTIME = @REPLACE_GMTIME@ +REPLACE_ICONV = @REPLACE_ICONV@ +REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@ +REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@ +REPLACE_INET_NTOP = @REPLACE_INET_NTOP@ +REPLACE_INET_PTON = @REPLACE_INET_PTON@ +REPLACE_INITSTATE = @REPLACE_INITSTATE@ +REPLACE_IOCTL = @REPLACE_IOCTL@ +REPLACE_ISATTY = @REPLACE_ISATTY@ +REPLACE_ISWBLANK = @REPLACE_ISWBLANK@ +REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@ +REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@ +REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@ +REPLACE_ITOLD = @REPLACE_ITOLD@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LINK = @REPLACE_LINK@ +REPLACE_LINKAT = @REPLACE_LINKAT@ +REPLACE_LOCALECONV = @REPLACE_LOCALECONV@ +REPLACE_LOCALTIME = @REPLACE_LOCALTIME@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_LSTAT = @REPLACE_LSTAT@ +REPLACE_MALLOC = @REPLACE_MALLOC@ +REPLACE_MBRLEN = @REPLACE_MBRLEN@ +REPLACE_MBRTOWC = @REPLACE_MBRTOWC@ +REPLACE_MBSINIT = @REPLACE_MBSINIT@ +REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@ +REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@ +REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@ +REPLACE_MBTOWC = @REPLACE_MBTOWC@ +REPLACE_MEMCHR = @REPLACE_MEMCHR@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKDIR = @REPLACE_MKDIR@ +REPLACE_MKFIFO = @REPLACE_MKFIFO@ +REPLACE_MKFIFOAT = @REPLACE_MKFIFOAT@ +REPLACE_MKNOD = @REPLACE_MKNOD@ +REPLACE_MKNODAT = @REPLACE_MKNODAT@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_MKTIME = @REPLACE_MKTIME@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@ +REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@ +REPLACE_NULL = @REPLACE_NULL@ +REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_OPENAT = @REPLACE_OPENAT@ +REPLACE_OPENDIR = @REPLACE_OPENDIR@ +REPLACE_PERROR = @REPLACE_PERROR@ +REPLACE_POPEN = @REPLACE_POPEN@ +REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@ +REPLACE_PREAD = @REPLACE_PREAD@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PSELECT = @REPLACE_PSELECT@ +REPLACE_PTHREAD_ATTR_DESTROY = @REPLACE_PTHREAD_ATTR_DESTROY@ +REPLACE_PTHREAD_ATTR_GETDETACHSTATE = @REPLACE_PTHREAD_ATTR_GETDETACHSTATE@ +REPLACE_PTHREAD_ATTR_INIT = @REPLACE_PTHREAD_ATTR_INIT@ +REPLACE_PTHREAD_ATTR_SETDETACHSTATE = @REPLACE_PTHREAD_ATTR_SETDETACHSTATE@ +REPLACE_PTHREAD_CONDATTR_DESTROY = @REPLACE_PTHREAD_CONDATTR_DESTROY@ +REPLACE_PTHREAD_CONDATTR_INIT = @REPLACE_PTHREAD_CONDATTR_INIT@ +REPLACE_PTHREAD_COND_BROADCAST = @REPLACE_PTHREAD_COND_BROADCAST@ +REPLACE_PTHREAD_COND_DESTROY = @REPLACE_PTHREAD_COND_DESTROY@ +REPLACE_PTHREAD_COND_INIT = @REPLACE_PTHREAD_COND_INIT@ +REPLACE_PTHREAD_COND_SIGNAL = @REPLACE_PTHREAD_COND_SIGNAL@ +REPLACE_PTHREAD_COND_TIMEDWAIT = @REPLACE_PTHREAD_COND_TIMEDWAIT@ +REPLACE_PTHREAD_COND_WAIT = @REPLACE_PTHREAD_COND_WAIT@ +REPLACE_PTHREAD_CREATE = @REPLACE_PTHREAD_CREATE@ +REPLACE_PTHREAD_DETACH = @REPLACE_PTHREAD_DETACH@ +REPLACE_PTHREAD_EQUAL = @REPLACE_PTHREAD_EQUAL@ +REPLACE_PTHREAD_EXIT = @REPLACE_PTHREAD_EXIT@ +REPLACE_PTHREAD_GETSPECIFIC = @REPLACE_PTHREAD_GETSPECIFIC@ +REPLACE_PTHREAD_JOIN = @REPLACE_PTHREAD_JOIN@ +REPLACE_PTHREAD_KEY_CREATE = @REPLACE_PTHREAD_KEY_CREATE@ +REPLACE_PTHREAD_KEY_DELETE = @REPLACE_PTHREAD_KEY_DELETE@ +REPLACE_PTHREAD_MUTEXATTR_DESTROY = @REPLACE_PTHREAD_MUTEXATTR_DESTROY@ +REPLACE_PTHREAD_MUTEXATTR_GETROBUST = @REPLACE_PTHREAD_MUTEXATTR_GETROBUST@ +REPLACE_PTHREAD_MUTEXATTR_GETTYPE = @REPLACE_PTHREAD_MUTEXATTR_GETTYPE@ +REPLACE_PTHREAD_MUTEXATTR_INIT = @REPLACE_PTHREAD_MUTEXATTR_INIT@ +REPLACE_PTHREAD_MUTEXATTR_SETROBUST = @REPLACE_PTHREAD_MUTEXATTR_SETROBUST@ +REPLACE_PTHREAD_MUTEXATTR_SETTYPE = @REPLACE_PTHREAD_MUTEXATTR_SETTYPE@ +REPLACE_PTHREAD_MUTEX_DESTROY = @REPLACE_PTHREAD_MUTEX_DESTROY@ +REPLACE_PTHREAD_MUTEX_INIT = @REPLACE_PTHREAD_MUTEX_INIT@ +REPLACE_PTHREAD_MUTEX_LOCK = @REPLACE_PTHREAD_MUTEX_LOCK@ +REPLACE_PTHREAD_MUTEX_TIMEDLOCK = @REPLACE_PTHREAD_MUTEX_TIMEDLOCK@ +REPLACE_PTHREAD_MUTEX_TRYLOCK = @REPLACE_PTHREAD_MUTEX_TRYLOCK@ +REPLACE_PTHREAD_MUTEX_UNLOCK = @REPLACE_PTHREAD_MUTEX_UNLOCK@ +REPLACE_PTHREAD_ONCE = @REPLACE_PTHREAD_ONCE@ +REPLACE_PTHREAD_RWLOCKATTR_DESTROY = @REPLACE_PTHREAD_RWLOCKATTR_DESTROY@ +REPLACE_PTHREAD_RWLOCKATTR_INIT = @REPLACE_PTHREAD_RWLOCKATTR_INIT@ +REPLACE_PTHREAD_RWLOCK_DESTROY = @REPLACE_PTHREAD_RWLOCK_DESTROY@ +REPLACE_PTHREAD_RWLOCK_INIT = @REPLACE_PTHREAD_RWLOCK_INIT@ +REPLACE_PTHREAD_RWLOCK_RDLOCK = @REPLACE_PTHREAD_RWLOCK_RDLOCK@ +REPLACE_PTHREAD_RWLOCK_TIMEDRDLOCK = @REPLACE_PTHREAD_RWLOCK_TIMEDRDLOCK@ +REPLACE_PTHREAD_RWLOCK_TIMEDWRLOCK = @REPLACE_PTHREAD_RWLOCK_TIMEDWRLOCK@ +REPLACE_PTHREAD_RWLOCK_TRYRDLOCK = @REPLACE_PTHREAD_RWLOCK_TRYRDLOCK@ +REPLACE_PTHREAD_RWLOCK_TRYWRLOCK = @REPLACE_PTHREAD_RWLOCK_TRYWRLOCK@ +REPLACE_PTHREAD_RWLOCK_UNLOCK = @REPLACE_PTHREAD_RWLOCK_UNLOCK@ +REPLACE_PTHREAD_RWLOCK_WRLOCK = @REPLACE_PTHREAD_RWLOCK_WRLOCK@ +REPLACE_PTHREAD_SELF = @REPLACE_PTHREAD_SELF@ +REPLACE_PTHREAD_SETSPECIFIC = @REPLACE_PTHREAD_SETSPECIFIC@ +REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@ +REPLACE_PTHREAD_SPIN_DESTROY = @REPLACE_PTHREAD_SPIN_DESTROY@ +REPLACE_PTHREAD_SPIN_INIT = @REPLACE_PTHREAD_SPIN_INIT@ +REPLACE_PTHREAD_SPIN_LOCK = @REPLACE_PTHREAD_SPIN_LOCK@ +REPLACE_PTHREAD_SPIN_TRYLOCK = @REPLACE_PTHREAD_SPIN_TRYLOCK@ +REPLACE_PTHREAD_SPIN_UNLOCK = @REPLACE_PTHREAD_SPIN_UNLOCK@ +REPLACE_PTSNAME = @REPLACE_PTSNAME@ +REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_PWRITE = @REPLACE_PWRITE@ +REPLACE_QSORT_R = @REPLACE_QSORT_R@ +REPLACE_RAISE = @REPLACE_RAISE@ +REPLACE_RANDOM = @REPLACE_RANDOM@ +REPLACE_RANDOM_R = @REPLACE_RANDOM_R@ +REPLACE_READ = @REPLACE_READ@ +REPLACE_READLINK = @REPLACE_READLINK@ +REPLACE_READLINKAT = @REPLACE_READLINKAT@ +REPLACE_REALLOC = @REPLACE_REALLOC@ +REPLACE_REALLOCARRAY = @REPLACE_REALLOCARRAY@ +REPLACE_REALPATH = @REPLACE_REALPATH@ +REPLACE_REMOVE = @REPLACE_REMOVE@ +REPLACE_RENAME = @REPLACE_RENAME@ +REPLACE_RENAMEAT = @REPLACE_RENAMEAT@ +REPLACE_RMDIR = @REPLACE_RMDIR@ +REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@ +REPLACE_SELECT = @REPLACE_SELECT@ +REPLACE_SETENV = @REPLACE_SETENV@ +REPLACE_SETLOCALE = @REPLACE_SETLOCALE@ +REPLACE_SETSTATE = @REPLACE_SETSTATE@ +REPLACE_SLEEP = @REPLACE_SLEEP@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_STAT = @REPLACE_STAT@ +REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@ +REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@ +REPLACE_STPNCPY = @REPLACE_STPNCPY@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@ +REPLACE_STRDUP = @REPLACE_STRDUP@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@ +REPLACE_STRERROR_R = @REPLACE_STRERROR_R@ +REPLACE_STRFTIME = @REPLACE_STRFTIME@ +REPLACE_STRNCAT = @REPLACE_STRNCAT@ +REPLACE_STRNDUP = @REPLACE_STRNDUP@ +REPLACE_STRNLEN = @REPLACE_STRNLEN@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@ +REPLACE_STRTOK_R = @REPLACE_STRTOK_R@ +REPLACE_STRTOL = @REPLACE_STRTOL@ +REPLACE_STRTOLD = @REPLACE_STRTOLD@ +REPLACE_STRTOLL = @REPLACE_STRTOLL@ +REPLACE_STRTOUL = @REPLACE_STRTOUL@ +REPLACE_STRTOULL = @REPLACE_STRTOULL@ +REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@ +REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@ +REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@ +REPLACE_SYMLINK = @REPLACE_SYMLINK@ +REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_TMPFILE = @REPLACE_TMPFILE@ +REPLACE_TOWLOWER = @REPLACE_TOWLOWER@ +REPLACE_TRUNCATE = @REPLACE_TRUNCATE@ +REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@ +REPLACE_TZSET = @REPLACE_TZSET@ +REPLACE_UNLINK = @REPLACE_UNLINK@ +REPLACE_UNLINKAT = @REPLACE_UNLINKAT@ +REPLACE_UNSETENV = @REPLACE_UNSETENV@ +REPLACE_USLEEP = @REPLACE_USLEEP@ +REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VDPRINTF = @REPLACE_VDPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCRTOMB = @REPLACE_WCRTOMB@ +REPLACE_WCSFTIME = @REPLACE_WCSFTIME@ +REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@ +REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@ +REPLACE_WCSTOK = @REPLACE_WCSTOK@ +REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@ +REPLACE_WCTOB = @REPLACE_WCTOB@ +REPLACE_WCTOMB = @REPLACE_WCTOMB@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +REPLACE_WRITE = @REPLACE_WRITE@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIGSEGV_H = @SIGSEGV_H@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDALIGN_H = @STDALIGN_H@ +STDARG_H = @STDARG_H@ +STDBOOL_H = @STDBOOL_H@ +STDDEF_H = @STDDEF_H@ +STDINT_H = @STDINT_H@ +STRIP = @STRIP@ +SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@ +SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ +SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ +TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@ +TIME_H_DEFINES_TIME_UTC = @TIME_H_DEFINES_TIME_UTC@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@ +UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@ +UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@ +UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@ +UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARN_CFLAGS = @WARN_CFLAGS@ +WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@ +WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@ +WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@ +WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@ +WINT_T_SUFFIX = @WINT_T_SUFFIX@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_aux_dir = @abs_aux_dir@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gl_LIBOBJS = @gl_LIBOBJS@ +gl_LTLIBOBJS = @gl_LTLIBOBJS@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ +gltests_WITNESS = @gltests_WITNESS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +lispdir = @lispdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +TEST_EXTENSIONS = .sh .pl +@HAVE_PERL_FALSE@TESTSUITE_PERL = $(SHELL) $(srcdir)/no-perl +@HAVE_PERL_TRUE@TESTSUITE_PERL = $(PERL) + +# Options passed to the perl invocations running the perl test scripts. +# '$f' is set by the Automake-generated test harness to the path of the +# current test script stripped of VPATH components, and is used by the +# CuTmpdir module to determine the name of the temporary files to be +# used. Note that $f is a shell variable, not a make macro, so the use +# of '$$f' below is correct, and not a typo. +TESTSUITE_PERL_OPTIONS = -w -I$(srcdir) -MCoreutils -MCuSkip \ + -M"CuTmpdir qw($$f)" +SH_LOG_COMPILER = $(SHELL) +PL_LOG_COMPILER = $(TESTSUITE_PERL) $(TESTSUITE_PERL_OPTIONS) +AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib \ + -I$(top_srcdir)/src + +AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) + +# Tell the linker to omit references to unused shared libraries. +AM_LDFLAGS = $(IGNORE_UNUSED_LIBRARIES_CFLAGS) +LDADD = ../lib/libgreputils.a $(LIBINTL) ../lib/libgreputils.a + +# The triple-backref test is expected to fail with both the system +# matcher (i.e., with glibc) and with the included matcher. +# Both matchers need to be fixed. +# FIXME-2015: Remove this once the glibc and gnulib bugs are fixed. +XFAIL_TESTS = triple-backref $(am__append_1) +# The backref-alt test fails for glibc 2.27 and earlier. +# If you're using older glibc you can upgrade to glibc 2.28 or later, +# configure --with-included-regex, or ignore the test failure. +TESTS = \ + backref \ + backref-alt \ + backref-multibyte-slow \ + backref-word \ + backslash-dot \ + backslash-s-and-repetition-operators \ + backslash-s-vs-invalid-multibyte \ + big-hole \ + big-match \ + binary-file-matches \ + bogus-wctob \ + bre \ + c-locale \ + case-fold-backref \ + case-fold-backslash-w \ + case-fold-char-class \ + case-fold-char-range \ + case-fold-char-type \ + case-fold-titlecase \ + char-class-multibyte \ + char-class-multibyte2 \ + context-0 \ + count-newline \ + dfa-coverage \ + dfa-heap-overrun \ + dfa-infloop \ + dfa-invalid-utf8 \ + dfaexec-multibyte \ + empty \ + empty-line \ + empty-line-mb \ + encoding-error \ + epipe \ + equiv-classes \ + ere \ + euc-mb \ + false-match-mb-non-utf8 \ + fedora \ + fgrep-infloop \ + fgrep-longest \ + file \ + filename-lineno.pl \ + fmbtest \ + foad1 \ + grep-dev-null \ + grep-dev-null-out \ + grep-dir \ + hash-collision-perf \ + help-version \ + high-bit-range \ + in-eq-out-infloop \ + include-exclude \ + inconsistent-range \ + initial-tab \ + invalid-multibyte-infloop \ + khadafy \ + kwset-abuse \ + long-line-vs-2GiB-read \ + long-pattern-perf \ + many-regex-performance \ + match-lines \ + max-count-overread \ + max-count-vs-context \ + mb-dot-newline \ + mb-non-UTF8-overrun \ + mb-non-UTF8-perf-Fw \ + mb-non-UTF8-performance \ + mb-non-UTF8-word-boundary \ + multibyte-white-space \ + multiple-begin-or-end-line \ + null-byte \ + options \ + pcre \ + pcre-abort \ + pcre-context \ + pcre-count \ + pcre-infloop \ + pcre-invalid-utf8-infloop \ + pcre-invalid-utf8-input \ + pcre-jitstack \ + pcre-o \ + pcre-utf8 \ + pcre-w \ + pcre-wx-backref \ + pcre-z \ + posix-bracket \ + prefix-of-multibyte \ + proc \ + r-dot \ + repetition-overflow \ + reversed-range-endpoints \ + sjis-mb \ + skip-device \ + skip-read \ + spencer1 \ + spencer1-locale \ + stack-overflow \ + status \ + surrogate-pair \ + symlink \ + triple-backref \ + turkish-I \ + turkish-I-without-dot \ + turkish-eyes \ + two-chars \ + two-files \ + unibyte-binary \ + unibyte-bracket-expr \ + unibyte-negated-circumflex \ + utf8-bracket \ + warn-char-classes \ + word-delim-multibyte \ + word-multi-file \ + word-multibyte \ + write-error-msg \ + yesno \ + z-anchor-newline + +EXTRA_DIST = \ + $(TESTS) \ + bre.awk \ + bre.tests \ + Coreutils.pm \ + CuSkip.pm \ + CuTmpdir.pm \ + envvar-check \ + ere.awk \ + ere.tests \ + init.cfg \ + init.sh \ + khadafy.lines \ + khadafy.regexp \ + no-perl \ + spencer1.awk \ + spencer1.tests \ + spencer1-locale.awk + + +# Default to a nonzero value. Environment overrides. +# https://udrepper.livejournal.com/11429.html +MALLOC_PERTURB_ = 1 +TESTS_ENVIRONMENT = \ + tmp__=$${TMPDIR-/tmp}; \ + test -d "$$tmp__" && test -w "$$tmp__" || tmp__=.; \ + . $(srcdir)/envvar-check; \ + TMPDIR=$$tmp__; export TMPDIR; \ + \ + if test -n "$$BASH_VERSION" || (eval "export v=x") 2>/dev/null; then \ + export_with_values () { export "$$@"; }; \ + else \ + export_with_values () \ + { \ + sed_extract_var='s/=.*//'; \ + sed_quote_value="s/'/'\\\\''/g;s/=\\(.*\\)/='\\1'/";\ + for arg in "$$@"; do \ + var=`echo "$$arg" | sed "$$sed_extract_var"`; \ + arg=`echo "$$arg" | sed "$$sed_quote_value"`; \ + eval "$$arg"; \ + export "$$var"; \ + done; \ + }; \ + fi; \ + \ + : 'Test egrep/fgrep help if they use our grep.'; \ + grep=`echo grep | sed -e '$(transform)'` || exit; \ + if test "$$grep" = grep; then \ + built_programs='grep egrep fgrep'; \ + else \ + built_programs='grep'; \ + fi; \ + \ + export_with_values \ + VERSION='$(VERSION)' \ + LOCALE_FR='$(LOCALE_FR)' \ + LOCALE_FR_UTF8='$(LOCALE_FR_UTF8)' \ + AWK=$(AWK) \ + LC_ALL=C \ + abs_top_builddir='$(abs_top_builddir)' \ + abs_top_srcdir='$(abs_top_srcdir)' \ + abs_srcdir='$(abs_srcdir)' \ + built_programs="$$built_programs" \ + host_triplet='$(host_triplet)' \ + srcdir='$(srcdir)' \ + top_srcdir='$(top_srcdir)' \ + CC='$(CC)' \ + GREP_TEST_NAME=`echo $$tst|sed 's,^\./,,;s,/,-,g'` \ + MAKE=$(MAKE) \ + MALLOC_PERTURB_=$(MALLOC_PERTURB_) \ + PACKAGE_BUGREPORT='$(PACKAGE_BUGREPORT)' \ + PACKAGE_VERSION=$(PACKAGE_VERSION) \ + PERL='$(PERL)' \ + SHELL='$(SHELL)' \ + PATH='$(abs_top_builddir)/src$(PATH_SEPARATOR)'"$$PATH" \ + ; \ + \ + : 'set this envvar to indicate whether -P works'; \ + m=0; if err=`echo .|grep -Pq . 2>&1`; then \ + test -z "$$err" && m=1; fi; \ + export PCRE_WORKS=$$m; \ + 9>&2 + +LOG_COMPILER = $(SHELL) +VERBOSE = yes +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .log .o .obj .pl .pl$(EXEEXT) .sh .sh$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) + +get-mb-cur-max$(EXEEXT): $(get_mb_cur_max_OBJECTS) $(get_mb_cur_max_DEPENDENCIES) $(EXTRA_get_mb_cur_max_DEPENDENCIES) + @rm -f get-mb-cur-max$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(get_mb_cur_max_OBJECTS) $(get_mb_cur_max_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-mb-cur-max.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +backref.log: backref + @p='backref'; \ + b='backref'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +backref-alt.log: backref-alt + @p='backref-alt'; \ + b='backref-alt'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +backref-multibyte-slow.log: backref-multibyte-slow + @p='backref-multibyte-slow'; \ + b='backref-multibyte-slow'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +backref-word.log: backref-word + @p='backref-word'; \ + b='backref-word'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +backslash-dot.log: backslash-dot + @p='backslash-dot'; \ + b='backslash-dot'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +backslash-s-and-repetition-operators.log: backslash-s-and-repetition-operators + @p='backslash-s-and-repetition-operators'; \ + b='backslash-s-and-repetition-operators'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +backslash-s-vs-invalid-multibyte.log: backslash-s-vs-invalid-multibyte + @p='backslash-s-vs-invalid-multibyte'; \ + b='backslash-s-vs-invalid-multibyte'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +big-hole.log: big-hole + @p='big-hole'; \ + b='big-hole'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +big-match.log: big-match + @p='big-match'; \ + b='big-match'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +binary-file-matches.log: binary-file-matches + @p='binary-file-matches'; \ + b='binary-file-matches'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +bogus-wctob.log: bogus-wctob + @p='bogus-wctob'; \ + b='bogus-wctob'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +bre.log: bre + @p='bre'; \ + b='bre'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +c-locale.log: c-locale + @p='c-locale'; \ + b='c-locale'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +case-fold-backref.log: case-fold-backref + @p='case-fold-backref'; \ + b='case-fold-backref'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +case-fold-backslash-w.log: case-fold-backslash-w + @p='case-fold-backslash-w'; \ + b='case-fold-backslash-w'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +case-fold-char-class.log: case-fold-char-class + @p='case-fold-char-class'; \ + b='case-fold-char-class'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +case-fold-char-range.log: case-fold-char-range + @p='case-fold-char-range'; \ + b='case-fold-char-range'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +case-fold-char-type.log: case-fold-char-type + @p='case-fold-char-type'; \ + b='case-fold-char-type'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +case-fold-titlecase.log: case-fold-titlecase + @p='case-fold-titlecase'; \ + b='case-fold-titlecase'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +char-class-multibyte.log: char-class-multibyte + @p='char-class-multibyte'; \ + b='char-class-multibyte'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +char-class-multibyte2.log: char-class-multibyte2 + @p='char-class-multibyte2'; \ + b='char-class-multibyte2'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +context-0.log: context-0 + @p='context-0'; \ + b='context-0'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +count-newline.log: count-newline + @p='count-newline'; \ + b='count-newline'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +dfa-coverage.log: dfa-coverage + @p='dfa-coverage'; \ + b='dfa-coverage'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +dfa-heap-overrun.log: dfa-heap-overrun + @p='dfa-heap-overrun'; \ + b='dfa-heap-overrun'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +dfa-infloop.log: dfa-infloop + @p='dfa-infloop'; \ + b='dfa-infloop'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +dfa-invalid-utf8.log: dfa-invalid-utf8 + @p='dfa-invalid-utf8'; \ + b='dfa-invalid-utf8'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +dfaexec-multibyte.log: dfaexec-multibyte + @p='dfaexec-multibyte'; \ + b='dfaexec-multibyte'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +empty.log: empty + @p='empty'; \ + b='empty'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +empty-line.log: empty-line + @p='empty-line'; \ + b='empty-line'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +empty-line-mb.log: empty-line-mb + @p='empty-line-mb'; \ + b='empty-line-mb'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +encoding-error.log: encoding-error + @p='encoding-error'; \ + b='encoding-error'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +epipe.log: epipe + @p='epipe'; \ + b='epipe'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +equiv-classes.log: equiv-classes + @p='equiv-classes'; \ + b='equiv-classes'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +ere.log: ere + @p='ere'; \ + b='ere'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +euc-mb.log: euc-mb + @p='euc-mb'; \ + b='euc-mb'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +false-match-mb-non-utf8.log: false-match-mb-non-utf8 + @p='false-match-mb-non-utf8'; \ + b='false-match-mb-non-utf8'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +fedora.log: fedora + @p='fedora'; \ + b='fedora'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +fgrep-infloop.log: fgrep-infloop + @p='fgrep-infloop'; \ + b='fgrep-infloop'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +fgrep-longest.log: fgrep-longest + @p='fgrep-longest'; \ + b='fgrep-longest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +file.log: file + @p='file'; \ + b='file'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +fmbtest.log: fmbtest + @p='fmbtest'; \ + b='fmbtest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +foad1.log: foad1 + @p='foad1'; \ + b='foad1'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +grep-dev-null.log: grep-dev-null + @p='grep-dev-null'; \ + b='grep-dev-null'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +grep-dev-null-out.log: grep-dev-null-out + @p='grep-dev-null-out'; \ + b='grep-dev-null-out'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +grep-dir.log: grep-dir + @p='grep-dir'; \ + b='grep-dir'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +hash-collision-perf.log: hash-collision-perf + @p='hash-collision-perf'; \ + b='hash-collision-perf'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +help-version.log: help-version + @p='help-version'; \ + b='help-version'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +high-bit-range.log: high-bit-range + @p='high-bit-range'; \ + b='high-bit-range'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +in-eq-out-infloop.log: in-eq-out-infloop + @p='in-eq-out-infloop'; \ + b='in-eq-out-infloop'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +include-exclude.log: include-exclude + @p='include-exclude'; \ + b='include-exclude'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +inconsistent-range.log: inconsistent-range + @p='inconsistent-range'; \ + b='inconsistent-range'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +initial-tab.log: initial-tab + @p='initial-tab'; \ + b='initial-tab'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +invalid-multibyte-infloop.log: invalid-multibyte-infloop + @p='invalid-multibyte-infloop'; \ + b='invalid-multibyte-infloop'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +khadafy.log: khadafy + @p='khadafy'; \ + b='khadafy'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +kwset-abuse.log: kwset-abuse + @p='kwset-abuse'; \ + b='kwset-abuse'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +long-line-vs-2GiB-read.log: long-line-vs-2GiB-read + @p='long-line-vs-2GiB-read'; \ + b='long-line-vs-2GiB-read'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +long-pattern-perf.log: long-pattern-perf + @p='long-pattern-perf'; \ + b='long-pattern-perf'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +many-regex-performance.log: many-regex-performance + @p='many-regex-performance'; \ + b='many-regex-performance'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +match-lines.log: match-lines + @p='match-lines'; \ + b='match-lines'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +max-count-overread.log: max-count-overread + @p='max-count-overread'; \ + b='max-count-overread'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +max-count-vs-context.log: max-count-vs-context + @p='max-count-vs-context'; \ + b='max-count-vs-context'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mb-dot-newline.log: mb-dot-newline + @p='mb-dot-newline'; \ + b='mb-dot-newline'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mb-non-UTF8-overrun.log: mb-non-UTF8-overrun + @p='mb-non-UTF8-overrun'; \ + b='mb-non-UTF8-overrun'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mb-non-UTF8-perf-Fw.log: mb-non-UTF8-perf-Fw + @p='mb-non-UTF8-perf-Fw'; \ + b='mb-non-UTF8-perf-Fw'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mb-non-UTF8-performance.log: mb-non-UTF8-performance + @p='mb-non-UTF8-performance'; \ + b='mb-non-UTF8-performance'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mb-non-UTF8-word-boundary.log: mb-non-UTF8-word-boundary + @p='mb-non-UTF8-word-boundary'; \ + b='mb-non-UTF8-word-boundary'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +multibyte-white-space.log: multibyte-white-space + @p='multibyte-white-space'; \ + b='multibyte-white-space'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +multiple-begin-or-end-line.log: multiple-begin-or-end-line + @p='multiple-begin-or-end-line'; \ + b='multiple-begin-or-end-line'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +null-byte.log: null-byte + @p='null-byte'; \ + b='null-byte'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +options.log: options + @p='options'; \ + b='options'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre.log: pcre + @p='pcre'; \ + b='pcre'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-abort.log: pcre-abort + @p='pcre-abort'; \ + b='pcre-abort'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-context.log: pcre-context + @p='pcre-context'; \ + b='pcre-context'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-count.log: pcre-count + @p='pcre-count'; \ + b='pcre-count'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-infloop.log: pcre-infloop + @p='pcre-infloop'; \ + b='pcre-infloop'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-invalid-utf8-infloop.log: pcre-invalid-utf8-infloop + @p='pcre-invalid-utf8-infloop'; \ + b='pcre-invalid-utf8-infloop'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-invalid-utf8-input.log: pcre-invalid-utf8-input + @p='pcre-invalid-utf8-input'; \ + b='pcre-invalid-utf8-input'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-jitstack.log: pcre-jitstack + @p='pcre-jitstack'; \ + b='pcre-jitstack'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-o.log: pcre-o + @p='pcre-o'; \ + b='pcre-o'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-utf8.log: pcre-utf8 + @p='pcre-utf8'; \ + b='pcre-utf8'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-w.log: pcre-w + @p='pcre-w'; \ + b='pcre-w'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-wx-backref.log: pcre-wx-backref + @p='pcre-wx-backref'; \ + b='pcre-wx-backref'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pcre-z.log: pcre-z + @p='pcre-z'; \ + b='pcre-z'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +posix-bracket.log: posix-bracket + @p='posix-bracket'; \ + b='posix-bracket'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +prefix-of-multibyte.log: prefix-of-multibyte + @p='prefix-of-multibyte'; \ + b='prefix-of-multibyte'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +proc.log: proc + @p='proc'; \ + b='proc'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +r-dot.log: r-dot + @p='r-dot'; \ + b='r-dot'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +repetition-overflow.log: repetition-overflow + @p='repetition-overflow'; \ + b='repetition-overflow'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +reversed-range-endpoints.log: reversed-range-endpoints + @p='reversed-range-endpoints'; \ + b='reversed-range-endpoints'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +sjis-mb.log: sjis-mb + @p='sjis-mb'; \ + b='sjis-mb'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +skip-device.log: skip-device + @p='skip-device'; \ + b='skip-device'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +skip-read.log: skip-read + @p='skip-read'; \ + b='skip-read'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +spencer1.log: spencer1 + @p='spencer1'; \ + b='spencer1'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +spencer1-locale.log: spencer1-locale + @p='spencer1-locale'; \ + b='spencer1-locale'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +stack-overflow.log: stack-overflow + @p='stack-overflow'; \ + b='stack-overflow'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +status.log: status + @p='status'; \ + b='status'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +surrogate-pair.log: surrogate-pair + @p='surrogate-pair'; \ + b='surrogate-pair'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +symlink.log: symlink + @p='symlink'; \ + b='symlink'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +triple-backref.log: triple-backref + @p='triple-backref'; \ + b='triple-backref'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +turkish-I.log: turkish-I + @p='turkish-I'; \ + b='turkish-I'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +turkish-I-without-dot.log: turkish-I-without-dot + @p='turkish-I-without-dot'; \ + b='turkish-I-without-dot'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +turkish-eyes.log: turkish-eyes + @p='turkish-eyes'; \ + b='turkish-eyes'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +two-chars.log: two-chars + @p='two-chars'; \ + b='two-chars'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +two-files.log: two-files + @p='two-files'; \ + b='two-files'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +unibyte-binary.log: unibyte-binary + @p='unibyte-binary'; \ + b='unibyte-binary'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +unibyte-bracket-expr.log: unibyte-bracket-expr + @p='unibyte-bracket-expr'; \ + b='unibyte-bracket-expr'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +unibyte-negated-circumflex.log: unibyte-negated-circumflex + @p='unibyte-negated-circumflex'; \ + b='unibyte-negated-circumflex'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +utf8-bracket.log: utf8-bracket + @p='utf8-bracket'; \ + b='utf8-bracket'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +warn-char-classes.log: warn-char-classes + @p='warn-char-classes'; \ + b='warn-char-classes'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +word-delim-multibyte.log: word-delim-multibyte + @p='word-delim-multibyte'; \ + b='word-delim-multibyte'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +word-multi-file.log: word-multi-file + @p='word-multi-file'; \ + b='word-multi-file'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +word-multibyte.log: word-multibyte + @p='word-multibyte'; \ + b='word-multibyte'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +write-error-msg.log: write-error-msg + @p='write-error-msg'; \ + b='write-error-msg'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +yesno.log: yesno + @p='yesno'; \ + b='yesno'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +z-anchor-newline.log: z-anchor-newline + @p='z-anchor-newline'; \ + b='z-anchor-newline'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.sh.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.sh$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +.pl.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(PL_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_PL_LOG_DRIVER_FLAGS) $(PL_LOG_DRIVER_FLAGS) -- $(PL_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.pl$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(PL_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_PL_LOG_DRIVER_FLAGS) $(PL_LOG_DRIVER_FLAGS) -- $(PL_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/get-mb-cur-max.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/get-mb-cur-max.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ + check-am clean clean-checkPROGRAMS clean-generic cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +check: check_executable_TESTS +.PHONY: check_executable_TESTS +check_executable_TESTS: Makefile + $(AM_V_GEN)fail=0; \ + cd $(srcdir) && for i in $(TESTS); do \ + test -x $$i || { fail=1; echo $$i >&2; }; \ + done; \ + test $$fail = 1 \ + && { echo the above test scripts are not executable >&2; exit 1; } \ + || : + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/grep/tests/backref b/src/grep/tests/backref new file mode 100755 index 0000000..947981b --- /dev/null +++ b/src/grep/tests/backref @@ -0,0 +1,46 @@ +#! /bin/sh +# Test for back-references and other things. +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +failures=0 + +# checking for a palindrome +echo "radar" | grep -e '\(.\)\(.\).\2\1' > /dev/null 2>&1 +if test $? -ne 0 ; then + echo "Backref: palindrome, test #1 failed" + failures=1 +fi + +# hit hard with the 'Bond' tests +# For now, remove the '?' in the last parentheses, so that new glibc can do it. +# --Stepan +echo "civic" \ + | grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.).?\9\8\7\6\5\4\3\2\1$' \ + > /dev/null 2>&1 +if test $? -ne 0 ; then + echo "Options: Bond, test #2 failed" + failures=1 +fi + +# backref are local should be error +echo "123" | grep -e 'a\(.\)' -e 'b\1' > /dev/null 2>&1 +if test $? -ne 2 ; then + echo "Backref: Backref not local, test #3 failed" + failures=1 +fi + +# Pattern should fail +echo "123" | grep -e '[' -e ']' > /dev/null 2>&1 +if test $? -ne 2 ; then + echo "Backref: Compiled not local, test #4 failed" + failures=1 +fi + +Exit $failures diff --git a/src/grep/tests/backref-alt b/src/grep/tests/backref-alt new file mode 100755 index 0000000..986621b --- /dev/null +++ b/src/grep/tests/backref-alt @@ -0,0 +1,34 @@ +#! /bin/sh +# Test for a bug in glibc's regex code as of 2015-09-19. +# +# Copyright 2015-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +echo aa > in || framework_failure_ + +fail=0 + +grep -E 'b|(.)b|\1|b' in >out +status=$? +# POSIX isn't clear whether this regular expression should be invalid, +# (because the \1 is out of range for REs that could precede it) +# or valid but \1 should not match. Allow either interpretation. +test $status -eq 2 || test $status -eq 1 || fail=1 + +grep -E '0|()0|\1|0' in >out +status=$? +test $status -eq 2 || test $status -eq 1 || fail=1 + +# This test is a reduced version of the one in Bug#27838. +# It triggers this glibc assertion failure: +# grep: regexec.c:1342: pop_fail_stack: Assertion `num >= 0' failed. +LC_ALL=C grep -E '(()x)|\2' in > out +status=$? +test $status -eq 2 || test $status -eq 1 || fail=1 + +Exit $fail diff --git a/src/grep/tests/backref-multibyte-slow b/src/grep/tests/backref-multibyte-slow new file mode 100755 index 0000000..9c4fe06 --- /dev/null +++ b/src/grep/tests/backref-multibyte-slow @@ -0,0 +1,33 @@ +#!/bin/sh +# This was approximately quadratic up to grep-2.6.3 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_timeout_ + +fail=0 + +# Create a 13000-line input +$AWK 'BEGIN {for (i=0; i<13000; i++) print "aba"}' /dev/null > in || fail=1 + +# Use 10 times the duration of running grep in the C locale as the timeout +# when running in en_US.UTF-8. Round up to whole seconds, since timeout +# can't deal with fractional seconds. +max_seconds=$(LC_ALL=C perl -le 'use Time::HiRes qw(time); my $s = time(); + system q,grep -E '\''^([a-z]).\1$'\'' in > junk,; + my $elapsed = time() - $s; print int (1 + 10 * $elapsed)') \ + || { max_seconds=5; + warn_ "$ME_: warning: no perl? using default of 5s timeout"; } + +# If the above finished so quickly that we'd have a 1-second timeout, +# increase it to a duration less likely to arise in a parallel test run. +test $max_seconds = 1 && max_seconds=5 + +for LOC in en_US.UTF-8; do + out=out-$LOC + LC_ALL=$LOC timeout ${max_seconds}s grep -aE '^([a-z]).\1$' in > $out 2>&1 \ + || fail=1 + compare $out in || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/backref-word b/src/grep/tests/backref-word new file mode 100755 index 0000000..e5b5486 --- /dev/null +++ b/src/grep/tests/backref-word @@ -0,0 +1,18 @@ +#!/bin/sh +# This would fail for grep-2.6 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf 'foo foo bar\n' > exp1 || framework_failure_ +fail=0 + +for LOC in en_US.UTF-8 zh_CN $LOCALE_FR_UTF8; do + out=out1-$LOC + LC_ALL=$LOC grep -w '\(foo\) \1' exp1 > $out || fail=1 + compare exp1 $out || fail=1 + + LC_ALL=$LOC grep -wx '\(foo\) \1' exp1 > $out + test $? -eq 1 || fail=1 + compare /dev/null $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/backslash-dot b/src/grep/tests/backslash-dot new file mode 100755 index 0000000..b4dd567 --- /dev/null +++ b/src/grep/tests/backslash-dot @@ -0,0 +1,20 @@ +#! /bin/sh +# This once failed to match: echo . | grep '\.' +# +# Copyright (C) 2020-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +echo . > in || framework_failure_ + +grep '\.' in > out 2> err || fail=1 +compare in out || fail=1 +compare /dev/null err || fail=1 + +Exit $fail diff --git a/src/grep/tests/backslash-s-and-repetition-operators b/src/grep/tests/backslash-s-and-repetition-operators new file mode 100755 index 0000000..8acb60a --- /dev/null +++ b/src/grep/tests/backslash-s-and-repetition-operators @@ -0,0 +1,36 @@ +#! /bin/sh +# Ensure that \s and \S work with repetition operators. +# +# Copyright (C) 2013-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +fail=0 + +for loc in en_US.UTF-8 C; do + echo locale=$loc + LC_ALL=$loc + export LC_ALL + + printf ' \n' > in || framework_failure_ + + for re in '\s\+' '\s*' '\s\?' '\s\{1\}'; do + grep "^$re\$" in > out || fail=1 + compare in out || fail=1 + done + + printf 'X\n' > in || framework_failure_ + + for re in '\S\+' '\S*' '\S\?' '\S\{1\}'; do + grep "^$re\$" in > out || fail=1 + compare in out || fail=1 + done +done + +Exit $fail diff --git a/src/grep/tests/backslash-s-vs-invalid-multibyte b/src/grep/tests/backslash-s-vs-invalid-multibyte new file mode 100755 index 0000000..79d5733 --- /dev/null +++ b/src/grep/tests/backslash-s-vs-invalid-multibyte @@ -0,0 +1,26 @@ +#! /bin/sh +# Ensure that neither \s nor \S matches an invalid multibyte character. +# +# Copyright (C) 2013-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +printf '\202\n' > in || framework_failure_ + +LC_ALL=en_US.UTF-8 +export LC_ALL + +fail=0 +grep '^\S$' in > out-S && fail=1 +compare /dev/null out-S || fail=1 + +grep '^\s$' in > out-s && fail=1 +compare /dev/null out-s || fail=1 + +Exit $fail diff --git a/src/grep/tests/big-hole b/src/grep/tests/big-hole new file mode 100755 index 0000000..eac077f --- /dev/null +++ b/src/grep/tests/big-hole @@ -0,0 +1,29 @@ +#!/bin/sh +# Check that grep --binary-file=without-match quickly skips files with holes. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +expensive_ + +# Skip this test if there is no usable SEEK_HOLE support, +# as is the case with linux-3.5.0 on ext4 and tmpfs file systems. +$PERL -e '$f=*STDERR; sysseek($f,2**22,0); syswrite($f,"a");' \ + -e 'exit ("0 but true" ne sysseek($f,0,4))' 2> seek-hole-test \ + || skip_ "this system/FS lacks SEEK_HOLE support" + +# Try to make this test not THAT expensive, on typical hosts. +virtual_memory_KiB=10240 +if echo x | (ulimit -v $virtual_memory_KiB && grep x) >/dev/null 2>&1; then + ulimit -v $virtual_memory_KiB +fi + +# Create a file that starts with at least a buffer's worth of text, +# but has a big hole later. +(${AWK-awk} 'BEGIN{ for (i=0;i<1000;i++) printf "%080d\n", 0 }' < /dev/null + echo x | dd bs=1024k seek=8000000 +) >8T-or-so || skip_ 'cannot create big sparse file' + +grep --binary-file=without-match x 8T-or-so >/dev/null +test $? -eq 1 || fail=1 + +Exit $fail diff --git a/src/grep/tests/big-match b/src/grep/tests/big-match new file mode 100755 index 0000000..0da9731 --- /dev/null +++ b/src/grep/tests/big-match @@ -0,0 +1,36 @@ +#!/bin/sh +# Check that grep doesn't mishandle long matching lines. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +expensive_ + +# Create a one-line file containing slightly more than 2 GiB. +echo x | dd bs=1024k seek=2048 >2G-plus-2 || framework_failure_ + +skip_diagnostic= + +# These two patterns catch different kinds of +# failures due to internal integer overflows. +# However, the second one, '^.*x\(\)\1', provokes +# so much memory consumption via regexec.c that it renders +# some systems unusable. +for pattern in '^.*'; do + diagnostic=$(LC_ALL=C grep -a "$pattern" 2G-plus-2 2>&1 >/dev/null) + status=$? + + case $status,$diagnostic in + 0,*) ;; + 2,*': line too long for re_search') + skip_diagnostic='regular expression library cannot handle the test' ;; + 137,''|2,*': memory exhausted') + # The 137/no-diagnostic arises when the kernel OOM-kills grep. + skip_diagnostic='not enough main memory to run the test' ;; + *) fail=1 ;; + esac +done + +case $fail,$skip_diagnostic in +0,?*) skip_ "$skip_diagnostic" ;; +esac + +Exit $fail diff --git a/src/grep/tests/binary-file-matches b/src/grep/tests/binary-file-matches new file mode 100755 index 0000000..7fc4a11 --- /dev/null +++ b/src/grep/tests/binary-file-matches @@ -0,0 +1,21 @@ +#! /bin/sh +# Test for the "binary file ... matches" diagnostic. +# +# Copyright (C) 2020-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +echo "grep: (standard input): binary file matches" > exp \ + || framework_failure_ + +printf 'a\0' | grep a > out 2> err || fail=1 +compare /dev/null out || fail=1 +compare exp err || fail=1 + +Exit $fail diff --git a/src/grep/tests/bogus-wctob b/src/grep/tests/bogus-wctob new file mode 100755 index 0000000..6be6c39 --- /dev/null +++ b/src/grep/tests/bogus-wctob @@ -0,0 +1,17 @@ +#!/bin/sh +# This was latent in grep-2.8 and earlier because we punted interpretation +# of MBCSETs to glibc. However, it becomes apparent as soon as "[à]" is +# simplified to "à". +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf '\340' > in || framework_failure_ +fail=0 + +LC_ALL=en_US.UTF-8 grep '[à]' in +case $? in + 0) fail=1 ;; + 1) ;; + 2) framework_failure_ unexpected error from grep ;; +esac + +Exit $fail diff --git a/src/grep/tests/bre b/src/grep/tests/bre new file mode 100755 index 0000000..5be164c --- /dev/null +++ b/src/grep/tests/bre @@ -0,0 +1,21 @@ +#! /bin/sh +# Regression test for GNU grep. +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# . . . and the following by Henry Spencer. + +${AWK-awk} -f $abs_top_srcdir/tests/bre.awk $abs_top_srcdir/tests/bre.tests \ + > bre.script || fail=1 + +${re_shell-${SHELL-sh}} ./bre.script || fail=1 + +Exit $fail diff --git a/src/grep/tests/bre.awk b/src/grep/tests/bre.awk new file mode 100644 index 0000000..519e270 --- /dev/null +++ b/src/grep/tests/bre.awk @@ -0,0 +1,33 @@ +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +BEGIN { + FS="@"; + n = 0; + printf ("# Generated Spencer BRE Test\n"); + printf ("failures=0\n"); +} + +$0 ~ /^#/ { next; } + +NF == 3 { +# printf ("status=$(echo '%s' | { grep -e '%s' > /dev/null 2>&1; echo $?; cat >/dev/null; })\n",$3, $2); + printf ("status=$(echo '%s' | { grep -e '%s' > /dev/null 2>&1; echo $? ; })\n",$3, $2); + printf ("if test $status -ne %s ; then\n", $1); + printf ("\techo Spencer bre test \\#%d failed\n", ++n); + printf ("\tfailures=1\n"); + printf ("fi\n"); +} + +NF == 4 { +#don't alarm users +# printf ("echo '%s' | grep -e '%s' > /dev/null 2>&1\n",$3, $2); +# printf ("if test $? -ne %s ; then\n", $1); +# printf ("\techo Expected non conformance \\#%d ... continuing\n", ++n); +# printf ("fi\n"); +} + +END { printf ("exit $failures\n"); } diff --git a/src/grep/tests/bre.tests b/src/grep/tests/bre.tests new file mode 100644 index 0000000..9d01a3c --- /dev/null +++ b/src/grep/tests/bre.tests @@ -0,0 +1,64 @@ +0@a\(b\)c@abc +0@a(@a( +2@a\(@EPAREN +2@a\(b@EPAREN +0@a(b@a(b +0@a)@a) +2@a\)@EPAREN +2@\)@EPAREN +0@a\(\)b@ab +0@a^b@a^b +0@a$b@a$b +0@\($\)\(^\)@@TO CORRECT +0@a*\(^b$\)c*@b +0@|@| +0@*@* +0@\(\)@abc +2@\(\{1\}a\)@BADRPT@TO CORRECT +0@^*@* +2@^\{1\}@BADRPT@TO CORRECT +0@{@{ +1@a\(b*\)c\1d@abbcbd +1@a\(b*\)c\1d@abbcbbbd +1@^\(.\)\1@abc +0@a\(\([bc]\)\2\)*d@abbccd +1@a\(\([bc]\)\2\)*d@abbcbd +0@a\(\(b\)*\2\)*d@abbbd +0@\(a\)\1bcd@aabcd +0@\(a\)\1bc*d@aabcd +0@\(a\)\1bc*d@aabd +0@\(a\)\1bc*d@aabcccd +0@\(a\)\1bc*[ce]d@aabcccd@TO CORRECT +0@^\(a\)\1b\(c\)*cd$@aabcccd +0@a\(*\)b@a*b +0@a\(**\)b@ab +2@a\(***\)b@BADRPT@TO CORRECT +0@*a@*a +0@**a@a +2@***a@BADRPT@TO CORRECT +0@a\{1\}b@ab +0@a\{1,\}b@ab +0@a\{1,2\}b@aab +2@a\{1@EBRACE +2@a\{1a@EBRACE +2@a\{1a\}@BADBR +0@a\{,2\}@a\{,2\} +0@a\{,\}@a\{,\} +2@a\{\}@BADBR +2@a\{1,x\}@BADBR +2@a\{1,x@EBRACE +2@a\{32768\}@BADBR +2@a\{1,0\}@BADBR +0@ab\{0,0\}c@abcac +0@ab\{0,1\}c@abcac +0@ab\{0,3\}c@abbcac +0@ab\{1,1\}c@acabc +0@ab\{1,3\}c@acabc +0@ab\{2,2\}c@abcabbc +0@ab\{2,4\}c@abcabbc +2@a\{1\}\{1\}@BADRPT@TO CORRECT +2@a*\{1\}@BADRPT@TO CORRECT +2@a\{1\}*@BADRPT@TO CORRECT +1@a\(b\)?c\1d@acd +0@-\{0,1\}[0-9]*$@-5 +2@b\{1000000000\}@ESIZE diff --git a/src/grep/tests/c-locale b/src/grep/tests/c-locale new file mode 100755 index 0000000..15d63b2 --- /dev/null +++ b/src/grep/tests/c-locale @@ -0,0 +1,26 @@ +#! /bin/sh +# Regression test for GNU grep. +# +# Copyright 2016-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +c=1 +while test $c -lt 256; do + tr2=$(printf '\\%o\n' $c) + echo X | tr X "$tr2" >in + if test $(wc -l <in) -eq 1; then + grep . in >out || fail=1 + compare in out || fail=1 + fi + test $fail -ne 0 && Exit $fail + c=$(expr $c + 1) +done + +Exit $fail diff --git a/src/grep/tests/case-fold-backref b/src/grep/tests/case-fold-backref new file mode 100755 index 0000000..b96b481 --- /dev/null +++ b/src/grep/tests/case-fold-backref @@ -0,0 +1,14 @@ +#!/bin/sh +# This would fail for grep-2.5.3 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf '%s foo\n' foo fOo Foo FOO > exp1 || framework_failure_ +fail=0 + +for LOC in en_US.UTF-8 en_US zh_CN $LOCALE_FR_UTF8 C; do + out=out1-$LOC + LC_ALL=$LOC grep -Ei '(foo) \1' exp1 > $out || fail=1 + compare exp1 $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/case-fold-backslash-w b/src/grep/tests/case-fold-backslash-w new file mode 100755 index 0000000..57ff0f5 --- /dev/null +++ b/src/grep/tests/case-fold-backslash-w @@ -0,0 +1,13 @@ +#!/bin/sh +# test that \W works on case-insensitive matches. It used to become \w. +# Derived from https://savannah.gnu.org/bugs/?28162 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +if echo foo bar | LANG=C.ASCII grep '^foo\W'; then + echo foo bar | LANG=C.ASCII grep -i '^foo\W' || fail_ ASCII insensitive +else + echo foo bar | LANG=C grep '^foo\W' || fail_ LANG=C sensitive + echo foo bar | LANG=C grep -i '^foo\W' || fail_ LANG=C insensitive +fi +echo foo bar | LANG=en_US.UTF-8 grep '^foo\W' || fail_ UTF-8 sensitive +echo foo bar | LANG=en_US.UTF-8 grep -i '^foo\W' || fail_ UTF-8 insensitive diff --git a/src/grep/tests/case-fold-char-class b/src/grep/tests/case-fold-char-class new file mode 100755 index 0000000..ac8f3ee --- /dev/null +++ b/src/grep/tests/case-fold-char-class @@ -0,0 +1,22 @@ +#!/bin/sh +# This would fail for grep-2.5.3 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf 'Y\n' > exp1 || framework_failure_ +fail=0 + +for LOC in en_US.UTF-8 zh_CN $LOCALE_FR_UTF8; do + out=out1-$LOC + printf 'X\nY\nZ\n' | LC_ALL=$LOC grep -i '[y]' > $out || fail=1 + compare exp1 $out || fail=1 +done + +printf 'y\n' > exp2 || framework_failure_ + +for LOC in en_US.UTF-8 zh_CN $LOCALE_FR_UTF8; do + out=out2-$LOC + printf 'x\ny\nz\n' | LC_ALL=$LOC grep -i '[Y]' > $out || fail=1 + compare exp2 $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/case-fold-char-range b/src/grep/tests/case-fold-char-range new file mode 100755 index 0000000..4203024 --- /dev/null +++ b/src/grep/tests/case-fold-char-range @@ -0,0 +1,23 @@ +#!/bin/sh +# This would fail for grep-2.5.3 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf 'A\nZ\n' > exp1 || framework_failure_ +fail=0 + +for LOC in en_US.UTF-8 zh_CN $LOCALE_FR_UTF8; do + out=out1-$LOC + printf 'A\n1\nZ\n.\n' | LC_ALL=$LOC grep -i '[a-z]' > $out || fail=1 + compare exp1 $out || fail=1 +done + +# This actually passes also for grep-2.5.3 +printf 'a\nz\n' > exp2 || framework_failure_ + +for LOC in en_US.UTF-8 zh_CN $LOCALE_FR_UTF8; do + out=out2-$LOC + printf 'a\n1\nz\n.\n' | LC_ALL=$LOC grep -i '[A-Z]' > $out || fail=1 + compare exp2 $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/case-fold-char-type b/src/grep/tests/case-fold-char-type new file mode 100755 index 0000000..d5fd67c --- /dev/null +++ b/src/grep/tests/case-fold-char-type @@ -0,0 +1,22 @@ +#!/bin/sh +# This would fail for grep-2.5.3 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf 'Y\n' > exp1 || framework_failure_ +fail=0 + +for LOC in en_US.UTF-8 zh_CN $LOCALE_FR_UTF8; do + out=out1-$LOC + printf '1\nY\n.\n' | LC_ALL=$LOC grep -i '[[:lower:]]' > $out || fail=1 + compare exp1 $out || fail=1 +done + +printf 'y\n' > exp2 || framework_failure_ + +for LOC in en_US.UTF-8 zh_CN $LOCALE_FR_UTF8; do + out=out2-$LOC + printf '1\ny\n.\n' | LC_ALL=$LOC grep -i '[[:upper:]]' > $out || fail=1 + compare exp2 $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/case-fold-titlecase b/src/grep/tests/case-fold-titlecase new file mode 100755 index 0000000..0aaf616 --- /dev/null +++ b/src/grep/tests/case-fold-titlecase @@ -0,0 +1,190 @@ +#!/bin/sh +# Check that case folding works even with titlecase and similarly odd chars. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support +LC_ALL=en_US.UTF-8 +export LC_ALL + +fail=0 + +for testcase in \ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 +do + case $testcase in + 0) + a='\302\265' # U+00B5 + b='\316\234' # U+039C + c='\316\274' # U+03BC + ;; + 1) + a='\111' # U+0049 + b='\151' # U+0069 + c='\304\260' # U+0130 + ;; + 2) + a='\111' # U+0049 + b='\151' # U+0069 + c='\304\261' # U+0131 + ;; + 3) + a='\123' # U+0053 + b='\163' # U+0073 + c='\305\277' # U+017F + ;; + 4) + a='\307\204' # U+01C4 + b='\307\205' # U+01C5 + c='\307\206' # U+01C6 + ;; + 5) + a='\307\207' # U+01C7 + b='\307\210' # U+01C8 + c='\307\211' # U+01C9 + ;; + 6) + a='\307\212' # U+01CA + b='\307\213' # U+01CB + c='\307\214' # U+01CC + ;; + 7) + a='\307\261' # U+01F1 + b='\307\262' # U+01F2 + c='\307\263' # U+01F3 + ;; + 8) + a='\315\205' # U+0345 + b='\316\231' # U+0399 + c='\316\271' # U+03B9 + ;; + 9) + a='\316\243' # U+03A3 + b='\317\202' # U+03C2 + c='\317\203' # U+03C3 + ;; + 10) + a='\316\222' # U+0392 + b='\316\262' # U+03B2 + c='\317\220' # U+03D0 + ;; + 11) + a='\316\230' # U+0398 + b='\316\270' # U+03B8 + c='\317\221' # U+03D1 + ;; + 12) + a='\316\246' # U+03A6 + b='\317\206' # U+03C6 + c='\317\225' # U+03D5 + ;; + 13) + a='\316\240' # U+03A0 + b='\317\200' # U+03C0 + c='\317\226' # U+03D6 + ;; + 14) + a='\316\232' # U+039A + b='\316\272' # U+03BA + c='\317\260' # U+03F0 + ;; + 15) + a='\316\241' # U+03A1 + b='\317\201' # U+03C1 + c='\317\261' # U+03F1 + ;; + 16) + a='\316\230' # U+0398 + b='\316\270' # U+03B8 + c='\317\264' # U+03F4 + ;; + 17) + a='\316\225' # U+0395 + b='\316\265' # U+03B5 + c='\317\265' # U+03F5 + ;; + 18) + a='\341\271\240' # U+1E60 + b='\341\271\241' # U+1E61 + c='\341\272\233' # U+1E9B + ;; + 19) + a='\303\237' # U+00DF + b='\303\237' # U+00DF + c='\341\272\236' # U+1E9E + ;; + 20) + a='\316\231' # U+0399 + b='\316\271' # U+03B9 + c='\341\276\276' # U+1FBE + ;; + 21) + a='\316\251' # U+03A9 + b='\317\211' # U+03C9 + c='\342\204\246' # U+2126 + ;; + 22) + a='\113' # U+004B + b='\153' # U+006B + c='\342\204\252' # U+212A + ;; + 23) + a='\303\205' # U+00C5 + b='\303\245' # U+00E5 + c='\342\204\253' # U+212B + ;; + 24) + a='\316\243' # U+03A3 + b='\317\203' # U+03C3 + c='\317\262' # U+03F2 + ;; + esac + + printf "$a\\n$b\\n$c\\n" >in || framework_failure_ + for pattern in "$a" "$b" "$c"; do + pat=$(printf "$pattern\\n") || framework_failure_ + grep -i "\\(\\)\\1$pat" in >out-regex || fail=1 + grep -i "$pat" in >out-dfa || fail=1 + compare_ out-regex out-dfa || fail=1 + grep -iF "$pat" in >out-fixed || fail=1 + compare_ out-regex out-fixed || fail=1 + done +done + +# Try a unibyte test with ISO 8859-7, if available. +if test "$(get-mb-cur-max el_GR.iso88597)" -eq 1; then + LC_ALL=el_GR.iso88597 + export LC_ALL + + a='\323' # SIGMA + b='\362' # stigma + c='\363' # sigma + + printf "$a\\n$b\\n$c\\n" >in || framework_failure_ + for pattern in "$a" "$b" "$c"; do + pat=$(printf "$pattern\\n") || framework_failure_ + grep -i "\\(\\)\\1$pat" in >out-regex || fail=1 + grep -i "$pat" in >out-dfa || fail=1 + compare_ out-regex out-dfa || fail=1 + grep -iF "$pat" in >out-fixed || fail=1 + compare_ out-regex out-fixed || fail=1 + done +fi + +Exit $fail diff --git a/src/grep/tests/char-class-multibyte b/src/grep/tests/char-class-multibyte new file mode 100755 index 0000000..b957518 --- /dev/null +++ b/src/grep/tests/char-class-multibyte @@ -0,0 +1,30 @@ +#!/bin/sh +# This would segfault for grep-2.6 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support + +printf 'é\n' > exp1 || framework_failure_ +fail=0 + +for LOC in en_US.UTF-8 $LOCALE_FR_UTF8; do + out=out1-$LOC + printf 'á\nç\né\n' | LC_ALL=$LOC grep '[é]' > $out || fail=1 + compare exp1 $out || fail=1 +done + +printf 'É\n' > exp2 || framework_failure_ + +for LOC in en_US.UTF-8 $LOCALE_FR_UTF8; do + out=out2-$LOC + printf 'Á\nÇ\nÉ\n' | LC_ALL=$LOC grep '[É]' > $out || fail=1 + compare exp2 $out || fail=1 +done + +for LOC in en_US.UTF-8 $LOCALE_FR_UTF8; do + out=out3-$LOC + printf '\303\n' | returns_ 1 env LC_ALL=$LOC grep '[é]' > $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/char-class-multibyte2 b/src/grep/tests/char-class-multibyte2 new file mode 100755 index 0000000..6cdada5 --- /dev/null +++ b/src/grep/tests/char-class-multibyte2 @@ -0,0 +1,19 @@ +#!/bin/sh +# This test would segfault for grep-2.14 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support + +e_acute=$(printf '\303\251') +printf "$e_acute\n" > exp || framework_failure_ +fail=0 + +for LOC in en_US.UTF-8 $LOCALE_FR_UTF8; do + out=out-$LOC + printf "á\nç\n$e_acute\n" | LC_ALL=$LOC grep -E "([^.]*[$e_acute]){1,2}" \ + > $out || fail=1 + compare exp $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/context-0 b/src/grep/tests/context-0 new file mode 100755 index 0000000..4b63305 --- /dev/null +++ b/src/grep/tests/context-0 @@ -0,0 +1,27 @@ +#!/bin/sh +# 0 lines of context +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +cat <<EOF > in || framework_failure_ +needle +1st line of context +2nd line of context +3rd line of context +another needle +5th line of context relative to first match +6th line... +EOF + +cat <<EOF > exp || framework_failure_ +needle +-- +another needle +EOF + +fail=0 +grep -C 0 needle in > out 2>err || fail=1 + +compare exp out || fail=1 +compare /dev/null err || fail=1 + +Exit $fail diff --git a/src/grep/tests/count-newline b/src/grep/tests/count-newline new file mode 100755 index 0000000..10e0870 --- /dev/null +++ b/src/grep/tests/count-newline @@ -0,0 +1,28 @@ +#!/bin/sh +# Test that newline is counted correctly even when the transition +# table is rebuilt. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf '%1024d\nb\n' 0 >in || framework_failure_ + +grep -f in in >out || fail=1 + +compare in out || fail=1 + +Exit $fail diff --git a/src/grep/tests/dfa-coverage b/src/grep/tests/dfa-coverage new file mode 100755 index 0000000..0a67fbb --- /dev/null +++ b/src/grep/tests/dfa-coverage @@ -0,0 +1,32 @@ +#!/bin/sh +# Exercise the final reachable code in dfa.c's match_mb_charset. + +# Copyright (C) 2012-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support + +fail=0 + +echo a > in || framework_failure_ + +LC_ALL=en_US.UTF-8 grep -E '[^_]|$' in > out || fail=1 + +compare out in || fail=1 + +Exit $fail diff --git a/src/grep/tests/dfa-heap-overrun b/src/grep/tests/dfa-heap-overrun new file mode 100755 index 0000000..4ffa789 --- /dev/null +++ b/src/grep/tests/dfa-heap-overrun @@ -0,0 +1,25 @@ +#!/bin/sh +# Trigger a heap overrun in grep-2.6..grep-2.8. + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +returns_ 1 grep -E '(^| )*(a|b)*(c|d)*( |$)' < /dev/null || fail=1 + +Exit $fail diff --git a/src/grep/tests/dfa-infloop b/src/grep/tests/dfa-infloop new file mode 100755 index 0000000..e35eef5 --- /dev/null +++ b/src/grep/tests/dfa-infloop @@ -0,0 +1,12 @@ +#!/bin/sh +# This would infloop for some unreleased versions between 2.26 and 2.27 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_timeout_ + +fail=0 + +echo cx > in || framework_failure_ +returns_ 1 timeout 10 env LC_ALL=C grep -E 'c\b[x ]' in || fail=1 + +Exit $fail diff --git a/src/grep/tests/dfa-invalid-utf8 b/src/grep/tests/dfa-invalid-utf8 new file mode 100755 index 0000000..8d4e96e --- /dev/null +++ b/src/grep/tests/dfa-invalid-utf8 @@ -0,0 +1,29 @@ +#! /bin/sh +# Test whether "grep '.'" matches invalid UTF-8 byte sequences. +# +# Copyright 2019-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_en_utf8_locale_ +require_compiled_in_MB_support + +fail=0 + +printf 'a\360\202\202\254b\n' >in1 || framework_failure_ +LC_ALL=en_US.UTF-8 grep 'a.b' in1 > out1 2> err +test $? -eq 1 || fail=1 +compare /dev/null out1 || fail=1 +compare /dev/null err1 || fail=1 + +printf 'a\360\202\202\254ba\360\202\202\254b\n' >in2 || + framework_failure_ +LC_ALL=en_US.UTF-8 grep -E '(a.b)\1' in2 > out2 2> err +test $? -eq 1 || fail=1 +compare /dev/null out2 || fail=1 +compare /dev/null err2 || fail=1 + +Exit $fail diff --git a/src/grep/tests/dfaexec-multibyte b/src/grep/tests/dfaexec-multibyte new file mode 100755 index 0000000..baac9ba --- /dev/null +++ b/src/grep/tests/dfaexec-multibyte @@ -0,0 +1,25 @@ +#!/bin/sh +# This would fail for grep-2.5.3 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf 'aa\nab\nba\nbb\n' > exp1 || framework_failure_ +printf '1 2 3\n' > exp2 || framework_failure_ + +fail=0 + +for LOC in en_US.UTF-8 zh_CN $LOCALE_FR_UTF8; do + out=out1-ab-$LOC + LC_ALL=$LOC grep -E '([a]|[b]){2}' < exp1 > $out || fail=1 + compare exp1 $out || fail=1 + + out=out1-ba-$LOC + LC_ALL=$LOC grep -E '([b]|[a]){2}' < exp1 > $out || fail=1 + compare exp1 $out || fail=1 + + out=out2-$LOC + LC_ALL=$LOC grep -E '^([[:digit:]]+[[:space:]]+){2}' < exp2 > $out || fail=1 + compare exp2 $out || fail=1 + +done + +Exit $fail diff --git a/src/grep/tests/empty b/src/grep/tests/empty new file mode 100755 index 0000000..92f50bb --- /dev/null +++ b/src/grep/tests/empty @@ -0,0 +1,82 @@ +#! /bin/sh +# test that the empty file means no pattern +# and an empty pattern means match all. +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_timeout_ + +failures=0 + +for locale in C en_US.UTF-8; do + for options in '-E' '-F'; do + + # should return 0 found a match + echo "" | LC_ALL=$locale timeout 10s grep $options -e '' + if test $? -ne 0 ; then + echo "Status: Wrong status code, test \#1 failed ($options $locale)" + failures=1 + fi + + # should return 1 found no match + echo abcd | LC_ALL=$locale timeout 10s grep $options -f /dev/null + if test $? -ne 1 ; then + echo "Status: Wrong status code, test \#2 failed ($options $locale)" + failures=1 + fi + + # should return 0 found a match + echo abcd \ + | LC_ALL=$locale timeout 10s grep $options -f /dev/null -e abcd + if test $? -ne 0 ; then + echo "Status: Wrong status code, test \#3 failed ($options $locale)" + failures=1 + fi + + # should return 0 found a match + echo "" | LC_ALL=$locale timeout 10s grep $options -e '' + if test $? -ne 0 ; then + echo "Status: Wrong status code, test \#4 failed ($options $locale)" + failures=1 + fi + + # should return 0 found a match + echo abcd | LC_ALL=$locale timeout 10s grep $options -e '' + if test $? -ne 0 ; then + echo "Status: Wrong status code, test \#5 failed ($options $locale)" + failures=1 + fi + done + + for options in '-E -w' '-E -x' '-E -w -x' '-F -w' '-F -x' '-F -w -x'; do + + # should return 0 found a match + echo "" | LC_ALL=$locale timeout 10s grep $options -e '' + if test $? -ne 0 ; then + echo "Status: Wrong status code, test \#6 failed ($options $locale)" + failures=1 + fi + + # should return 1 found no match + echo abcd | LC_ALL=$locale timeout 10s grep $options -f /dev/null + if test $? -ne 1 ; then + echo "Status: Wrong status code, test \#7 failed ($options $locale)" + failures=1 + fi + + # should return 1 found no match + echo abcd | LC_ALL=$locale timeout 10s grep $options -f /dev/null -e "" + if test $? -ne 1 ; then + echo "Status: Wrong status code, test \#8 failed ($options $locale)" + failures=1 + fi + done +done + +Exit $failures diff --git a/src/grep/tests/empty-line b/src/grep/tests/empty-line new file mode 100755 index 0000000..25e9509 --- /dev/null +++ b/src/grep/tests/empty-line @@ -0,0 +1,41 @@ +#! /bin/sh +# Test that the empty pattern matches everything. +# Some of these tests failed in grep 2.18. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 +printf 'abc\n' >in || framework_failure_ +nl=' +' + +for opt in '' -E -F; do + case $opt in + '') prefix='\(\)\1';; + -E) prefix='()\1';; + -F) prefix="foo$nl";; + esac + + for pattern in "" "$nl" "---$nl" "${nl}foo"; do + for pat in "$pattern" "$prefix$pattern"; do + grep $opt -e "$pat" in >out || fail=1 + compare in out || fail=1 + + printf -- '%s\n' "$pat" >pat || framework_failure_ + grep $opt -f pat in >out || fail=1 + compare in out || fail=1 + + # Check that pattern files that end in non-newlines + # are treated as if a newline were appended. + case $pattern in + '' | *"$nl") ;; + *) + printf -- '%s' "$pat" >pat || framework_failure_ + grep $opt -f pat in >out || fail=1 + compare in out || fail=1;; + esac + done + done +done + +Exit $fail diff --git a/src/grep/tests/empty-line-mb b/src/grep/tests/empty-line-mb new file mode 100755 index 0000000..579921d --- /dev/null +++ b/src/grep/tests/empty-line-mb @@ -0,0 +1,29 @@ +#! /bin/sh +# Exercise bugs in grep-2.13 with -i, -n and an RE of ^$ in a multi-byte locale. +# +# Copyright (C) 2012-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +LC_ALL=en_US.UTF-8 +export LC_ALL + +printf 'a\n\nb\n' > in || framework_failure_ +printf '2:\n' > exp || framework_failure_ + +printf 'a\nb\n' > in2 || framework_failure_ + +grep -n -i '^$' in > out || fail=1 +compare exp out || fail=1 + +# Expect no match: with grep-2.13 this would mistakenly exit 0 +grep -i '^$' in2 > out && fail=1 +compare /dev/null out || fail=1 + +Exit $fail diff --git a/src/grep/tests/encoding-error b/src/grep/tests/encoding-error new file mode 100755 index 0000000..2ec71c9 --- /dev/null +++ b/src/grep/tests/encoding-error @@ -0,0 +1,52 @@ +#! /bin/sh +# Test grep's behavior on encoding errors. +# +# Copyright 2015-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +printf 'Alfred Jones\n' > a || framework_failure_ +printf 'John Smith\n' >j || framework_failure_ +printf 'Pedro P\351rez\n' >p || framework_failure_ +cat a p j >in || framework_failure_ + +LC_ALL=en_US.UTF-8 +export LC_ALL + +fail=0 + +grep '^A' in >out || fail=1 +compare a out || fail=1 + +grep '^P' in >out || fail=1 +compare /dev/null out || fail=1 + +grep -I '^P' in >out 2>err || fail=1 +compare /dev/null out || fail=1 +compare /dev/null err || fail=1 + +grep '^J' in >out || fail=1 +compare j out || fail=1 + +returns_ 1 grep '^X' in >out || fail=1 +compare /dev/null out || fail=1 + +grep . in >out || fail=1 +cat a j >exp || framework_failure_ +compare exp out || fail=1 + +grep -I . in >out 2>err || fail=1 +cat a j >exp || framework_failure_ +compare exp out || fail=1 +compare /dev/null err || fail=1 + +grep -a . in >out || fail=1 +compare in out + +Exit $fail diff --git a/src/grep/tests/envvar-check b/src/grep/tests/envvar-check new file mode 100644 index 0000000..decc256 --- /dev/null +++ b/src/grep/tests/envvar-check @@ -0,0 +1,63 @@ +# -*- sh -*- +# Check environment variables for sane values while testing. + +# Copyright (C) 2000-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +envvar_check_fail=0 +vars=' + _POSIX2_VERSION + _STDBUF_E + _STDBUF_I + _STDBUF_O + BASH_ENV + BLOCKSIZE + BLOCK_SIZE + CDPATH + COLUMNS + DF_BLOCK_SIZE + DU_BLOCK_SIZE + ENV + LANGUAGE + LS_BLOCK_SIZE + LS_COLORS + OMP_NUM_THREADS + POSIXLY_CORRECT + QUOTING_STYLE + SIMPLE_BACKUP_SUFFIX + TABSIZE + TERM + COLORTERM + TIME_STYLE + TMPDIR + VERSION_CONTROL +' +for var in $vars +do + $as_unset $var + if eval test \"\${$var+set}\" = set; then + echo "$0: the $var environment variable is set --" \ + ' unset it and rerun this test' >&2 + envvar_check_fail=1 + fi +done + +test "$envvar_check_fail" = 1 && exit 1 diff --git a/src/grep/tests/epipe b/src/grep/tests/epipe new file mode 100755 index 0000000..3b568e3 --- /dev/null +++ b/src/grep/tests/epipe @@ -0,0 +1,29 @@ +#!/bin/sh +# Check that a write failure with errno == EPIPE +# doesn't cause grep to issue multiple "write error" diagnostics. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +if + # Use awk to output a bounded amount of data to the grep in question, + # so that the test doesn't loop forever if grep is buggy. + # Use an explicit /dev/null for the benefit of older (pre-POSIX) awks. + # + # Carefully close fd 3 when not needed, as a sanity check. + # + # Do not use "trap - PIPE" or "trap 'something' PIPE" here, since we may + # be running in an environment where SIGPIPE is ignored, and in such an + # environment POSIX says that "trap '' PIPE" is all we can do portably. + ( + ${AWK-awk} 'BEGIN { for (i=0; i<1000000; i++) print i; }' /dev/null 3>&- | + (trap '' PIPE; exec grep . 2>&3 3>&-) | + : + ) 3>&1 | ( + read line1 && echo >&2 "$line1" && + read line2 && echo >&2 "$line2" + ) +then fail=1 +else fail=0 +fi + +Exit $fail diff --git a/src/grep/tests/equiv-classes b/src/grep/tests/equiv-classes new file mode 100755 index 0000000..940efa4 --- /dev/null +++ b/src/grep/tests/equiv-classes @@ -0,0 +1,13 @@ +#!/bin/sh +# Test that equivalence classes work. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support + +LC_ALL=en_US.UTF-8 +export LC_ALL + +echo à | grep '[[=a=]]' > /dev/null +Exit $? diff --git a/src/grep/tests/ere b/src/grep/tests/ere new file mode 100755 index 0000000..7d2c75b --- /dev/null +++ b/src/grep/tests/ere @@ -0,0 +1,21 @@ +#! /bin/sh +# Regression test for GNU grep. +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# . . . and the following by Henry Spencer. + +${AWK-awk} -f $abs_top_srcdir/tests/ere.awk $abs_top_srcdir/tests/ere.tests \ + > ere.script || fail=1 + +${re_shell-${SHELL-sh}} ere.script || fail=1 + +Exit $fail diff --git a/src/grep/tests/ere.awk b/src/grep/tests/ere.awk new file mode 100644 index 0000000..3b4c629 --- /dev/null +++ b/src/grep/tests/ere.awk @@ -0,0 +1,38 @@ +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +BEGIN { + FS="@"; + n = 0; + printf ("# Generated Spencer ERE Test\n"); + printf ("failures=0\n"); +} + +$0 ~ /^#/ { next; } + +NF == 3 { +# printf ("status=$(echo '%s' | { grep -E -e '%s' > /dev/null 2>&1; echo $?; cat >/dev/null; })\n",$3, $2); + printf ("status=$(echo '%s' | { grep -E -e '%s' > /dev/null 2>&1; echo $?; })\n",$3, $2); + printf ("if test $status -ne %s ; then\n", $1); + printf ("\techo Spencer ere test \\#%d failed\n", ++n); + printf ("\tfailures=1\n"); + printf ("fi\n"); +} + +NF == 4 { +# don't alarm the user for now +# printf ("echo '%s'|grep -E -e '%s' > /dev/null 2>&1\n",$3, $2); +# printf ("if test $? -ne %s ; then\n", $1); +# printf ("\techo Expected non conformance \\#%d ... continuing\n", ++n); +# printf ("fi\n"); +} + +NF == 5 { +# don't alarm the user for now + next; +} + +END { printf ("exit $failures\n"); } diff --git a/src/grep/tests/ere.tests b/src/grep/tests/ere.tests new file mode 100644 index 0000000..557d4db --- /dev/null +++ b/src/grep/tests/ere.tests @@ -0,0 +1,222 @@ +0@a@a +0@abc@abc +0@abc|de@abc +0@a|b|c@abc +0@a(b)c@abc +2@a(@EPAREN +0@a\(@a( +2@a(b@EPAREN +0@a)@a)@POSIX BOTCH +0@)@)@POSIX BOTCH +0@a()b@ab +0@^abc$@abc +1@a^b@a^b +1@a$b@a$b +0@^@abc +0@$@abc +0@^$@@TO CORRECT +0@$^@@TO CORRECT +0@^^@@TO CORRECT +0@$$@@TO CORRECT +0@a*(^b$)c*@b +2@|@EMPTY@NO ALTERNATION +2@*@BADRPT@TO CORRECT +2@+@BADRPT@TO CORRECT +2@?@BADRPT@TO CORRECT +1@&C@PASS +0@()@abc +2@a||b@EMPTY@NO ALTERNATION +2@|ab@EMPTY@NO ALTERNATION +2@ab|@EMPTY@NO ALTERNATION +2@(|a)b@EMPTY@NO ALTERNATION +2@(a|)b@EMPTY@NO ALTERNATION +2@(*a)@BADRPT@TO CORRECT +2@(+a)@BADRPT@TO CORRECT +2@(?a)@BADRPT@TO CORRECT +2@({1}a)@BADRPT@TO CORRECT +2@(a|*b)@BADRPT@NO ALTERNATION +2@(a|+b)@BADRPT@NO ALTERNATION +2@(a|?b)@BADRPT@NO ALTERNATION +2@(a|{1}b)@BADRPT@NO ALTERNATION +2@^*@BADRPT@TO CORRECT +2@^+@BADRPT@TO CORRECT +2@^?@BADRPT@TO CORRECT +2@^{1}@BADRPT@TO CORRECT +0@a.c@abc +0@a[bc]d@abd +0@a\*c@a*c +0@a\\b@a\b@TO CORRECT +0@a\\\*b@a\*b@SHELL TROUBLE +0@a\bc@abc@TO CORRECT +2@a\@EESCAPE@SHELL TROUBLE +0@a\\bc@a\bc@TO CORRECT +0@a\[b@a[b +2@a[b@EBRACK +0@a$@a +1@a$@a$ +1@a\$@a@SHELL TROUBLE +0@a\$@a$@SHELL TROUBLE +1@a\\$@a +1@a\\$@a$@SHELL TROUBLE +1@a\\$@a\$@SHELL TROUBLE +0@a\\$@a\@SHEL TROUBLE +0@ab*c@abc +0@ab+c@abc +0@ab?c@abc +0@{@{@TO CORRECT +0@{abc@{abc@TO CORRECT +0@{1@{1 +2@{1}@BADRPT@TO CORRECT +0@a{b@a{b@TO CORRECT +0@a{1}b@ab +0@a{1,}b@ab +0@a{1,2}b@aab +0@a{1@a{1 +1@a{1a@aa +0@a{1a}@a{1a} +0@a{,2}@a{,2} +0@a{,}@a{,} +2@a{}@BADBR +0@a{1,*}@a{1,,,} +2@a{1,x@EBRACE@TO CORRECT +2@a{300}@BADBR@TO CORRECT +2@a{1,0}@BADBR@TO CORRECT +0@ab{0,0}c@abcac +0@ab{0,1}c@abcac +0@ab{0,3}c@abbcac +0@ab{1,1}c@acabc +0@ab{1,3}c@acabc +0@ab{2,2}c@abcabbc +0@ab{2,4}c@abcabbc +2@a**@BADRPT@TO CORRECT +2@a++@BADRPT@TO CORRECT +2@a??@BADRPT@TO CORRECT +2@a*+@BADRPT@TO CORRECT +2@a*?@BADRPT@TO CORRECT +2@a+*@BADRPT@TO CORRECT +2@a+?@BADRPT@TO CORRECT +2@a?*@BADRPT@TO CORRECT +2@a?+@BADRPT@TO CORRECT +2@a{1}{1}@BADRPT@TO CORRECT +2@a*{1}@BADRPT@TO CORRECT +2@a+{1}@BADRPT@TO CORRECT +2@a?{1}@BADRPT@TO CORRECT +2@a{1}*@BADRPT@TO CORRECT +2@a{1}+@BADRPT@TO CORRECT +2@a{1}?@BADRPT@TO CORRECT +0@a*{b}@a{b}@TO CORRECT +0@a[b]c@abc +0@a[ab]c@abc +0@a[^ab]c@adc +0@a[]b]c@a]c +0@a[[b]c@a[c +0@a[-b]c@a-c +0@a[^]b]c@adc +0@a[^-b]c@adc +0@a[b-]c@a-c +2@a[b@EBRACK +2@a[]@EBRACK +0@a[1-3]c@a2c +2@a[3-1]c@ERANGE@TO CORRECT +2@a[1-3-5]c@ERANGE@TO CORRECT +0@a[[.-.]--]c@a-c@TO CORRECT +2@a[1-@ERANGE +2@a[[.@EBRACK +2@a[[.x@EBRACK +2@a[[.x.@EBRACK +2@a[[.x.]@EBRACK@TO CORRECT +0@a[[.x.]]@ax@TO CORRECT +2@a[[.x,.]]@ECOLLATE@TO CORRECT +0@a[[.one.]]b@a1b@TO CORRECT +2@a[[.notdef.]]b@ECOLLATE@TO CORRECT +0@a[[.].]]b@a]b@TO CORRECT +0@a[[:alpha:]]c@abc +2@a[[:notdef:]]c@ECTYPE +2@a[[:@EBRACK +2@a[[:alpha@EBRACK +2@a[[:alpha:]@EBRACK +2@a[[:alpha,:]@ECTYPE +2@a[[:]:]]b@ECTYPE +2@a[[:-:]]b@ECTYPE +2@a[[:alph:]]@ECTYPE +2@a[[:alphabet:]]@ECTYPE +0@[[:digit:]]+@a019b +0@[[:lower:]]+@AabC +0@[[:upper:]]+@aBCd +0@[[:xdigit:]]+@p0f3Cq +0@a[[=b=]]c@abc@TO CORRECT +2@a[[=@EBRACK +2@a[[=b@EBRACK +2@a[[=b=@EBRACK +2@a[[=b=]@EBRACK@TO CORRECT +2@a[[=b,=]]@ECOLLATE@TO CORRECT +0@a[[=one=]]b@a1b@TO CORRECT +0@a(((b)))c@abc +0@a(b|(c))d@abd +0@a(b*|c)d@abbd +0@a[ab]{20}@aaaaabaaaabaaaabaaaab +0@a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab]@aaaaabaaaabaaaabaaaab +0@a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab](wee|week)(knights|night)@aaaaabaaaabaaaabaaaabweeknights +0@12345678901234567890123456789@a12345678901234567890123456789b +0@123456789012345678901234567890@a123456789012345678901234567890b +0@1234567890123456789012345678901@a1234567890123456789012345678901b +0@12345678901234567890123456789012@a12345678901234567890123456789012b +0@123456789012345678901234567890123@a123456789012345678901234567890123b +0@1234567890123456789012345678901234567890123456789012345678901234567890@a1234567890123456789012345678901234567890123456789012345678901234567890b +0@[ab][cd][ef][gh][ij][kl][mn]@xacegikmoq +0@[ab][cd][ef][gh][ij][kl][mn][op]@xacegikmoq +0@[ab][cd][ef][gh][ij][kl][mn][op][qr]@xacegikmoqy +0@[ab][cd][ef][gh][ij][kl][mn][op][q]@xacegikmoqy +0@abc@xabcy +0@aBc@Abc@TO CORRECT +0@a[Bc]*d@abBCcd@TO CORRECT +0@0[[:upper:]]1@0a1@TO CORRECT +0@0[[:lower:]]1@0A1@TO CORRECT +1@a[^b]c@abc +1@a[^b]c@aBc@TO CORRECT +0@a[^b]c@adc +0@[a]b[c]@abc +0@[a]b[a]@aba +0@[abc]b[abc]@abc +0@[abc]b[abd]@abd +0@a(b?c)+d@accd +0@(wee|week)(knights|night)@weeknights +0@(we|wee|week|frob)(knights|night|day)@weeknights +0@a[bc]d@xyzaaabcaababdacd +0@a[ab]c@aaabc +0@a*@b +0@/\*.*\*/@/*x*/ +0@/\*.*\*/@/*x*/y/*z*/ +0@/\*([^*]|\*[^/])*\*/@/*x*/ +0@/\*([^*]|\*[^/])*\*/@/*x*/y/*z*/ +0@/\*([^*]|\*[^/])*\*/@/*x**/y/*z*/ +0@/\*([^*]|\*+[^*/])*\*+/@/*x*/ +0@/\*([^*]|\*+[^*/])*\*+/@/*x*/y/*z*/ +0@/\*([^*]|\*+[^*/])*\*+/@/*x**/y/*z*/ +0@/\*([^*]|\*+[^*/])*\*+/@/*x****/y/*z*/ +0@/\*([^*]|\*+[^*/])*\*+/@/*x**x*/y/*z*/ +0@/\*([^*]|\*+[^*/])*\*+/@/*x***x/y/*z*/ +0@aZb@a@TO CORRECT +0@[[:<:]]a@a@TO CORRECT +1@[[:<:]]a@ba@TO CORRECT +0@[[:<:]]a@-a@TO CORRECT +0@a[[:>:]]@a@TO CORRECT +1@a[[:>:]]@ab@TO CORRECT +0@a[[:>:]]@a-@TO CORRECT +0@[[:<:]]a.c[[:>:]]@axcd-dayc-dazce-abc@TO CORRECT +0@[[:<:]]a.c[[:>:]]@axcd-dayc-dazce-abc-q@TO CORRECT +0@[[:<:]]a.c[[:>:]]@axc-dayc-dazce-abc@TO CORRECT +0@[[:<:]]b.c[[:>:]]@a_bxc-byc_d-bzc-q@TO CORRECT +0@[[:<:]].x..[[:>:]]@y_xa_-_xb_y-_xc_-axdc@TO CORRECT +1@[[:<:]]a_b[[:>:]]@x_a_b@TO CORRECT +0@(A[1])|(A[2])|(A[3])|(A[4])|(A[5])|(A[6])|(A[7])|(A[8])|(A[9])|(A[A])@A1 +0@abcdefghijklmnop@abcdefghijklmnop +0@abcdefghijklmnopqrstuv@abcdefghijklmnopqrstuv +0@CC[13]1|a{21}[23][EO][123][Es][12]a{15}aa[34][EW]aaaaaaa[X]a@CC11 +0@a?b@ab +2@b{1000000000}@ESIZE +0@)@) +1@)@x +0@\()\((a\())(b))@()(a()b) +# This would erroneously match from grep-3.2 to grep-3.5 +1@a+a+a@aa diff --git a/src/grep/tests/euc-mb b/src/grep/tests/euc-mb new file mode 100755 index 0000000..c639374 --- /dev/null +++ b/src/grep/tests/euc-mb @@ -0,0 +1,47 @@ +#!/bin/sh +# test that matches starting in the middle of a multibyte char aren't rejected +# too greedily. +# Derived from https://savannah.gnu.org/bugs/?23814 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Add "." to PATH for the use of get-mb-cur-max. +path_prepend_ . + +require_compiled_in_MB_support + +locale=ja_JP.EUC-JP + +make_input () { + echo "$1" | tr AB '\244\263' +} + +euc_grep () { + pat=$(make_input "$1") + LC_ALL=$locale grep "$pat" +} + +case $(get-mb-cur-max $locale) in + 2|3) ;; + *) skip_ 'EUC-JP locale not found' ;; +esac + +fail=0 + +# Does EUC-JP work at all? +make_input BABA |euc_grep AB && fail=1 + +# Here are two cases in which a KWSet search matches in the middle +# of a multibyte character. The first ensures that the DFA matcher +# finds the real match at the end of line. The second ensures that +# while the KWSet match found a false positive, the DFA matcher +# determines there is no match after all. +make_input BABAAB |euc_grep AB > out || fail=1 +make_input BABAAB > exp || framework_failure_ +compare exp out || fail=1 +make_input BABABA |returns_ 1 euc_grep AB || fail=1 +make_input BABABA |returns_ 1 euc_grep '^x\|AB' || fail=1 + +# -P supports only unibyte and UTF-8 locales. +returns_ 2 env LC_ALL=$locale grep -P x /dev/null || fail=1 + +Exit $fail diff --git a/src/grep/tests/false-match-mb-non-utf8 b/src/grep/tests/false-match-mb-non-utf8 new file mode 100755 index 0000000..e618996 --- /dev/null +++ b/src/grep/tests/false-match-mb-non-utf8 @@ -0,0 +1,38 @@ +#! /bin/sh +# Test for false matches in grep 2.19..2.26 in multibyte, non-UTF8 locales +# +# Copyright (C) 2016-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Add "." to PATH for the use of get-mb-cur-max. +path_prepend_ . + +fail=0 + +loc=zh_CN.gb18030 +test "$(get-mb-cur-max $loc)" = 4 || skip_ "no support for the $loc locale" + +# This must not match: the input is a single character, \uC9 followed +# by a newline. But it just so happens that that character is made up +# of four bytes, the last of which is the digit, 7, and grep's DFA +# matcher would mistakenly report that ".*7" matches that input line. +printf '\2010\2077\n' > in || framework_failure_ +returns_ 1 env LC_ALL=$loc grep -E '.*7' in || fail=1 + +returns_ 1 env LC_ALL=$loc grep -E '.{0,1}7' in || fail=1 + +returns_ 1 env LC_ALL=$loc grep -E '.?7' in || fail=1 + +# Similar for the \ue9 code point, which ends in an "m" byte. +loc=zh_HK.big5hkscs +test "$(get-mb-cur-max $loc)" = 2 || skip_ "no support for the $loc locale" + +printf '\210m\n' > in || framework_failure_ +returns_ 1 env LC_ALL=$loc grep '.*m' in || fail=1 + +Exit $fail diff --git a/src/grep/tests/fedora b/src/grep/tests/fedora new file mode 100755 index 0000000..43650f3 --- /dev/null +++ b/src/grep/tests/fedora @@ -0,0 +1,103 @@ +#!/bin/sh + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# GREP Regression test suite for Fedora bugs and fixes +# (c) 2008 Lubomir Rintel +# Licensed under the same terms as GNU Grep itself + +if [ -t 1 ] +then + # Colored output on terminal + G='\033[32m' + R='\033[31m' + D='\033[0m' +fi + +ok () { printf "${G}OK${D}"; } +fail () { printf "${R}FAIL${D} (See ${U})"; failures=1; } + +U=https://bugzilla.redhat.com/show_bug.cgi?id=116909 +printf "fgrep false negatives: " +cat > 116909.list <<EOF +a +b +c +EOF +cat > 116909.in <<EOF +a +barn +c +EOF +cat > 116909.out <<EOF +a +c +EOF +grep -F -w -f 116909.list 116909.in > actual || fail +compare 116909.out actual && ok || fail + +U=https://bugzilla.redhat.com/show_bug.cgi?id=123362 +printf 'bad handling of brackets in UTF-8: ' +echo Y > 123362.out +echo Y | LC_ALL=de_DE.UTF-8 grep -i '[y,Y]' > actual || fail +compare 123362.out actual && ok || fail + +U=https://bugzilla.redhat.com/show_bug.cgi?id=112869 +printf 'crash with \\W: ' +echo '<form>' > 112869.out +LANG=it_IT grep -iE '\Wform\W' 112869.out > actual || fail +compare 112869.out actual && ok || fail + +if ( timeout --version ) > /dev/null 2>&1; then + + U=https://bugzilla.redhat.com/show_bug.cgi?id=189580 + printf 'grep -D skip opening a special file: ' + returns_ 124 timeout 10 grep -D skip foo /dev/zero && fail || ok + + U=https://bugzilla.redhat.com/show_bug.cgi?id=169524 + printf 'grep -Fw looping infinitely: ' + echo foobar | returns_ 124 timeout 10 grep -Fw "" && fail || ok + + U=https://bugzilla.redhat.com/show_bug.cgi?id=140781 + printf 'fgrep hangs on binary files: ' + returns_ 124 timeout 10 grep -F grep "$abs_top_builddir/src/grep" \ + > /dev/null && fail || ok + +fi + +U=https://bugzilla.redhat.com/show_bug.cgi?id=161700 +printf 'grep -Fw fails to match anything: ' +echo test > 161700.out +grep -Fw test 161700.out > actual || fail +compare 161700.out actual && ok || fail + +U=https://bugzilla.redhat.com/show_bug.cgi?id=179698 +printf 'grep -w broken in non-utf8 multibyte locales: ' +echo za a > 179698.out +LANG=ja_JP.eucjp grep -w a 179698.out > actual || fail +compare 179698.out actual && ok || fail + +# Skip the rest of tests in compiled without PCRE +echo a |grep -P a >/dev/null || Exit $failures + +U=https://bugzilla.redhat.com/show_bug.cgi?id=171379 +printf 'grep -P crashes on whitespace lines: ' +echo ' ' > 171379.out +grep -P '^\s+$' 171379.out > actual || fail +compare 171379.out actual && ok || fail + +U=https://bugzilla.redhat.com/show_bug.cgi?id=204255 +printf '%s' "-e '' does not work if not a first parameter: " +echo test | grep -e 'HighlightThis' -e '' > 204255.first +echo test | grep -e '' -e 'HighlightThis' > 204255.second +diff 204255.first 204255.second && ok || fail + +U=https://bugzilla.redhat.com/show_bug.cgi?id=324781 +printf 'bad handling of line breaks with grep -P #1: ' +printf 'a\na' | grep -P '[^a]' >/dev/null && fail || ok + +# This is mostly a check that fix for above doesn't break -P further +printf '%s' "bad handling of line breaks with grep -P #2: " +printf 'a\na' | grep -P '[^b].[^b]' >/dev/null && fail || ok + +Exit $failures diff --git a/src/grep/tests/fgrep-infloop b/src/grep/tests/fgrep-infloop new file mode 100755 index 0000000..015ec74 --- /dev/null +++ b/src/grep/tests/fgrep-infloop @@ -0,0 +1,27 @@ +#!/bin/sh +# This would infloop for grep-2.6.1 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_timeout_ +require_compiled_in_MB_support + +encode() { echo "$1" | tr ABC '\357\274\241'; } + +encode ABC > in || framework_failure_ +fail=0 + +for LOC in en_US.UTF-8 $LOCALE_FR_UTF8; do + out=out1-$LOC + LC_ALL=$LOC timeout 10s grep -F "$(encode BC)" in > $out + status=$? + if test $status -eq 0; then + compare in $out + elif test $status -eq 1; then + compare_dev_null_ /dev/null $out + else + test $status -eq 2 + fi || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/fgrep-longest b/src/grep/tests/fgrep-longest new file mode 100755 index 0000000..9fd9879 --- /dev/null +++ b/src/grep/tests/fgrep-longest @@ -0,0 +1,23 @@ +#! /bin/sh +# With multiple matches, grep -Fo could print a shorter one. +# This bug affected grep versions 2.26 through 2.27. +# +# Copyright (C) 2017-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# The erroneous versions would print "c", rather than the longer match, "bce". +printf 'abce\n' > in || framework_failure_ +printf 'abcd\nc\nbce\n' > pat || framework_failure_ +printf 'bce\n' > exp || framework_failure_ + +LC_ALL=C grep -Fof pat in > out || fail=1 +compare exp out || fail=1 + +Exit $fail diff --git a/src/grep/tests/file b/src/grep/tests/file new file mode 100755 index 0000000..236d9f0 --- /dev/null +++ b/src/grep/tests/file @@ -0,0 +1,63 @@ +#! /bin/sh +# Test for POSIX options for grep: +# grep -E -f pattern_file file +# grep -F -f pattern_file file +# grep -G -f pattern_file file +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +cat <<EOF >patfile +radar +MILES +GNU +EOF + +# match +echo "miles" | grep -i -E -f patfile > /dev/null 2>&1 +if test $? -ne 0 ; then + echo "File_pattern: Wrong status code, test \#1 failed" + fail=1 +fi + +# match +echo "GNU" | grep -G -f patfile > /dev/null 2>&1 +if test $? -ne 0 ; then + echo "File_pattern: Wrong status code, test \#2 failed" + fail=1 +fi + +# checking for no match +echo "ridar" | grep -F -f patfile > /dev/null 2>&1 +if test $? -ne 1 ; then + echo "File_pattern: Wrong status code, test \#3 failed" + fail=1 +fi + +cat <<EOF >patfile + +EOF +# empty pattern : every match +echo "abbcd" | grep -F -f patfile > /dev/null 2>&1 +if test $? -ne 0 ; then + echo "File_pattern: Wrong status code, test \#4 failed" + fail=1 +fi + +cp /dev/null patfile + +# null pattern : no match +echo "abbcd" | grep -F -f patfile > /dev/null 2>&1 +if test $? -ne 1 ; then + echo "File_pattern: Wrong status code, test \#5 failed" + fail=1 +fi + +Exit $fail diff --git a/src/grep/tests/filename-lineno.pl b/src/grep/tests/filename-lineno.pl new file mode 100755 index 0000000..1e84b45 --- /dev/null +++ b/src/grep/tests/filename-lineno.pl @@ -0,0 +1,130 @@ +#!/usr/bin/perl +# Prior to 2.26, an invalid regexp in a -f-specified file would elicit +# a diagnostic like "Unmatched [ or [^", with no indication of the +# file or line number from which the offending regular expression came. +# With 2.26, now, each such diagnostic has a "FILENAME:LINENO: " prefix. + +# Copyright (C) 2016-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +use strict; + +(my $program_name = $0) =~ s|.*/||; + +my $prog = 'grep'; +my $full_prog_name = `$prog --no-such-option 2>&1`; +$full_prog_name =~ s/:.*//s; +$prog = $full_prog_name if $full_prog_name; + +# Turn off localization of executable's output. +@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; + +# There are at least two variants of one diagnostic: +# - Unmatched [, [^, [:, [., or [= +# - Unmatched [ or [^ +# Transform each to this: "Unmatched [..." +my $err_subst = {ERR_SUBST => 's/(: Unmatched \[).*/$1.../'}; + +my $no_pcre = "$prog: Perl matching not supported in a --disable-perl-regexp build\n"; + +my @Tests = + ( + # Show that grep now includes filename:lineno in the diagnostic: + ['invalid-re', '-f g', {AUX=>{g=>"1\n2\n3\n4[[\n"}}, {EXIT=>2}, + $err_subst, + {ERR => "$prog: g:4: Unmatched [...\n"}, + ], + + # Show that with two or more errors, grep now prints all diagnostics: + ['invalid-re-2-files', '-f g -f h', {EXIT=>2}, + {AUX=>{g=>"1\n2[[\n3\n4[[\n"}}, + {AUX=>{h=>"5\n6\n7[[\n"}}, + $err_subst, + {ERR => "$prog: g:2: Unmatched [...\n" + . "$prog: g:4: Unmatched [...\n" + . "$prog: h:3: Unmatched [...\n" + }, + ], + + # Like the above, but on the other lines. + ['invalid-re-2-files2', '-f g -f h', {EXIT=>2}, + {AUX=>{g=>"1[[\n2\n3[[\n4\n"}}, + {AUX=>{h=>"5[[\n6[[\n7\n"}}, + $err_subst, + {ERR => "$prog: g:1: Unmatched [...\n" + . "$prog: g:3: Unmatched [...\n" + . "$prog: h:1: Unmatched [...\n" + . "$prog: h:2: Unmatched [...\n" + }, + ], + + # Make sure the line numbers are right when some regexps are duplicates. + ['invalid-re-line-numbers', '-f g -f h', {EXIT=>2}, + {AUX=>{g=>"1[[\n\n3[[\n\n5[[\n"}}, + {AUX=>{h=>"1[[\n\n\n4[[\n\n6[[\n"}}, + $err_subst, + {ERR => "$prog: g:1: Unmatched [...\n" + . "$prog: g:3: Unmatched [...\n" + . "$prog: g:5: Unmatched [...\n" + . "$prog: h:4: Unmatched [...\n" + . "$prog: h:6: Unmatched [...\n" + }, + ], + + # Show that with two '-e'-specified erroneous regexps, + # there is no file name or line number. + ['invalid-re-2e', '-e "1[[" -e "2[["', {EXIT=>2}, + $err_subst, + {ERR => "$prog: Unmatched [...\n" x 2}, + ], + + # Test unmatched ) as well. It is OK with -E and an error with -G and -P. + ['invalid-re-E-paren', '-E ")"', {IN=>''}, {EXIT=>1}], + ['invalid-re-E-star-paren', '-E ".*)"', {IN=>''}, {EXIT=>1}], + ['invalid-re-G-paren', '-G "\\)"', {EXIT=>2}, + {ERR => "$prog: Unmatched ) or \\)\n"}, + ], + ['invalid-re-G-star-paren', '-G "a.*\\)"', {EXIT=>2}, + {ERR => "$prog: Unmatched ) or \\)\n"}, + ], + ['invalid-re-P-paren', '-P ")"', {EXIT=>2}, + {ERR => $ENV{PCRE_WORKS} == 1 + ? "$prog: unmatched parentheses\n" + : $no_pcre + }, + ], + ['invalid-re-P-star-paren', '-P "a.*)"', {EXIT=>2}, + {ERR => $ENV{PCRE_WORKS} == 1 + ? "$prog: unmatched parentheses\n" + : $no_pcre + }, + ], + + # Prior to grep-3.6, the name of the offending file was not printed. + ['backtracking-with-file', '-P "((a+)*)+$"', {EXIT=>2}, + {IN=>{f=>"a"x20 ."b"}}, + {ERR => $ENV{PCRE_WORKS} == 1 + ? "$prog: f: exceeded PCRE's backtracking limit\n" + : $no_pcre + }, + ], + + ); + +my $save_temps = $ENV{DEBUG}; +my $verbose = $ENV{VERBOSE}; + +my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); +exit $fail; diff --git a/src/grep/tests/fmbtest b/src/grep/tests/fmbtest new file mode 100755 index 0000000..5fada35 --- /dev/null +++ b/src/grep/tests/fmbtest @@ -0,0 +1,126 @@ +#! /bin/sh +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +cz=cs_CZ.UTF-8 + +# If cs_CZ.UTF-8 locale doesn't work, skip this test. +LC_ALL=$cz locale -k LC_CTYPE 2>/dev/null | grep -q charmap.*UTF-8 \ + || skip_ this system lacks the $cz locale + +# If matching is done in single-byte mode, skip this test too +printf 'é\n' | LC_ALL=$cz grep -Eq '^[é]{2}$' +case $? in + 0) skip_ "built without multi-byte support";; + 1) ;; + *) fail_ "unexpected exit status: $?";; +esac + +failures=0 + +cat > csinput <<EOF +01 Žluťoučká číše +ČíŠE 02 +03 Z číší Čiší cosi +04 Čí +Še 05 +06 ČČČČČČČíšČÍŠčíš +07 ČČČ ČČČČíšČÍŠčíšEEEE +čAs 08 +09Čapka +10ČaSy se měnÍ +ČÍšE11 +Čas12 +𝇕ČÍšE𝇓13 +ŽČÍšE𝇓14 +𝇕ČÍšEŽ15 +ŽČÍšEŽ16 +ČÍšE𝇓17 +ČÍšEŽ18 +19𝇕ČÍše +20ŽČÍše +EOF +cat > cspatfile <<EOF +ČÍšE +Čas +EOF + +for mode in F G E; do + +test1=$(echo $(LC_ALL=$cz grep -${mode} -f cspatfile csinput | + tr -cs '0-9' '[ *]')) +if test "$test1" != "11 12 13 14 15 16 17 18"; then + echo "Test #1 ${mode} failed: $test1" + failures=1 +fi + +test2=$(echo $(LC_ALL=$cz grep -${mode}i -f cspatfile csinput | + tr -cs '0-9' '[ *]')) +if test "$test2" != "01 02 07 08 10 11 12 13 14 15 16 17 18 19 20"; then + echo "Test #2 ${mode} failed: $test2" + failures=1 +fi + +test3=$(echo $(LC_ALL=$cz grep -${mode}i -e 'ČÍšE' -e 'Čas' csinput | + tr -cs '0-9' '[ *]')) +if test "$test3" != "01 02 07 08 10 11 12 13 14 15 16 17 18 19 20"; then + echo "Test #3 ${mode} failed: $test3" + failures=1 +fi + +# Skip the next test - known to fail. TAA. +#test4=$(echo $(LC_ALL=$cz; export LC_ALL +# grep -${mode}iw -f cspatfile csinput | +# sed 's/[^0123456789]/ /g')) +#if test "$test4" != "01 02 08 13 17 19"; then +# echo "Test #4 ${mode} failed: $test4" +# failures=1 +#fi + +# Test that --color=always does not depend on individual pattern order +# within the pattern list, and that a longer match is preferred to a +# shorter one starting at the same point. +test6="$(echo 'Cosi tu ČišÍ...' \ + | LC_ALL=$cz grep --color=always -${mode}i -e 'čiš' -e 'čiší')" +if echo "$test6" \ + | LC_ALL=C grep -q 'Cosi tu .*\[.*m\(.\[K\)\?ČišÍ.*\[.*m\(.\[K\)\?\.\.\.'; \ +then + : +else + echo "Test #6 ${mode} failed: $test6" + failures=1 +fi + +# Test that --color=always does not depend on individual pattern order +# within the pattern list, and that a longer match is preferred to a +# shorter one starting at the same point. +test7="$(echo 'Cosi tu ČišÍ...' \ + | LC_ALL=$cz grep --color=always -${mode}i -e 'čiší' -e 'čiš')" +if echo "$test7" \ + | LC_ALL=C grep -q 'Cosi tu .*\[.*m\(.\[K\)\?ČišÍ.*\[.*m\(.\[K\)\?\.\.\.'; \ +then + : +else + echo "Test #7 ${mode} failed: $test7" + failures=1 +fi + +done + +for mode in G E; do + +test8=$(echo $(LC_ALL=$cz grep -${mode}i -e 'Č.šE' -e 'Č[a-f]s' csinput | + tr -cs '0-9' '[ *]')) +if test "$test8" != "01 02 07 08 10 11 12 13 14 15 16 17 18 19 20"; then + echo "Test #8 ${mode} failed: $test8" + failures=1 +fi + +done + +Exit $failures diff --git a/src/grep/tests/foad1 b/src/grep/tests/foad1 new file mode 100755 index 0000000..588107d --- /dev/null +++ b/src/grep/tests/foad1 @@ -0,0 +1,211 @@ +#! /bin/sh +# Test various combinations of command-line options. +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. +# +# This set of tests was started by Julian Foad. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +failures=0 + +# grep_test INPUT EXPECTED_OUTPUT PATTERN_AND_OPTIONS... +# Run "grep" with the given INPUT, pattern and options, and check that +# the output is EXPECTED_OUTPUT. If not, print a message and set 'failures'. +# "/" represents a newline within INPUT and EXPECTED_OUTPUT. +grep_test () +{ + INPUT="$1" + EXPECT="$2" + shift 2 + OUTPUT=$(printf %s "$INPUT" | tr "/" "\n" | grep "$@" | tr "\n" "/") + if test "$OUTPUT" != "$EXPECT" || test "$VERBOSE" = "yes"; then + echo "Testing: grep $@" + test "$LC_ALL" != C && test "$LC_ALL" != "" && echo " LC_ALL: \"$LC_ALL\"" + echo " input: \"$INPUT\"" + echo " output: \"$OUTPUT\"" + fi + if test "$OUTPUT" != "$EXPECT"; then + echo " expect: \"$EXPECT\"" + echo "FAIL" + failures=1 + fi +} + + +# Test "--only-matching" ("-o") option + +# "-o" with "-i" should output an exact copy of the matching input text. +grep_test "WordA/wordB/WORDC/" "Word/word/WORD/" "word" -o -i +grep_test "WordA/wordB/WORDC/" "Word/word/WORD/" "Word" -o -i +grep_test "WordA/wordB/WORDC/" "Word/word/WORD/" "WORD" -o -i + +# Should display the line number (-n), octet offset (-b), or file name +# (-H) of every match, not just of the first match on each input line. +# Check it both with and without -i because of the separate code paths. +# Also check what it does when lines of context are specified. +grep_test "wA wB/wC/" "1:wA/1:wB/2:wC/" "w." -o -n +grep_test "wA wB/wC/" "1:wA/1:wB/2:wC/" "w." -o -n -i +grep_test "wA wB/wC/" "1:wA/1:wB/2:wC/" "w." -o -n -3 2>/dev/null +grep_test "XwA YwB/ZwC/" "1:wA/5:wB/9:wC/" "w." -o -b +grep_test "XwA YwB/ZwC/" "1:wA/5:wB/9:wC/" "w." -o -b -i +grep_test "XwA YwB/ZwC/" "1:wA/5:wB/9:wC/" "w." -o -b -3 2>/dev/null +grep_test "XwA YwB/ZwC/" "1:w/5:w/9:w/" "w" -F -o -b +grep_test "XwA YwB/ZwC/" "1:w/5:w/9:w/" "w" -F -o -b -i +grep_test "XwA YwB/ZwC/" "1:w/5:w/9:w/" "w" -F -o -b -3 2>/dev/null +grep_test "wA wB/" "(standard input):wA/(standard input):wB/" "w." -o -H +grep_test "wA wB/" "(standard input):wA/(standard input):wB/" "w." -o -H -i +grep_test "wA wB/" "(standard input):wA/(standard input):wB/" "w." -o -H -3 2>/dev/null + +# Combination of -h and -H +grep_test "wA wB/" "wA wB/" "w." +grep_test "wA wB/" "wA wB/" "w." -h +grep_test "wA wB/" "wA wB/" "w." -H -h +grep_test "wA wB/" "(standard input):wA wB/" "w." -H +grep_test "wA wB/" "(standard input):wA wB/" "w." -h -H + +# End of a previous match should not match a "start of ..." expression. +grep_test "word_word/" "word_/" "^word_*" -o +grep_test "wordword/" "word/" "\<word" -o + + +# Test "--color" option + +CB="[01;31m[K" +CE="[m[K" + +# "--color" with "-i" should output an exact copy of the matching input text. +grep_test "WordA/wordb/WORDC/" "${CB}Word${CE}A/${CB}word${CE}b/${CB}WORD${CE}C/" "word" --color=always -i +grep_test "WordA/wordb/WORDC/" "${CB}Word${CE}A/${CB}word${CE}b/${CB}WORD${CE}C/" "Word" --color=always -i +grep_test "WordA/wordb/WORDC/" "${CB}Word${CE}A/${CB}word${CE}b/${CB}WORD${CE}C/" "WORD" --color=always -i + +# End of a previous match should not match a "start of ..." expression. +grep_test "word_word/" "${CB}word_${CE}word/" "^word_*" --color=always +grep_test "wordword/" "${CB}word${CE}word/" "\<word" --color=always + + +# Test combination of "-m" with "-A" and anchors. +# Based on a report from Pavol Gono. +grep_test "4/40/" "4/40/" "^4$" -m1 -A99 +grep_test "4/04/" "4/04/" "^4$" -m1 -A99 +grep_test "4/444/" "4/444/" "^4$" -m1 -A99 +grep_test "4/40/" "4/40/" "^4" -m1 -A99 +grep_test "4/04/" "4/04/" "^4" -m1 -A99 +grep_test "4/444/" "4/444/" "^4" -m1 -A99 +grep_test "4/40/" "4/40/" "4$" -m1 -A99 +grep_test "4/04/" "4/04/" "4$" -m1 -A99 +grep_test "4/444/" "4/444/" "4$" -m1 -A99 + + +# Test for "-F -w" bugs. Thanks to Gordon Lack for these two. +grep_test "A/CX/B/C/" "A/B/C/" -wF -e A -e B -e C +grep_test "LIN7C 55327/" "" -wF -e 5327 -e 5532 + +# Test for non-empty matches following empty ones. +grep_test 'xyz/' 'y/' -o 'y*' +grep_test 'xyz/' "x${CB}y${CE}z/" --color=always 'y*' + +# Test for increasing/decreasing-length word matches, +# for independence from pattern order within the pattern list, +# and for preferring the longest match at a given position. +x0='a bb ccc dddd/' +x1='dddd ccc bb a/' +x2='bcd abcd abc bc bcd abc/' +x3='bc abcd bc/' +y0="a ${CB}bb${CE} ${CB}ccc${CE} dddd/" +y1="dddd ${CB}ccc${CE} ${CB}bb${CE} a/" +y2="bcd abcd abc ${CB}bc${CE} bcd abc/" +y3="${CB}bc${CE} abcd ${CB}bc${CE}/" +grep_test "$x0" "$y0" -E --color=always -e bb -e cc -e ccc +grep_test "$x0" "$y0" -F --color=always -e bb -e cc -e ccc +grep_test "$x0" "$y0" -E --color=always -e bb -e ccc -e cc +grep_test "$x0" "$y0" -F --color=always -e bb -e ccc -e cc +grep_test "$x0" "$y0" -E -w --color=always -e bb -e ccc +grep_test "$x0" "$y0" -F -w --color=always -e bb -e ccc +grep_test "$x0" "$y0" -E -w --color=always -e ccc -e bb +grep_test "$x0" "$y0" -F -w --color=always -e ccc -e bb +grep_test "$x1" "$y1" -E -w --color=always -e bb -e ccc +grep_test "$x1" "$y1" -F -w --color=always -e bb -e ccc +grep_test "$x1" "$y1" -E -w --color=always -e ccc -e bb +grep_test "$x1" "$y1" -F -w --color=always -e ccc -e bb +grep_test "$x2" "$y2" -E -w --color=always bc +grep_test "$x2" "$y2" -F -w --color=always bc +grep_test "$x3" "$y3" -E -w --color=always bc +grep_test "$x3" "$y3" -F -w --color=always bc + +# Bug#25655 +grep_test .tar/ .tar/ -e '\.tar' -e '\.tbz' +grep_test .tar/ .tar/ -o -e '\.tar' -e 'tar' +grep_test '$*.[^\/' '$*.[^\/' -o -e '\$\*\.\[\^\\' -e abc +grep_test '$*.[^\/(+?{|/' '$*.[^\/(+?{|/' -o -E \ + -e '\$\*\.\[\^\\' -e '\(\+\?\{\|' + +# Skip the rest of the tests - known to fail. TAA. +Exit $failures + +# The rest of this file is meant to be executed under this locale. +LC_ALL=cs_CZ.UTF-8; export LC_ALL +# If the UTF-8 locale doesn't work, skip these tests silently. +locale -k LC_CTYPE 2>/dev/null | grep -q "charmap.*UTF-8" || Exit $failures + +# Test character class erroneously matching a '[' character. +grep_test "[/" "" "[[:alpha:]]" -E + +for mode in F G E; do + # Hint: pipe the output of these tests in + # "| LESS= LESSCHARSET=ascii less". + # LETTER N WITH TILDE is U+00F1 and U+00D1. + # LETTER Y WITH DIAERESIS is U+00FF and U+0178. + grep_test 'añÿb/AÑŸB/' 'ñÿ/ÑŸ/' 'ñÿ' -o -i -$mode + grep_test 'añÿb/AÑŸB/' 'ñÿ/ÑŸ/' 'ÑŸ' -o -i -$mode + grep_test 'añÿb/AÑŸB/' "a${CB}ñÿ${CE}b/A${CB}ÑŸ${CE}B/" 'ñÿ' --color=always -i -$mode + grep_test 'añÿb/AÑŸB/' "a${CB}ñÿ${CE}b/A${CB}ÑŸ${CE}B/" 'ÑŸ' --color=always -i -$mode + + # POSIX (about -i): ... each character in the string is matched + # against the pattern, not only the character, but also its case + # counterpart (if any), shall be matched. + # The following were chosen because of their trickiness due to the + # differing UTF-8 octet length of their counterpart and to the + # non-reflexivity of their mapping. + # Beware of homographs! Look carefully at the actual octets. + + # lc(U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE) = U+0069 LATIN SMALL LETTER I + grep_test 'aİb/' "a${CB}İ${CE}b/" 'i' --color=always -i -$mode + grep_test 'aib/' '' 'İ' --color=always -i -$mode + grep_test 'aİb/' '' 'I' --color=always -i -$mode + # uc(U+0131 LATIN SMALL LETTER DOTLESS I) = U+0049 LATIN CAPITAL LETTER I + grep_test 'aıb/' "a${CB}ı${CE}b/" 'I' --color=always -i -$mode + grep_test 'aIb/' '' 'ı' --color=always -i -$mode + grep_test 'aıb/' '' 'i' --color=always -i -$mode + # uc(U+017F LATIN SMALL LETTER LONG S) = U+0053 LATIN CAPITAL LETTER S + grep_test 'aſb/' "a${CB}ſ${CE}b/" 'S' --color=always -i -$mode + grep_test 'aSb/' '' 'ſ' --color=always -i -$mode + grep_test 'aſb/' '' 's' --color=always -i -$mode + # uc(U+1FBE GREEK PROSGEGRAMMENI) = U+0399 GREEK CAPITAL LETTER IOTA + grep_test 'aιb/' "a${CB}ι${CE}b/" 'Ι' --color=always -i -$mode + grep_test 'aΙb/' '' 'ι' --color=always -i -$mode + grep_test 'aιb/' '' 'ι' --color=always -i -$mode + # lc(U+2126 OHM SIGN) = U+03C9 GREEK SMALL LETTER OMEGA + grep_test 'aΩb/' "a${CB}Ω${CE}b/" 'ω' --color=always -i -$mode + grep_test 'aωb/' '' 'Ω' --color=always -i -$mode + grep_test 'aΩb/' '' 'Ω' --color=always -i -$mode + # lc(U+212A KELVIN SIGN) = U+006B LATIN SMALL LETTER K + grep_test 'aKb/' "a${CB}K${CE}b/" 'k' --color=always -i -$mode + grep_test 'akb/' '' 'K' --color=always -i -$mode + grep_test 'aKb/' '' 'K' --color=always -i -$mode + # lc(U+212B ANGSTROM SIGN) = U+00E5 LATIN SMALL LETTER A WITH RING ABOVE + grep_test 'aÅb/' "a${CB}Å${CE}b/" 'å' --color=always -i -$mode + grep_test 'aåb/' '' 'Å' --color=always -i -$mode + grep_test 'aÅb/' '' 'Å' --color=always -i -$mode +done + + +# Any tests inserted right here will be performed under an UTF-8 locale. +# Insert them before LC_ALL is set above to avoid this. +# Leave this comment last. + +Exit $failures diff --git a/src/grep/tests/get-mb-cur-max.c b/src/grep/tests/get-mb-cur-max.c new file mode 100644 index 0000000..4b2e40e --- /dev/null +++ b/src/grep/tests/get-mb-cur-max.c @@ -0,0 +1,36 @@ +/* Auxiliary program to detect support for a locale. + Copyright 2010-2021 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#include <config.h> +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> + +#include "getprogname.h" + +int +main (int argc, char **argv) +{ + if (1 < argc && setlocale (LC_ALL, argv[1])) + { + printf ("%d\n", (int) MB_CUR_MAX); + exit (EXIT_SUCCESS); + } + + exit (EXIT_FAILURE); +} diff --git a/src/grep/tests/grep-dev-null b/src/grep/tests/grep-dev-null new file mode 100755 index 0000000..49a9385 --- /dev/null +++ b/src/grep/tests/grep-dev-null @@ -0,0 +1,20 @@ +#!/bin/sh +# Case-insensitive grep with a 0-size input file would fail in grep up to 2.6.3 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +LC_ALL=en_US.UTF-8 +export LC_ALL + +echo x | returns_ 1 grep -f /dev/null || fail=1 +echo x | returns_ 1 grep -if /dev/null || fail=1 +echo x | returns_ 1 grep -Ff /dev/null || fail=1 +echo x | returns_ 1 grep -Fif /dev/null || fail=1 + +returns_ 1 grep -f /dev/null < /dev/null || fail=1 +returns_ 1 grep -if /dev/null < /dev/null || fail=1 +returns_ 1 grep -Ff /dev/null < /dev/null || fail=1 +returns_ 1 grep -Fif /dev/null < /dev/null || fail=1 + +Exit $fail diff --git a/src/grep/tests/grep-dev-null-out b/src/grep/tests/grep-dev-null-out new file mode 100755 index 0000000..397a3f1 --- /dev/null +++ b/src/grep/tests/grep-dev-null-out @@ -0,0 +1,13 @@ +#!/bin/sh +# Outputting to /dev/null. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_timeout_ + +${AWK-awk} 'BEGIN {while (1) print "x"}' </dev/null | + returns_ 124 timeout 10 grep x >/dev/null || fail=1 + +echo abc | grep b >>/dev/null || fail=1 + +Exit $fail diff --git a/src/grep/tests/grep-dir b/src/grep/tests/grep-dir new file mode 100755 index 0000000..4947512 --- /dev/null +++ b/src/grep/tests/grep-dir @@ -0,0 +1,31 @@ +#!/bin/sh +# Case-insensitive grep with a 0-size input file would fail in grep up to 2.6.3 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +mkdir a || framework_failure + +# Lower and upper bound of valid exit status for "grep -f DIR", +# when reading from empty and nonempty files, respectively. +if cat a >acopy 2>&1 && cmp a acopy; then + l=1 u=1 L=0 U=1 +else + l=2 u=127 L=2 U=127 +fi + +status_range () +{ + status=$? + { test $1 -le $status && test $status -le $2; } || fail=1 +} + +echo x | grep -f a/; status_range $L $U +echo x | grep -if a/; status_range $L $U +echo x | grep -Ff a/; status_range $L $U +echo x | grep -Fif a/; status_range $L $U + +grep -f a/ < /dev/null; status_range $l $u +grep -if a/ < /dev/null; status_range $l $u +grep -Ff a/ < /dev/null; status_range $l $u +grep -Fif a/ < /dev/null; status_range $l $u + +Exit $fail diff --git a/src/grep/tests/hash-collision-perf b/src/grep/tests/hash-collision-perf new file mode 100755 index 0000000..898b496 --- /dev/null +++ b/src/grep/tests/hash-collision-perf @@ -0,0 +1,53 @@ +#!/bin/sh +# Test for this performance regression: +# grep-3.5 and 3.6 would take O(N^2) time for some sets of input regexps. + +# Copyright 2020-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +: > empty || framework_failure_ + +# Construct a test case that consumes enough CPU time that we don't +# have to worry about measurement noise. This first case is searching +# for digits, which never exhibited a problem with hash collisions. +n_pat=40000 +while :; do + seq $n_pat > in || framework_failure_ + small_ms=$(LC_ALL=C user_time_ 1 grep --file=in empty) || fail=1 + test $small_ms -ge 200 && break + n_pat=$(expr $n_pat '*' 2) +done + +# Now, search for those same digits mapped to A-J. +# With the PJW-based hash function, this became O(N^2). +seq $n_pat | tr 0-9 A-J > in || framework_failure_ +large_ms=$(LC_ALL=C user_time_ 1 grep --file=in empty) || fail=1 + +# Deliberately recording in an unused variable so it +# shows up in set -x output, in case this test fails. +ratio=$(expr "$large_ms" / "$small_ms") +warn_ ratio=$ratio + +# The duration of the latter run must be no more than 10 times +# that of the former. Using recent versions prior to this fix, +# this test would fail due to ratios > 800. Using the fixed version, +# it's common to see a ratio less than 1. +returns_ 1 expr $small_ms '<' $large_ms / 10 || fail=1 + +Exit $fail diff --git a/src/grep/tests/help-version b/src/grep/tests/help-version new file mode 100755 index 0000000..44015ce --- /dev/null +++ b/src/grep/tests/help-version @@ -0,0 +1,276 @@ +#!/bin/sh +# Make sure all of these programs work properly +# when invoked with --help or --version. + +# Copyright (C) 2000-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Terminate any background processes +cleanup_() { kill $pid 2>/dev/null && wait $pid; } + +expected_failure_status_chroot=125 +expected_failure_status_env=125 +expected_failure_status_nice=125 +expected_failure_status_nohup=125 +expected_failure_status_stdbuf=125 +expected_failure_status_timeout=125 +expected_failure_status_printenv=2 +expected_failure_status_tty=3 +expected_failure_status_sort=2 +expected_failure_status_expr=3 +expected_failure_status_lbracket=2 +expected_failure_status_dir=2 +expected_failure_status_ls=2 +expected_failure_status_vdir=2 + +expected_failure_status_cmp=2 +expected_failure_status_zcmp=2 +expected_failure_status_sdiff=2 +expected_failure_status_diff3=2 +expected_failure_status_diff=2 +expected_failure_status_zdiff=2 +expected_failure_status_zgrep=2 +expected_failure_status_zegrep=2 +expected_failure_status_zfgrep=2 + +expected_failure_status_grep=2 +expected_failure_status_egrep=2 +expected_failure_status_fgrep=2 + +test "$built_programs" \ + || fail_ "built_programs not specified!?!" + +test "$VERSION" \ + || fail_ "set envvar VERSION; it is required for a PATH sanity-check" + +# Extract version from --version output of the first program +for i in $built_programs; do + v=$(env $i --version | sed -n '1s/.* //p;q') + break +done + +# Ensure that it matches $VERSION. +test "x$v" = "x$VERSION" \ + || fail_ "--version-\$VERSION mismatch" + +for lang in C fr da; do + for i in $built_programs; do + + # Skip 'test'; it doesn't accept --help or --version. + test $i = test && continue + + # false fails even when invoked with --help or --version. + # true and false are tested with these options separately. + test $i = false || test $i = true && continue + + # The just-built install executable is always named 'ginstall'. + test $i = install && i=ginstall + + # Make sure they exit successfully, under normal conditions. + env $i --help > h-$i || fail=1 + env $i --version >/dev/null || fail=1 + + # Make sure they mention the bug-reporting address in --help output. + grep "$PACKAGE_BUGREPORT" h-$i > /dev/null || fail=1 + rm -f h-$i + + # Make sure they fail upon 'disk full' error. + if test -w /dev/full && test -c /dev/full; then + test $i = [ && prog=lbracket || prog=$(echo $i|sed "s/$EXEEXT$//") + eval "expected=\$expected_failure_status_$prog" + test x$expected = x && expected=1 + + returns_ $expected env $i --help >/dev/full 2>/dev/null && + returns_ $expected env $i --version >/dev/full 2>/dev/null || + { + fail=1 + env $i --help >/dev/full 2>/dev/null + status=$? + echo "*** $i: bad exit status '$status' (expected $expected)," 1>&2 + echo " with --help or --version output redirected to /dev/full" 1>&2 + } + fi + done +done + +bigZ_in=bigZ-in.Z +zin=zin.gz +zin2=zin2.gz + +tmp=tmp-$$ +tmp_in=in-$$ +tmp_in2=in2-$$ +tmp_dir=dir-$$ +tmp_out=out-$$ +mkdir $tmp || fail=1 +cd $tmp || fail=1 + +comm_setup () { args="$tmp_in $tmp_in"; } +csplit_setup () { args="$tmp_in //"; } +cut_setup () { args='-f 1'; } +join_setup () { args="$tmp_in $tmp_in"; } +tr_setup () { args='a a'; } + +chmod_setup () { args="a+x $tmp_in"; } +# Punt on these. +chgrp_setup () { args=--version; } +chown_setup () { args=--version; } +mkfifo_setup () { args=--version; } +mknod_setup () { args=--version; } +# Punt on uptime, since it fails (e.g., failing to get boot time) +# on some systems, and we shouldn't let that stop 'make check'. +uptime_setup () { args=--version; } + +# Create a file in the current directory, not in $TMPDIR. +mktemp_setup () { args=mktemp.XXXX; } + +cmp_setup () { args="$tmp_in $tmp_in2"; } + +# Tell dd not to print the line with transfer rate and total. +# The transfer rate would vary between runs. +dd_setup () { args=status=noxfer; } + +zdiff_setup () { args="$zin $zin2"; } +zcmp_setup () { args="$zin $zin2"; } +zcat_setup () { args=$zin; } +gunzip_setup () { args=$zin; } +zmore_setup () { args=$zin; } +zless_setup () { args=$zin; } +znew_setup () { args=$bigZ_in; } +zforce_setup () { args=$zin; } +zgrep_setup () { args="z $zin"; } +zegrep_setup () { args="z $zin"; } +zfgrep_setup () { args="z $zin"; } +gzexe_setup () { args=$tmp_in; } + +# We know that $tmp_in contains a "0" +grep_setup () { args="0 $tmp_in"; } +egrep_setup () { args="0 $tmp_in"; } +fgrep_setup () { args="0 $tmp_in"; } + +diff_setup () { args="$tmp_in $tmp_in2"; } +sdiff_setup () { args="$tmp_in $tmp_in2"; } +diff3_setup () { args="$tmp_in $tmp_in2 $tmp_in2"; } +cp_setup () { args="$tmp_in $tmp_in2"; } +ln_setup () { args="$tmp_in ln-target"; } +ginstall_setup () { args="$tmp_in $tmp_in2"; } +mv_setup () { args="$tmp_in $tmp_in2"; } +mkdir_setup () { args=$tmp_dir/subdir; } +realpath_setup () { args=$tmp_in; } +rmdir_setup () { args=$tmp_dir; } +rm_setup () { args=$tmp_in; } +shred_setup () { args=$tmp_in; } +touch_setup () { args=$tmp_in2; } +truncate_setup () { args="--reference=$tmp_in $tmp_in2"; } + +mkid_setup () { printf 'f(){}\ntypedef int t;\n' > f.c; args=. ; } +lid_setup () { args=; } +fid_setup () { args=f.c; } +fnid_setup () { args=; } +xtokid_setup () { args=; } +aid_setup () { args=f; } +eid_setup () { args=--version; } +gid_setup () { args=f; } +defid_setup () { args=t; } + +basename_setup () { args=$tmp_in; } +dirname_setup () { args=$tmp_in; } +expr_setup () { args=foo; } + +# Punt, in case GNU 'id' hasn't been installed yet. +groups_setup () { args=--version; } + +pathchk_setup () { args=$tmp_in; } +yes_setup () { args=--version; } +logname_setup () { args=--version; } +nohup_setup () { args=--version; } +printf_setup () { args=foo; } +seq_setup () { args=10; } +sleep_setup () { args=0; } +stdbuf_setup () { args="-oL true"; } +timeout_setup () { args=--version; } + +# I'd rather not run sync, since it spins up disks that I've +# deliberately caused to spin down (but not unmounted). +sync_setup () { args=--version; } + +test_setup () { args=foo; } + +# This is necessary in the unusual event that there is +# no valid entry in /etc/mtab. +df_setup () { args=/; } + +# This is necessary in the unusual event that getpwuid (getuid ()) fails. +id_setup () { args=-u; } + +# Use env to avoid invoking built-in sleep of Solaris 11's /bin/sh. +kill_setup () { + external=env + $external sleep 10m & pid=$! + args=$pid +} + +link_setup () { args="$tmp_in link-target"; } +unlink_setup () { args=$tmp_in; } + +readlink_setup () { + ln -s . slink + args=slink; +} + +stat_setup () { args=$tmp_in; } +unlink_setup () { args=$tmp_in; } +lbracket_setup () { args=": ]"; } + +parted_setup () { args="-s $tmp_in mklabel gpt" + dd if=/dev/null of=$tmp_in seek=2000; } + +# Ensure that each program "works" (exits successfully) when doing +# something more than --help or --version. +for i in $built_programs; do + # Skip these. + case $i in chroot|stty|tty|false|chcon|runcon|coreutils) continue;; esac + + rm -rf $tmp_in $tmp_in2 $tmp_dir $tmp_out $bigZ_in $zin $zin2 + echo z |gzip > $zin + cp $zin $zin2 + cp $zin $bigZ_in + + # This is sort of kludgey: use numbers so this is valid input for factor, + # and two tokens so it's valid input for tsort. + echo 2147483647 0 > $tmp_in + # Make $tmp_in2 identical. Then, using $tmp_in and $tmp_in2 as arguments + # to the likes of cmp and diff makes them exit successfully. + cp $tmp_in $tmp_in2 + mkdir $tmp_dir + # echo ================== $i + test $i = [ && prog=lbracket || prog=$(echo $i|sed "s/$EXEEXT$//") + if type ${prog}_setup > /dev/null 2>&1; then + ${prog}_setup + else + args= + fi + if env $i $args < $tmp_in > $tmp_out; then + : # ok + else + echo FAIL: $i + fail=1 + fi + rm -rf $tmp_in $tmp_in2 $tmp_out $tmp_dir +done + +Exit $fail diff --git a/src/grep/tests/high-bit-range b/src/grep/tests/high-bit-range new file mode 100755 index 0000000..38dff54 --- /dev/null +++ b/src/grep/tests/high-bit-range @@ -0,0 +1,28 @@ +#!/bin/sh +# Exercise high-bit-set unibyte-in-[...]-range bug. + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +printf '\201\n' > in || framework_failure_ +grep -a "$(printf '[\201]')" in > out || fail=1 + +compare out in || fail=1 + +Exit $fail diff --git a/src/grep/tests/in-eq-out-infloop b/src/grep/tests/in-eq-out-infloop new file mode 100755 index 0000000..11ba904 --- /dev/null +++ b/src/grep/tests/in-eq-out-infloop @@ -0,0 +1,41 @@ +#!/bin/sh +# Demonstrate the disk-filling infloop when redirecting to an input file. +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_timeout_ + +# Use an input file large enough that the problem is reproducible in spite +# of buffering effects. Just larger than 256KB should be adequate. +v=$(printf %063d 0)' +' +# 64 * 2^12 = 256k +for i in 1 2 3 4 5 6 7 8 9 10 11 12; do + v="$v$v" +done + +echo "$v" > out || framework_failure_ + +for arg in out - ''; do + # Accommodate both 'out' and '(standard input)', as well as + # the multi-byte quoting we see on OS/X-based systems. + echo grep: ...: input file is also the output > err.exp || framework_failure_ + + # Require an exit status of 2. + # grep-2.8 and earlier would infloop with $arg = out. + # grep-2.10 and earlier would infloop with $arg = - or $arg = ''. + timeout 10 grep 0 $arg < out >> out 2> err; st=$?; test $st = 2 || fail=1 + sed 's/grep: .*: /grep: ...: /' err > k && mv k err + # Normalize the diagnostic prefix from e.g., "/mnt/dir/grep: " to "grep: " + sed 's/^[^:]*: /grep: /' err > k && mv k err + compare err.exp err || fail=1 + + # But with each of the following options it must not exit-2. + for i in -q -m1 -l -L; do + timeout 10 grep $i 0 $arg < out >> out 2> err; st=$? + test $st = 2 && fail=1 + done + + timeout 10 grep -2 0 $arg < out >> out 2> err; st=$? + test $st = 2 || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/include-exclude b/src/grep/tests/include-exclude new file mode 100755 index 0000000..c3d22a1 --- /dev/null +++ b/src/grep/tests/include-exclude @@ -0,0 +1,76 @@ +#!/bin/sh +# Use of any --include or --exclude* option would segfault in 2.6 and 2.6.1 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +mkdir -p x/dir || framework_failure_ +echo aaa > x/a || framework_failure_ +echo bbb > x/b || framework_failure_ +echo ddd > x/dir/d || framework_failure_ + +printf '%s\n' x/b:bbb x/dir/d:ddd > exp-not-a || framework_failure_ +printf '%s\n' x/dir/d:ddd > exp-not-ab || framework_failure_ +printf '%s\n' x/a:aaa x/b:bbb > exp-not-d || framework_failure_ +printf '%s\n' x/a:aaa x/b:bbb > exp-not-dir || framework_failure_ +printf '%s\n' x/a:aaa > exp-a || framework_failure_ +printf '%s\n' a:aaa > exp-aa || framework_failure_ +printf '%s\n' aaa > exp-aaa || framework_failure_ +printf '%s\n' ./x/a ./x/b ./x/dir/d | sort > exp-dotnames || framework_failure_ + +grep -r --exclude='a*' . x > out || fail=1 +sort out > k && mv k out +compare exp-not-a out || fail=1 + +grep -r --exclude='Rumpelstiltskin' --include='a*' --exclude='a*' . x > out || + fail=1 +sort out > k && mv k out +compare exp-not-a out || fail=1 + +grep -r --exclude='[ab]' . x > out || fail=1 +sort out > k && mv k out +compare exp-not-ab out || fail=1 + +grep -r --exclude='*d' . x > out || fail=1 +sort out > k && mv k out +compare exp-not-d out || fail=1 + +grep -r --exclude-dir=dir . x > out || fail=1 +sort out > k && mv k out +compare exp-not-dir out || fail=1 + +grep -r --exclude-dir=dir/ . x > out || fail=1 +sort out > k && mv k out +compare exp-not-dir out || fail=1 + +# Test with a non-glob. +grep -r --include=a . x > out || fail=1 +# no need to sort +compare exp-a out || fail=1 + +# Also test --include with a "glob". +grep -r --include='a*' . x > out || fail=1 +# no need to sort +compare exp-a out || fail=1 + +# --include (without --recursive) uses different code +grep --directories=skip --include=x/a --exclude-dir=dir '^aaa$' x/* > out \ + || fail=1 +compare exp-a out || fail=1 + +(cd x && grep -r --exclude-dir=. '^aaa$') > out || fail=1 +compare exp-aa out || fail=1 + +grep --exclude=- '^aaa$' - < x/a > out || fail=1 +compare exp-aaa out || fail=1 + +for exclude in 'x' 'x*'; do + grep -rl --exclude-dir="$exclude" . x > out + test $? -eq 1 || fail=1 + compare /dev/null out || fail=1 +done + +for exclude in 'x' 'x*' './x' './x*'; do + grep -rl --exclude-dir="$exclude" . ./x | sort > out || fail=1 + compare /dev/null out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/inconsistent-range b/src/grep/tests/inconsistent-range new file mode 100755 index 0000000..e28acde --- /dev/null +++ b/src/grep/tests/inconsistent-range @@ -0,0 +1,17 @@ +#!/bin/sh +# This would fail for grep-2.6 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf '00a\n00g\n00z\n00A\n00G\n00Z\n' > in || framework_failure_ + +fail=0 + +for LOC in en_US.UTF-8 en_US zh_CN $LOCALE_FR_UTF8 C; do + out1=out1-$LOC + LC_ALL=$LOC grep -E '(.)\1[A-Z]' in > $out1 || fail=1 + out2=out2-$LOC + LC_ALL=$LOC grep -E '[A-Z]' in > $out2 || fail=1 + compare $out1 $out2 || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/init.cfg b/src/grep/tests/init.cfg new file mode 100644 index 0000000..72cab20 --- /dev/null +++ b/src/grep/tests/init.cfg @@ -0,0 +1,220 @@ +# This file is sourced by init.sh, *before* its initialization. + +# This goes hand in hand with the "9>&2;" in tests/Makefile.am's +# TESTS_ENVIRONMENT definition. +stderr_fileno_=9 + +# Map settings of "none" to the empty string. +test _"$LOCALE_FR" = _none && LOCALE_FR= +test _"$LOCALE_FR_UTF8" = _none && LOCALE_FR_UTF8= + +# Unset key environment variables. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +# Derive this list by searching for string literals as the first +# argument to getenv: +# git grep getenv|perl -nle '/\bgetenv *\("(.+?)"\)/ and print $1'|sort -u grep +vars_=' +GREP_COLOR +GREP_COLORS +TERM +' +envvar_check_fail=0 +for v_ in $vars_ +do + $as_unset $v_ + if eval test \"\${$v_+set}\" = set; then + echo "$0: the $v_ environment variable is set --" \ + ' unset it and rerun this test' >&2 + envvar_check_fail=1 + fi +done + +test "$envvar_check_fail" = 1 && fail_ "failed to unset the above envvars" + +require_timeout_() +{ + ( timeout 10s true ) > /dev/null 2>&1 \ + || skip_ your system lacks the timeout program + returns_ 1 timeout 10s false \ + || skip_ your system has a non-GNU timeout program + returns_ 124 timeout 0.01 sleep 0.02 \ + || skip_ "'timeout 0.01 sleep 0.02' did not time out" +} + +require_pcre_() +{ + echo . | grep -P . 2>err || { + test $? -eq 1 && fail_ PCRE available, but does not work. + skip_ no PCRE support + } + compare /dev/null err || fail_ PCRE available, but stderr not empty. +} + +# Some tests would fail without this particular locale. +# If the locale is not available, just skip the test. +require_en_utf8_locale_() +{ + path_prepend_ . + case $(get-mb-cur-max en_US.UTF-8) in + [3456]) ;; + *) skip_ 'en_US.UTF-8 locale not found' ;; + esac +} + +require_tr_utf8_locale_() +{ + path_prepend_ . + case $(get-mb-cur-max tr_TR.UTF-8) in + [3456]) ;; + *) skip_ 'tr_TR.UTF-8 locale not found' ;; + esac +} + +require_ru_RU_koi8_r() +{ + path_prepend_ . + case $(get-mb-cur-max ru_RU.KOI8-R) in + 1) ;; + *) skip_ 'ru_RU.KOI8-R locale not found' ;; + esac +} + +require_compiled_in_MB_support() +{ + require_en_utf8_locale_ + printf 'é' | LC_ALL=en_US.UTF-8 grep '[[:lower:]]' \ + || skip_ this test requires MBS support +} + +require_unibyte_locale() +{ + path_prepend_ . + for loc in C en_US; do + for encoding in '' .iso88591 .iso885915 .ISO8859-1 .ISO8859-15; do + locale=$loc$encoding + MB_CUR_MAX=$(get-mb-cur-max $locale 2>/dev/null) && + test "$MB_CUR_MAX" -eq 1 && + LC_ALL=$locale && + export LC_ALL && + return + done + done + skip_ 'no unibyte locale found' +} + +# Define hi_res_time_ to a function that prints the current time +# as a floating point number with greater than 1-second resolution. +# Otherwise, skip the requiring test. +require_hi_res_time_() +{ + local cmd + for cmd in 'date +%s.%N' \ + 'perl -le "use Time::HiRes qw(time); print scalar time()"'; do + case $($cmd) in + *.[0-9]*) eval 'hi_res_time_() { '"$cmd"'; }'; break;; + esac + done + type hi_res_time_ || skip_ no high-resolution timer support +} + +require_JP_EUC_locale_() +{ + local locale=ja_JP.eucJP + path_prepend_ . + case $(get-mb-cur-max $locale) in + [23]) + LC_ALL=$locale && + export LC_ALL && + return + ;; + *) ;; + esac + + skip_ "$locale locale not found" +} + +expensive_() +{ + if test "$RUN_EXPENSIVE_TESTS" != yes; then + skip_ 'expensive: disabled by default +This test is relatively expensive, so it is disabled by default. +To run it anyway, rerun make check with the RUN_EXPENSIVE_TESTS +environment variable set to yes. E.g., + + env RUN_EXPENSIVE_TESTS=yes make check + +or use the shortcut target of the toplevel Makefile, + + make check-expensive +' + fi +} + +# Like printf with a single argument, but that argument must be a +# sequence of four-byte strings \xHH where each H is a hexadecimal byte. +hex_printf_() +{ + local octal_fmt=$(printf '\\%o' \ + $(printf '%s\n' "$1" \ + | sed 's,\\x\([0-9abcdefABCDEF][0-9abcdefABCDEF]\), 0x\1,g')) + printf "$octal_fmt" +} + +# Wrap tr so that it always runs in the C locale. +# Otherwise, in a multibyte locale, GNU tr (which is not multibyte-aware +# as of 2014-11-08), would work differently than others. For example, +# this command, which was written with unibyte GNU tr in mind, +# LC_ALL=ja_JP.eucJP tr AB '\244\263' +# would act like this with the multibyte tr from HP-UX and Solaris: +# LC_ALL=ja_JP.eucJP tr A '\244\263' +tr() { LC_ALL=C env -- tr "$@"; } + +# Usage: user_time_ EXPECTED_EXIT_STATUS CMD ... +# If CMD ... exits with the expected exit status, print the elapsed +# child "user" time (not "system" time) in milliseconds and return 0. +# Otherwise, diagnose the exit status mismatch and return nonzero. +user_time_() +{ + $PERL -le ' + my $expected_exit_status = $ARGV[0]; + shift @ARGV; + + system (@ARGV); + my ($user, $system, $child_user, $child_system) = times; + + my $me = q('"$ME_"'); + $? == -1 + and die qq($me: failed to exec ") . join (" ", @ARGV) . qq(": $!\n); + my $rc = $?; + my $sig = ($rc & 127); + $sig and die "$me: child died with signal $sig\n"; + $rc >>= 8; + $rc == $expected_exit_status + or die "$me: bad exit status: expected $expected_exit_status; got $rc\n"; + + # Print milliseconds of child user time. + $child_user *= 1000; + print int ($child_user + 0.5)' "$@" +} + +# yes is not portable, fake it with $AWK +yes() { line=${*-y} ${AWK-awk} 'BEGIN{for (;;) print ENVIRON["line"]}'; } + +# Some systems lack seq. +# A limited replacement for seq: handle 1 or 2 args; increment must be 1 +if ! type seq > /dev/null 2>&1; then + seq() + { + case $# in + 1) start=1 final=$1;; + 2) start=$1 final=$2;; + *) echo you lose 1>&2; exit 1;; + esac + awk 'BEGIN{for(i='$start';i<='$final';i++) print i}' < /dev/null + } +fi diff --git a/src/grep/tests/init.sh b/src/grep/tests/init.sh new file mode 100644 index 0000000..9ef8348 --- /dev/null +++ b/src/grep/tests/init.sh @@ -0,0 +1,683 @@ +# source this file; set up for tests + +# Copyright (C) 2009-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# Using this file in a test +# ========================= +# +# The typical skeleton of a test looks like this: +# +# #!/bin/sh +# . "${srcdir=.}/init.sh"; path_prepend_ . +# Execute some commands. +# Note that these commands are executed in a subdirectory, therefore you +# need to prepend "../" to relative filenames in the build directory. +# Note that the "path_prepend_ ." is useful only if the body of your +# test invokes programs residing in the initial directory. +# For example, if the programs you want to test are in src/, and this test +# script is named tests/test-1, then you would use "path_prepend_ ../src", +# or perhaps export PATH='$(abs_top_builddir)/src$(PATH_SEPARATOR)'"$$PATH" +# to all tests via automake's TESTS_ENVIRONMENT. +# Set the exit code 0 for success, 77 for skipped, or 1 or other for failure. +# Use the skip_ and fail_ functions to print a diagnostic and then exit +# with the corresponding exit code. +# Exit $? + +# Executing a test that uses this file +# ==================================== +# +# Running a single test: +# $ make check TESTS=test-foo.sh +# +# Running a single test, with verbose output: +# $ make check TESTS=test-foo.sh VERBOSE=yes +# +# Running a single test, keeping the temporary directory: +# $ make check TESTS=test-foo.sh KEEP=yes +# +# Running a single test, with single-stepping: +# 1. Go into a sub-shell: +# $ bash +# 2. Set relevant environment variables from TESTS_ENVIRONMENT in the +# Makefile: +# $ export srcdir=../../tests # this is an example +# 3. Execute the commands from the test, copy&pasting them one by one: +# $ . "$srcdir/init.sh"; path_prepend_ . +# ... +# 4. Finally +# $ exit + +# ============================================================================= +# Elementary diagnostics + +ME_=`expr "./$0" : '.*/\(.*\)$'` + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which + # contains only /bin. Note that ksh looks also at the FPATH variable, + # so we have to set that as well for the test. + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ + && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ + || PATH_SEPARATOR=';' + } +fi + +# We use a trap below for cleanup. This requires us to go through +# hoops to get the right exit status transported through the handler. +# So use 'Exit STATUS' instead of 'exit STATUS' inside of the tests. +# Turn off errexit here so that we don't trip the bug with OSF1/Tru64 +# sh inside this function. +Exit () { set +e; (exit $1); exit $1; } + +# Print warnings (e.g., about skipped and failed tests) to this file number. +# Override by defining to say, 9, in init.cfg, and putting say, +# export ...ENVVAR_SETTINGS...; $(SHELL) 9>&2 +# in the definition of TESTS_ENVIRONMENT in your tests/Makefile.am file. +# This is useful when using automake's parallel tests mode, to print +# the reason for skip/failure to console, rather than to the .log files. +: ${stderr_fileno_=2} + +# Note that correct expansion of "$*" depends on IFS starting with ' '. +# Always write the full diagnostic to stderr. +# When stderr_fileno_ is not 2, also emit the first line of the +# diagnostic to that file descriptor. +warn_ () +{ + # If IFS does not start with ' ', set it and emit the warning in a subshell. + case $IFS in + ' '*) printf '%s\n' "$*" >&2 + test $stderr_fileno_ = 2 \ + || { printf '%s\n' "$*" | sed 1q >&$stderr_fileno_ ; } ;; + *) (IFS=' '; warn_ "$@");; + esac +} +fail_ () { warn_ "$ME_: failed test: $@"; Exit 1; } +skip_ () { warn_ "$ME_: skipped test: $@"; Exit 77; } +fatal_ () { warn_ "$ME_: hard error: $@"; Exit 99; } +framework_failure_ () { warn_ "$ME_: set-up failure: $@"; Exit 99; } + +# ============================================================================= +# Ensure the shell supports modern syntax. + +# Sanitize this shell to POSIX mode, if possible. +DUALCASE=1; export DUALCASE +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in + *posix*) set -o posix ;; + esac +fi + +# We require $(...) support unconditionally. +# We require that the printf built-in work correctly regarding octal escapes; +# this eliminates /bin/sh on AIX 7.2. +# We require non-surprising "local" semantics (this eliminates dash). +# This takes the admittedly draconian step of eliminating dash, because the +# assignment tab=$(printf '\t') works fine, yet preceding it with "local " +# transforms it into an assignment that sets the variable to the empty string. +# That is too counter-intuitive, and can lead to subtle run-time malfunction. +# The example below is less subtle in that with dash, it evokes the run-time +# exception "dash: 1: local: 1: bad variable name". +# We require a few additional shell features only when $EXEEXT is nonempty, +# in order to support automatic $EXEEXT emulation: +# - hyphen-containing alias names +# - we prefer to use ${var#...} substitution, rather than having +# to work around lack of support for that feature. +# The following code attempts to find a shell with support for these features. +# If the current shell passes the test, we're done. Otherwise, test other +# shells until we find one that passes. If one is found, re-exec it. +# If no acceptable shell is found, skip the current test. +# +# The "...set -x; P=1 true 2>err..." test is to disqualify any shell that +# emits "P=1" into err, as /bin/sh from SunOS 5.11 and OpenBSD 4.7 do. +# +# Use "9" to indicate success (rather than 0), in case some shell acts +# like Solaris 10's /bin/sh but exits successfully instead of with status 2. + +# Eval this code in a subshell to determine a shell's suitability. +# 10 - passes all tests; ok to use +# 9 - ok, but enabling "set -x" corrupts app stderr; prefer higher score +# ? - not ok +gl_shell_test_script_=' +test $(echo y) = y || exit 1 +LC_ALL=en_US.UTF-8 printf "\\351" 2>/dev/null \ + | LC_ALL=C tr "\\351" x | LC_ALL=C grep "^x$" > /dev/null \ + || exit 1 +printf "\\351" 2>/dev/null \ + | LC_ALL=C tr "\\351" x | LC_ALL=C grep "^x$" > /dev/null \ + || exit 1 +f_local_() { local v=1; }; f_local_ || exit 1 +f_dash_local_fail_() { local t=$(printf " 1"); }; f_dash_local_fail_ +score_=10 +if test "$VERBOSE" = yes; then + test -n "$( (exec 3>&1; set -x; P=1 true 2>&3) 2> /dev/null)" && score_=9 +fi +test -z "$EXEEXT" && exit $score_ +shopt -s expand_aliases +alias a-b="echo zoo" +v=abx + test ${v%x} = ab \ + && test ${v#a} = bx \ + && test $(a-b) = zoo \ + && exit $score_ +' + +if test "x$1" = "x--no-reexec"; then + shift +else + # Assume a working shell. Export to subshells (setup_ needs this). + gl_set_x_corrupts_stderr_=false + export gl_set_x_corrupts_stderr_ + + # Record the first marginally acceptable shell. + marginal_= + + # Search for a shell that meets our requirements. + for re_shell_ in __current__ "${CONFIG_SHELL:-no_shell}" \ + /bin/sh bash dash zsh pdksh fail + do + test "$re_shell_" = no_shell && continue + + # If we've made it all the way to the sentinel, "fail" without + # finding even a marginal shell, skip this test. + if test "$re_shell_" = fail; then + test -z "$marginal_" && skip_ failed to find an adequate shell + re_shell_=$marginal_ + break + fi + + # When testing the current shell, simply "eval" the test code. + # Otherwise, run it via $re_shell_ -c ... + if test "$re_shell_" = __current__; then + # 'eval'ing this code makes Solaris 10's /bin/sh exit with + # $? set to 2. It does not evaluate any of the code after the + # "unexpected" first '('. Thus, we must run it in a subshell. + ( eval "$gl_shell_test_script_" ) > /dev/null 2>&1 + else + "$re_shell_" -c "$gl_shell_test_script_" 2>/dev/null + fi + + st_=$? + + # $re_shell_ works just fine. Use it. + if test $st_ = 10; then + gl_set_x_corrupts_stderr_=false + break + fi + + # If this is our first marginally acceptable shell, remember it. + if test "$st_:$marginal_" = 9: ; then + marginal_="$re_shell_" + gl_set_x_corrupts_stderr_=true + fi + done + + if test "$re_shell_" != __current__; then + # Found a usable shell. Preserve -v and -x. + case $- in + *v*x* | *x*v*) opts_=-vx ;; + *v*) opts_=-v ;; + *x*) opts_=-x ;; + *) opts_= ;; + esac + re_shell=$re_shell_ + export re_shell + exec "$re_shell_" $opts_ "$0" --no-reexec "$@" + echo "$ME_: exec failed" 1>&2 + exit 127 + fi +fi + +# ============================================================================= +# Ensure the shell behaves reasonably. + +# If this is bash, turn off all aliases. +test -n "$BASH_VERSION" && unalias -a + +# Note that when supporting $EXEEXT (transparently mapping from PROG_NAME to +# PROG_NAME.exe), we want to support hyphen-containing names like test-acos. +# That is part of the shell-selection test above. Why use aliases rather +# than functions? Because support for hyphen-containing aliases is more +# widespread than that for hyphen-containing function names. +test -n "$EXEEXT" && test -n "$BASH_VERSION" && shopt -s expand_aliases + +# ============================================================================= +# Creating a temporary directory (needed by the core test framework) + +# Create a temporary directory, much like mktemp -d does. +# Written by Jim Meyering. +# +# Usage: mktempd_ /tmp phoey.XXXXXXXXXX +# +# First, try to use the mktemp program. +# Failing that, we'll roll our own mktemp-like function: +# - try to get random bytes from /dev/urandom +# - failing that, generate output from a combination of quickly-varying +# sources and gzip. Ignore non-varying gzip header, and extract +# "random" bits from there. +# - given those bits, map to file-name bytes using tr, and try to create +# the desired directory. +# - make only $MAX_TRIES_ attempts + +# Helper function. Print $N pseudo-random bytes from a-zA-Z0-9. +rand_bytes_ () +{ + n_=$1 + + # Maybe try openssl rand -base64 $n_prime_|tr '+/=\012' abcd first? + # But if they have openssl, they probably have mktemp, too. + + chars_=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 + dev_rand_=/dev/urandom + if test -r "$dev_rand_"; then + # Note: 256-length($chars_) == 194; 3 copies of $chars_ is 186 + 8 = 194. + dd ibs=$n_ count=1 if=$dev_rand_ 2>/dev/null \ + | LC_ALL=C tr -c $chars_ 01234567$chars_$chars_$chars_ + return + fi + + n_plus_50_=`expr $n_ + 50` + cmds_='date; date +%N; free; who -a; w; ps auxww; ps -ef' + data_=` (eval "$cmds_") 2>&1 | gzip ` + + # Ensure that $data_ has length at least 50+$n_ + while :; do + len_=`echo "$data_"|wc -c` + test $n_plus_50_ -le $len_ && break; + data_=` (echo "$data_"; eval "$cmds_") 2>&1 | gzip ` + done + + echo "$data_" \ + | dd bs=1 skip=50 count=$n_ 2>/dev/null \ + | LC_ALL=C tr -c $chars_ 01234567$chars_$chars_$chars_ +} + +mktempd_ () +{ + case $# in + 2);; + *) fail_ "Usage: mktempd_ DIR TEMPLATE";; + esac + + destdir_=$1 + template_=$2 + + MAX_TRIES_=4 + + # Disallow any trailing slash on specified destdir: + # it would subvert the post-mktemp "case"-based destdir test. + case $destdir_ in + / | //) destdir_slash_=$destdir;; + */) fail_ "invalid destination dir: remove trailing slash(es)";; + *) destdir_slash_=$destdir_/;; + esac + + case $template_ in + *XXXX) ;; + *) fail_ \ + "invalid template: $template_ (must have a suffix of at least 4 X's)";; + esac + + # First, try to use mktemp. + d=`unset TMPDIR; { mktemp -d -t -p "$destdir_" "$template_"; } 2>/dev/null` && + + # The resulting name must be in the specified directory. + case $d in "$destdir_slash_"*) :;; *) false;; esac && + + # It must have created the directory. + test -d "$d" && + + # It must have 0700 permissions. Handle sticky "S" bits. + perms=`ls -dgo "$d" 2>/dev/null` && + case $perms in drwx--[-S]---*) :;; *) false;; esac && { + echo "$d" + return + } + + # If we reach this point, we'll have to create a directory manually. + + # Get a copy of the template without its suffix of X's. + base_template_=`echo "$template_"|sed 's/XX*$//'` + + # Calculate how many X's we've just removed. + template_length_=`echo "$template_" | wc -c` + nx_=`echo "$base_template_" | wc -c` + nx_=`expr $template_length_ - $nx_` + + err_= + i_=1 + while :; do + X_=`rand_bytes_ $nx_` + candidate_dir_="$destdir_slash_$base_template_$X_" + err_=`mkdir -m 0700 "$candidate_dir_" 2>&1` \ + && { echo "$candidate_dir_"; return; } + test $MAX_TRIES_ -le $i_ && break; + i_=`expr $i_ + 1` + done + fail_ "$err_" +} + +# ============================================================================= +# Core test framework + +# An arbitrary prefix to help distinguish test directories. +testdir_prefix_ () { printf gt; } + +# Set up the environment for the test to run in. +setup_ () +{ + if test "$VERBOSE" = yes; then + # Test whether set -x may cause the selected shell to corrupt an + # application's stderr. Many do, including zsh-4.3.10 and the /bin/sh + # from SunOS 5.11, OpenBSD 4.7 and Irix 6.5. + # If enabling verbose output this way would cause trouble, simply + # issue a warning and refrain. + if $gl_set_x_corrupts_stderr_; then + warn_ "using SHELL=$SHELL with 'set -x' corrupts stderr" + else + set -x + fi + fi + + initial_cwd_=$PWD + + # Create and enter the temporary directory. + pfx_=`testdir_prefix_` + test_dir_=`mktempd_ "$initial_cwd_" "$pfx_-$ME_.XXXX"` \ + || fail_ "failed to create temporary directory in $initial_cwd_" + cd "$test_dir_" || fail_ "failed to cd to temporary directory" + # Set variables srcdir, builddir, for the convenience of the test. + case $srcdir in + /* | ?:*) ;; + *) srcdir="../$srcdir" ;; + esac + builddir=".." + export srcdir builddir + + # As autoconf-generated configure scripts do, ensure that IFS + # is defined initially, so that saving and restoring $IFS works. + gl_init_sh_nl_=' +' + IFS=" "" $gl_init_sh_nl_" + + # This trap statement, along with a trap on 0 below, ensure that the + # temporary directory, $test_dir_, is removed upon exit as well as + # upon receipt of any of the listed signals. + for sig_ in 1 2 3 13 15; do + eval "trap 'Exit $(expr $sig_ + 128)' $sig_" + done +} + +# This is a stub function that is run upon trap (upon regular exit and +# interrupt). Override it with a per-test function, e.g., to unmount +# a partition, or to undo any other global state changes. +cleanup_ () { :; } + +# Run the user-overridable cleanup_ function, remove the temporary +# directory and exit with the incoming value of $?. +remove_tmp_ () +{ + __st=$? + cleanup_ + if test "$KEEP" = yes; then + echo "Not removing temporary directory $test_dir_" + else + # cd out of the directory we're about to remove + cd "$initial_cwd_" || cd / || cd /tmp + chmod -R u+rwx "$test_dir_" + # If removal fails and exit status was to be 0, then change it to 1. + rm -rf "$test_dir_" || { test $__st = 0 && __st=1; } + fi + exit $__st +} + +# ============================================================================= +# Prepending directories to PATH + +# Given a directory name, DIR, if every entry in it that matches *.exe +# contains only the specified bytes (see the case stmt below), then print +# a space-separated list of those names and return 0. Otherwise, don't +# print anything and return 1. Naming constraints apply also to DIR. +find_exe_basenames_ () +{ + feb_dir_=$1 + feb_fail_=0 + feb_result_= + feb_sp_= + for feb_file_ in $feb_dir_/*.exe; do + # If there was no *.exe file, or there existed a file named "*.exe" that + # was deleted between the above glob expansion and the existence test + # below, just skip it. + test "x$feb_file_" = "x$feb_dir_/*.exe" && test ! -f "$feb_file_" \ + && continue + # Exempt [.exe, since we can't create a function by that name, yet + # we can't invoke [ by PATH search anyways due to shell builtins. + test "x$feb_file_" = "x$feb_dir_/[.exe" && continue + case $feb_file_ in + *[!-a-zA-Z/0-9_.+]*) feb_fail_=1; break;; + *) # Remove leading file name components as well as the .exe suffix. + feb_file_=${feb_file_##*/} + feb_file_=${feb_file_%.exe} + feb_result_="$feb_result_$feb_sp_$feb_file_";; + esac + feb_sp_=' ' + done + test $feb_fail_ = 0 && printf %s "$feb_result_" + return $feb_fail_ +} + +# Consider the files in directory, $1. +# For each file name of the form PROG.exe, create an alias named +# PROG that simply invokes PROG.exe, then return 0. If any selected +# file name or the directory name, $1, contains an unexpected character, +# define no alias and return 1. +create_exe_shims_ () +{ + case $EXEEXT in + '') return 0 ;; + .exe) ;; + *) echo "$0: unexpected \$EXEEXT value: $EXEEXT" 1>&2; return 1 ;; + esac + + base_names_=`find_exe_basenames_ $1` \ + || { echo "$0 (exe_shim): skipping directory: $1" 1>&2; return 0; } + + if test -n "$base_names_"; then + for base_ in $base_names_; do + alias "$base_"="$base_$EXEEXT" + done + fi + + return 0 +} + +# Use this function to prepend to PATH an absolute name for each +# specified, possibly-$initial_cwd_-relative, directory. +path_prepend_ () +{ + while test $# != 0; do + path_dir_=$1 + case $path_dir_ in + '') fail_ "invalid path dir: '$1'";; + /* | ?:*) abs_path_dir_=$path_dir_;; + *) abs_path_dir_=$initial_cwd_/$path_dir_;; + esac + case $abs_path_dir_ in + *$PATH_SEPARATOR*) fail_ "invalid path dir: '$abs_path_dir_'";; + esac + PATH="$abs_path_dir_$PATH_SEPARATOR$PATH" + + # Create an alias, FOO, for each FOO.exe in this directory. + create_exe_shims_ "$abs_path_dir_" \ + || fail_ "something failed (above): $abs_path_dir_" + shift + done + export PATH +} + +# ============================================================================= +# Convenience environment variables for the tests + +# ----------------------------------------------------------------------------- + +# Enable glibc's malloc-perturbing option. +# This is useful for exposing code that depends on the fact that +# malloc-related functions often return memory that is mostly zeroed. +# If you have the time and cycles, use valgrind to do an even better job. +: ${MALLOC_PERTURB_=87} +export MALLOC_PERTURB_ + +# ----------------------------------------------------------------------------- + +# The interpreter for Bourne-shell scripts. +# No special standards compatibility requirements. +# Some environments, such as Android, don't have /bin/sh. +if test -f /bin/sh$EXEEXT; then + BOURNE_SHELL=/bin/sh +else + BOURNE_SHELL=sh +fi + +# ============================================================================= +# Convenience functions for the tests + +# ----------------------------------------------------------------------------- +# Return value checking + +# This is used to simplify checking of the return value +# which is useful when ensuring a command fails as desired. +# I.e., just doing `command ... &&fail=1` will not catch +# a segfault in command for example. With this helper you +# instead check an explicit exit code like +# returns_ 1 command ... || fail +returns_ () { + # Disable tracing so it doesn't interfere with stderr of the wrapped command + { set +x; } 2>/dev/null + + local exp_exit="$1" + shift + "$@" + test $? -eq $exp_exit && ret_=0 || ret_=1 + + if test "$VERBOSE" = yes && test "$gl_set_x_corrupts_stderr_" = false; then + set -x + fi + { return $ret_; } 2>/dev/null +} + +# ----------------------------------------------------------------------------- +# Text file comparison + +# Emit a header similar to that from diff -u; Print the simulated "diff" +# command so that the order of arguments is clear. Don't bother with @@ lines. +emit_diff_u_header_ () +{ + printf '%s\n' "diff -u $*" \ + "--- $1 1970-01-01" \ + "+++ $2 1970-01-01" +} + +# Arrange not to let diff or cmp operate on /dev/null, +# since on some systems (at least OSF/1 5.1), that doesn't work. +# When there are not two arguments, or no argument is /dev/null, return 2. +# When one argument is /dev/null and the other is not empty, +# cat the nonempty file to stderr and return 1. +# Otherwise, return 0. +compare_dev_null_ () +{ + test $# = 2 || return 2 + + if test "x$1" = x/dev/null; then + test -s "$2" || return 0 + emit_diff_u_header_ "$@"; sed 's/^/+/' "$2" + return 1 + fi + + if test "x$2" = x/dev/null; then + test -s "$1" || return 0 + emit_diff_u_header_ "$@"; sed 's/^/-/' "$1" + return 1 + fi + + return 2 +} + +for diff_opt_ in -u -U3 -c '' no; do + test "$diff_opt_" != no && + diff_out_=`exec 2>/dev/null; diff $diff_opt_ "$0" "$0" < /dev/null` && + break +done +if test "$diff_opt_" != no; then + if test -z "$diff_out_"; then + compare_ () { diff $diff_opt_ "$@"; } + else + compare_ () + { + # If no differences were found, AIX and HP-UX 'diff' produce output + # like "No differences encountered". Hide this output. + diff $diff_opt_ "$@" > diff.out + diff_status_=$? + test $diff_status_ -eq 0 || cat diff.out || diff_status_=2 + rm -f diff.out || diff_status_=2 + return $diff_status_ + } + fi +elif cmp -s /dev/null /dev/null 2>/dev/null; then + compare_ () { cmp -s "$@"; } +else + compare_ () { cmp "$@"; } +fi + +# Usage: compare EXPECTED ACTUAL +# +# Given compare_dev_null_'s preprocessing, defer to compare_ if 2 or more. +# Otherwise, propagate $? to caller: any diffs have already been printed. +compare () +{ + # This looks like it can be factored to use a simple "case $?" + # after unchecked compare_dev_null_ invocation, but that would + # fail in a "set -e" environment. + if compare_dev_null_ "$@"; then + return 0 + else + case $? in + 1) return 1;; + *) compare_ "$@";; + esac + fi +} + +# ----------------------------------------------------------------------------- + +# If you want to override the testdir_prefix_ function, +# or to add more utility functions, use this file. +test -f "$srcdir/init.cfg" \ + && . "$srcdir/init.cfg" + +# ============================================================================= +# Set up the environment for the test to run in. + +setup_ "$@" +# This trap is here, rather than in the setup_ function, because some +# shells run the exit trap at shell function exit, rather than script exit. +trap remove_tmp_ 0 diff --git a/src/grep/tests/initial-tab b/src/grep/tests/initial-tab new file mode 100755 index 0000000..c19a7ce --- /dev/null +++ b/src/grep/tests/initial-tab @@ -0,0 +1,37 @@ +#!/bin/sh +# Exercise -T. + +# Copyright 2016-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +printf 'x\n\n' > in || framework_failure_ + +grep -T '^' in > out || fail=1 +compare in out || fail=1 + +printf 'in:\tx\nin:\n' > exp || framework_failure_ +grep -T '^' in /dev/null > out || fail=1 +compare exp out || fail=1 + +printf '%s\n' a b c d e f g h i j > in1 || framework_failure_ +printf 'in1: 1:\ta\n' > exp1 || framework_failure_ +grep -Tn 'a' in1 /dev/null > out1 || fail=1 +compare exp1 out1 || fail=1 + +Exit $fail diff --git a/src/grep/tests/invalid-multibyte-infloop b/src/grep/tests/invalid-multibyte-infloop new file mode 100755 index 0000000..b4ad14b --- /dev/null +++ b/src/grep/tests/invalid-multibyte-infloop @@ -0,0 +1,37 @@ +#!/bin/sh +# Ensure that we don't trigger a grep -F infloop. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support +require_timeout_ + +encode() { echo "$1" | tr A '\202'; } + +encode AA > input + +fail=0 + +# Before 2.15, this would infloop. +LC_ALL=en_US.UTF-8 timeout 10 grep -aF $(encode A) input > out +status=$? +if test $status -eq 0; then + compare input out +elif test $status -eq 1; then + compare_dev_null_ /dev/null out +else + test $status -eq 2 +fi || fail=1 + +LC_ALL=en_US.UTF-8 timeout 10 grep -F $(encode A) input > out +status=$? +if test $status -eq 0; then + compare /dev/null out +elif test $status -eq 1; then + compare_dev_null_ /dev/null out +else + test $status -eq 2 +fi || fail=1 + +Exit $fail diff --git a/src/grep/tests/khadafy b/src/grep/tests/khadafy new file mode 100755 index 0000000..1c68d5b --- /dev/null +++ b/src/grep/tests/khadafy @@ -0,0 +1,26 @@ +#! /bin/sh +# Regression test for GNU grep. +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# The Khadafy test is brought to you by Scott Anderson . . . + +grep -E -f $abs_top_srcdir/tests/khadafy.regexp \ + $abs_top_srcdir/tests/khadafy.lines > khadafy.out || fail=1 +if cmp $abs_top_srcdir/tests/khadafy.lines khadafy.out +then + : +else + echo Khadafy test failed -- output left on khadafy.out + fail=1 +fi + +Exit $fail diff --git a/src/grep/tests/khadafy.lines b/src/grep/tests/khadafy.lines new file mode 100644 index 0000000..57e21a1 --- /dev/null +++ b/src/grep/tests/khadafy.lines @@ -0,0 +1,32 @@ +1) Muammar Qaddafi +2) Mo'ammar Gadhafi +3) Muammar Kaddafi +4) Muammar Qadhafi +5) Moammar El Kadhafi +6) Muammar Gadafi +7) Mu'ammar al-Qadafi +8) Moamer El Kazzafi +9) Moamar al-Gaddafi +10) Mu'ammar Al Qathafi +11) Muammar Al Qathafi +12) Mo'ammar el-Gadhafi +13) Moamar El Kadhafi +14) Muammar al-Qadhafi +15) Mu'ammar al-Qadhdhafi +16) Mu'ammar Qadafi +17) Moamar Gaddafi +18) Mu'ammar Qadhdhafi +19) Muammar Khaddafi +20) Muammar al-Khaddafi +21) Mu'amar al-Kadafi +22) Muammar Ghaddafy +23) Muammar Ghadafi +24) Muammar Ghaddafi +25) Muamar Kaddafi +26) Muammar Quathafi +27) Muammar Gheddafi +28) Muamar Al-Kaddafi +29) Moammar Khadafy +30) Moammar Qudhafi +31) Mu'ammar al-Qaddafi +32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi diff --git a/src/grep/tests/khadafy.regexp b/src/grep/tests/khadafy.regexp new file mode 100644 index 0000000..46fe8dd --- /dev/null +++ b/src/grep/tests/khadafy.regexp @@ -0,0 +1 @@ +M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy] diff --git a/src/grep/tests/kwset-abuse b/src/grep/tests/kwset-abuse new file mode 100755 index 0000000..bb8911f --- /dev/null +++ b/src/grep/tests/kwset-abuse @@ -0,0 +1,31 @@ +#! /bin/sh +# Evoke a segfault in a hard-to-reach code path of kwset.c. +# This bug affected grep versions 2.19 through 2.21. +# +# Copyright (C) 2015-2021 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# This test case chooses a haystack of size 260,000, since prodding +# with gdb showed a reallocation slightly larger than that in fillbuf. +# To reach the buggy code, the needle must have length < 1/11 that of +# the haystack, and 10,000 is a nice round number that fits the bill. +printf '%0260000dXy\n' 0 | returns_ 1 grep -F $(printf %010000dy 0) \ + || fail=1 + +Exit $fail diff --git a/src/grep/tests/long-line-vs-2GiB-read b/src/grep/tests/long-line-vs-2GiB-read new file mode 100755 index 0000000..29d29ec --- /dev/null +++ b/src/grep/tests/long-line-vs-2GiB-read @@ -0,0 +1,25 @@ +#!/bin/sh +# Ensure that grep can handle lines 2GiB long. +# Before grep-2.16, a line of length 2^31 or greater would provoke +# an "Invalid argument" (EINVAL) failure from the read syscall on +# systems like OS/X 10.8.5. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Searching 2GiB takes a while. +expensive_ + +echo big > exp || framework_failure_ + +MiB=1048576 +dd bs=$MiB seek=2048 of=big < /dev/null || framework_failure_ +echo x >> big || framework_failure_ +grep -l x big > out 2> err || fail=1 + +# Not everyone has 2GB of memory free. +grep '^grep: memory exhausted$' err && skip_ 'memory exhausted' + +compare exp out || fail=1 +compare /dev/null err || fail=1 + +Exit $fail diff --git a/src/grep/tests/long-pattern-perf b/src/grep/tests/long-pattern-perf new file mode 100755 index 0000000..8151c1a --- /dev/null +++ b/src/grep/tests/long-pattern-perf @@ -0,0 +1,42 @@ +#!/bin/sh +# grep-2.21 would incur a 100x penalty for 10x increase in regexp length + +# Copyright 2015-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# This test is susceptible to failure due to differences in +# system load during the two test runs, so we'll mark it as +# "expensive", making it less likely to be run by regular users. +expensive_ + +echo x > in || framework_failure_ +# Note that we want 10x the byte count (not line count) in the larger file. +seq 10000 50000 | tr -d '\012' > r || framework_failure_ +cat r r r r r r r r r r > re-10x || framework_failure_ +mv r re || framework_failure_ + +base_ms=$(user_time_ 1 grep -f re in ) || fail=1 +b10x_ms=$(user_time_ 1 grep -f re-10x in) || fail=1 + +# Increasing the length of the regular expression by a factor +# of 10 should cause no more than a 10x increase in duration. +# However, we'll draw the line at 20x to avoid false-positives. +returns_ 1 expr $base_ms '<' $b10x_ms / 20 || fail=1 + +Exit $fail diff --git a/src/grep/tests/many-regex-performance b/src/grep/tests/many-regex-performance new file mode 100755 index 0000000..4b4dfe8 --- /dev/null +++ b/src/grep/tests/many-regex-performance @@ -0,0 +1,79 @@ +#!/bin/sh +# Test for this performance regression: +# grep-3.4 would require O(N^2) RSS for N regexps +# grep-3.5 requires O(N) in the most common cases. + +# Copyright 2020-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# This test is susceptible to failure due to differences in +# system load during the two test runs, so we'll mark it as +# "expensive", making it less likely to be run by regular users. +expensive_ + +# Make the quick/small input large enough so that even on high-end +# systems this first invocation takes at least 10ms of user time. +word_list=/usr/share/dict/linux.words + +# If $word_list does not exist, generate an input that exibhits +# similar performance characteristics. +if ! test -f $word_list; then + # Generate data comprable to that word list. + # Note how all "words" start with "a", and that there is + # a small percentage of lines with at least one "." metachar. + # This requires /dev/urandom, so if it's not present, skip + # this test. If desperate, we could fall back to using + # tar+compressed lib/*.c as the data source. + test -r /dev/urandom \ + || skip_ 'this system has neither word list nor working /dev/urandom' + word_list=word_list + ( echo a; cat /dev/urandom \ + | LC_ALL=C tr -dc 'a-zA-Z0-9_' \ + | head -c500000 \ + | sed 's/\(........\)/\1\n/g' \ + | sed s/rs/./ \ + | sed s/./a/ \ + | sort \ + ) > $word_list +fi + +n_lines=2000 +while :; do + sed ${n_lines}q < $word_list > in || framework_failure_ + small_ms=$(LC_ALL=C user_time_ 1 grep --file=in -v in) || fail=1 + test $small_ms -ge 10 && break + n_lines=$(expr $n_lines + 2000) +done + +# Now, run it again, but with 20 times as many lines. +n_lines=$(expr $n_lines \* 20) +sed ${n_lines}q < $word_list > in || framework_failure_ +large_ms=$(LC_ALL=C user_time_ 1 grep --file=in -v in) || fail=1 + +# Deliberately recording in an unused variable so it +# shows up in set -x output, in case this test fails. +ratio=$(expr "$large_ms" / "$small_ms") + +# The duration of the larger run must be no more than 60 times +# that of the small one. Using recent versions prior to this fix, +# this test would fail due to ratios larger than 300. Using the +# fixed version, it's common to see a ratio of 20-30. +returns_ 1 expr $small_ms '<' $large_ms / 60 || fail=1 + +Exit $fail diff --git a/src/grep/tests/match-lines b/src/grep/tests/match-lines new file mode 100755 index 0000000..597f061 --- /dev/null +++ b/src/grep/tests/match-lines @@ -0,0 +1,36 @@ +#!/bin/sh +# Trigger a bug in the DFA matcher that would make +# grep -F -x -o PAT print an extra newline for each match. +# This would fail for grep-2.19 and grep-2.20. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf 'a\n' > in || framework_failure_ + +fail=0 + +for locale in C en_US.UTF-8; do + for options in -x '-E -x' '-F -x'; do + for o in '' -o; do + LC_ALL=$locale grep $o $options a in > out || fail=1 + compare out in || fail=1 + done + done +done + +Exit $fail diff --git a/src/grep/tests/max-count-overread b/src/grep/tests/max-count-overread new file mode 100755 index 0000000..23c45cb --- /dev/null +++ b/src/grep/tests/max-count-overread @@ -0,0 +1,15 @@ +#!/bin/sh +# Ensure that -m1 stops reading after the first match. +# In grep-2.19, yes x|grep -m1 x would infloop. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_timeout_ + +fail=0 + +echo x > exp || framework_failure_ + +yes x | timeout 10 grep -m1 x > out || fail=1 +compare exp out || fail=1 + +Exit $fail diff --git a/src/grep/tests/max-count-vs-context b/src/grep/tests/max-count-vs-context new file mode 100755 index 0000000..e80c3ce --- /dev/null +++ b/src/grep/tests/max-count-vs-context @@ -0,0 +1,23 @@ +#!/bin/sh +# Show how -m1 works with -A N when a 2nd match is < N lines after the first +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +cat <<EOF > in || framework_failure_ +needle +1st line of context +2nd line of context +3rd line of context +another needle +5th line of context relative to first match +6th line... +EOF + +sed 6q in > exp || framework_failure_ + +fail=0 +grep -m1 -A5 needle in > out 2>err || fail=1 + +compare exp out || fail=1 +compare /dev/null err || fail=1 + +Exit $fail diff --git a/src/grep/tests/mb-dot-newline b/src/grep/tests/mb-dot-newline new file mode 100755 index 0000000..8cc4ddf --- /dev/null +++ b/src/grep/tests/mb-dot-newline @@ -0,0 +1,33 @@ +#!/bin/sh +# Trigger a bug in the DFA matcher. +# This would fail for grep-2.20. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +printf 'a\naa\n' > in || framework_failure_ +printf 'aa\n' > exp || framework_failure_ + +fail=0 + +for LOC in en_US.UTF-8 en_US zh_CN $LOCALE_FR_UTF8 C; do + out1=out1-$LOC + LC_ALL=$LOC grep '..' in > out || fail=1 + compare exp out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/mb-non-UTF8-overrun b/src/grep/tests/mb-non-UTF8-overrun new file mode 100755 index 0000000..11668a3 --- /dev/null +++ b/src/grep/tests/mb-non-UTF8-overrun @@ -0,0 +1,29 @@ +#!/bin/sh +# grep would sometimes read beyond end of input, when using a non-UTF8 +# multibyte locale. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_JP_EUC_locale_ + +fail=0 + +# This would fail when running an ASAN-enabled binary, or when run via +# valgrind, accessing one byte beyond the end of an input buffer. +returns_ 1 grep -z . < /dev/null || fail=1 + +Exit $fail diff --git a/src/grep/tests/mb-non-UTF8-perf-Fw b/src/grep/tests/mb-non-UTF8-perf-Fw new file mode 100755 index 0000000..c84f28e --- /dev/null +++ b/src/grep/tests/mb-non-UTF8-perf-Fw @@ -0,0 +1,39 @@ +#!/bin/sh +# Test for a performance regression with -Fw and a non-UTF8 multibyte locale. + +# Copyright 2019-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +require_timeout_ +require_JP_EUC_locale_ + +yes 00 | head -10000000 > in || framework_failure_ + +# Since we're using an absolute timeout below and want to avoid any initial +# disk read performance penalty, run first with a large timeout and no error +# test to prime any cache. Prompted by a report of test failure on a netbsd8.1 +# VM whereby the first run would take 2.5 MINUTES, yet the second would complete +# in just half a second. +timeout 500 grep -Fw 0 in + +# Before fixing the regression, this would have taken minutes. +# With the fix, it typically completes in well under one second. +returns_ 1 timeout 30 grep -Fw 0 in || fail=1 + +Exit $fail diff --git a/src/grep/tests/mb-non-UTF8-performance b/src/grep/tests/mb-non-UTF8-performance new file mode 100755 index 0000000..a0e9b70 --- /dev/null +++ b/src/grep/tests/mb-non-UTF8-performance @@ -0,0 +1,48 @@ +#!/bin/sh +# grep-2.17 would take nearly 200x longer to run the command below. +# The 200x is on an Intel i7-based system. +# On an AMD FX-4100, it would take up to 2500x longer. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# This test is susceptible to failure due to differences in +# system load during the two test runs, so we'll mark it as +# "expensive", making it less likely to be run by regular users. +expensive_ + +# Make the input large enough so that even on high-end systems +# the unibyte test takes at least 10ms of user time. +n_lines=100000 +while :; do + yes $(printf '%078d' 0) | sed ${n_lines}q > in || framework_failure_ + ubyte_ms=$(LC_ALL=C user_time_ 1 grep -i foobar in) || fail=1 + test $ubyte_ms -ge 10 && break + n_lines=$(expr $n_lines + 200000) +done + +require_JP_EUC_locale_ +mbyte_ms=$(user_time_ 1 grep -i foobar in) || fail=1 + +# The duration of the multi-byte run must be no more than 30 times +# that of the single-byte one. +# A multiple of 3 seems to be enough for i5,i7, but AMD needs >25. +returns_ 1 expr $ubyte_ms '<' $mbyte_ms / 30 || fail=1 + +Exit $fail diff --git a/src/grep/tests/mb-non-UTF8-word-boundary b/src/grep/tests/mb-non-UTF8-word-boundary new file mode 100755 index 0000000..8c4c755 --- /dev/null +++ b/src/grep/tests/mb-non-UTF8-word-boundary @@ -0,0 +1,29 @@ +#!/bin/sh +# grep -Fw could false-match when using a non-UTF8 multibyte locale. + +# Copyright 2019-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_JP_EUC_locale_ + +fail=0 + +echo ab > in || framework_failure_ + +# This would mistakenly print its input line from grep-2.28..3.3 +returns_ 1 grep -Fw b in || fail=1 + +Exit $fail diff --git a/src/grep/tests/multibyte-white-space b/src/grep/tests/multibyte-white-space new file mode 100755 index 0000000..39b90c6 --- /dev/null +++ b/src/grep/tests/multibyte-white-space @@ -0,0 +1,99 @@ +#! /bin/sh +# Test whether \s matches SP and UTF-8 multi-byte white space characters. +# +# Copyright (C) 2013-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +LC_ALL=en_US.UTF-8 +export LC_ALL + +# It would have been nice to be able to use all UTF8 characters +# with the Unicode WSpace=Y character property, +# https://en.wikipedia.org/wiki/Whitespace_character, but that +# would currently cause distracting failures everywhere I've tried. +# Instead, I've listed each with an indicator column, telling what +# this test should do if the system's locale/tools produce the +# wrong answer. + +# The values in that column: +# X required on all systems (fail if \s or \S fail to work as expected) +# x required on "modern enough" systems +# O optional: \s or \S misbehavior elicits a warning, but never failure + +utf8_space_characters=$(sed 's/.*: *//;s/ */\\x/g' <<\EOF +U+0009 Horizontal Tab: X 09 +U+000A Line feed: O 0a +U+000B Vertical Tab: X 0b +U+000C Form feed: X 0c +U+000D Carriage return: X 0d +U+0020 SPACE: X 20 +U+0085 Next line: O 85 +U+00A0 NO-BREAK SPACE: O c2 a0 +U+1680 OGHAM SPACE MARK: x e1 9a 80 +U+2000 EN QUAD: x e2 80 80 +U+2001 EM QUAD: x e2 80 81 +U+2002 EN SPACE: x e2 80 82 +U+2003 EM SPACE: x e2 80 83 +U+2004 THREE-PER-EM SPACE: x e2 80 84 +U+2005 FOUR-PER-EM SPACE: x e2 80 85 +U+2006 SIX-PER-EM SPACE: x e2 80 86 +U+2007 FIGURE SPACE: O e2 80 87 +U+2008 PUNCTUATION SPACE: x e2 80 88 +U+2009 THIN SPACE: x e2 80 89 +U+200A HAIR SPACE: x e2 80 8a +U+200B ZERO WIDTH SPACE: O e2 80 8b +U+202F NARROW NO-BREAK SPACE: O e2 80 af +U+205F MEDIUM MATHEMATICAL SPACE: x e2 81 9f +U+3000 IDEOGRAPHIC SPACE: x e3 80 80 +EOF +) + +fail=0 + +# On systems that are not "modern enough," simply warn when an "x"-marked +# character is not classified as white space. Too many systems +# have inadequate UTF-8 tables in this respect, and that lack should not +# discourage/confuse those who consider whether to install grep. + +# As for what constitutes "modern enough", I've arbitrarily started +# with "Fedora 20 or newer". Tested additions welcome. +modern_enough=0 +grep -iE 'fedora release [2-9][0-9]+\b' /etc/redhat-release >/dev/null 2>&1 \ + && modern_enough=1 + +for i in $utf8_space_characters; do + eval 'fail() { fail=1; }' + m=ERROR + case $i in + X*) ;; + x*) test $modern_enough = 1 || { eval 'fail() { :; }'; m=warning; } ;; + O*) m=warning; eval 'fail() { :; }' ;; + *) warn_ "unexpected prefix: $i"; exit 1 ;; + esac + + # Strip the prefix byte. + i=${i#?} + + hex_printf_ "$i" | grep -q '^\s$' \ + || { warn_ " $m: \\s failed to match $i in the $LC_ALL locale"; fail; } + hex_printf_ "$i" | returns_ 1 grep -q '\S' \ + || { warn_ " $m: \\S mistakenly matched $i in the $LC_ALL locale"; fail; } +done + + +# This is a separate test, only nominally related to \s. +# It is solely to get coverage of a code path (exercising dfa.c's +# match_mb_charset function) that would have otherwise been untouched. +# However, as of the change-set adding this new test, match_mb_charset +# is unreachable via grep. +printf '\0' | returns_ 1 grep -aE '^\s?$' > out 2>&1 || fail=1 +compare /dev/null out + +Exit $fail diff --git a/src/grep/tests/multiple-begin-or-end-line b/src/grep/tests/multiple-begin-or-end-line new file mode 100755 index 0000000..9f09c62 --- /dev/null +++ b/src/grep/tests/multiple-begin-or-end-line @@ -0,0 +1,28 @@ +#!/bin/sh +# Test a pattern of multiple begin or end line constraints. +# This would mistakenly print a line when using grep-2.19. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +echo aa | grep 'a\(b$\|c$\)' >out && fail=1 +compare /dev/null out || fail=1 + +echo aa | grep '\(^b\|^c\)a' >out && fail=1 +compare /dev/null out || fail=1 + +Exit $fail diff --git a/src/grep/tests/no-perl b/src/grep/tests/no-perl new file mode 100644 index 0000000..956a826 --- /dev/null +++ b/src/grep/tests/no-perl @@ -0,0 +1,6 @@ +#! /bin/sh +# Perl is not available, the test should be considered skipped. +# FD 9 should have been opened by the test suite harness, pointing +# to the original stderr (usually, the user's terminal). +echo "test skipped: no usable version of Perl found" >&9 +exit 77 diff --git a/src/grep/tests/null-byte b/src/grep/tests/null-byte new file mode 100755 index 0000000..9402c2b --- /dev/null +++ b/src/grep/tests/null-byte @@ -0,0 +1,68 @@ +#!/bin/sh +# Test NUL bytes in patterns and data. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Add "." to PATH for the use of get-mb-cur-max. +path_prepend_ . + +locales=C +for locale in en_US.iso885915 en_US.UTF-8; do + get-mb-cur-max en_US.UTF-8 >/dev/null 2>&1 && locales="$locales $locale" +done + +fail=0 + +for left in '' a '#' '\0'; do + for right in '' b '#' '\0'; do + data="$left\\0$right" + printf "$data\\n" >in || framework_failure_ + for hat in '' '^'; do + for dollar in '' '$'; do + for force_regex in '' '\\(\\)\\1'; do + pat="$hat$force_regex$data$dollar" + printf "$pat\\n" >pat || framework_failure_ + for locale in $locales; do + LC_ALL=$locale grep -f pat in + status=$? + test $status -eq 0 || test $status -eq 1 || + fail_ "'$pat' caused an error" + LC_ALL=$locale grep -a -f pat in | cmp -s - in || + fail_ "-a '$pat' does not match '$data'" + done + done + done + done + done +done + +(echo xxx && yes yyy | sed 100000q && printf 'z\n\0') >in || framework_failure_ +echo xxx >exp || framework_failure_ +grep xxx in >out || fail=1 +compare exp out || fail=1 + +printf 'xxx\n' > exp || framework_failure_ +grep -E 'xxx|z' in >out || fail=1 +compare exp out || fail=1 + +printf '%s\0' 'abcadc' >in || framework_failure_ +printf '%s\0' 'abc' 'adc' >exp || framework_failure_ +grep -oz 'a[^c]*c' in >out || fail=1 +compare exp out || fail=1 + +Exit $fail diff --git a/src/grep/tests/options b/src/grep/tests/options new file mode 100755 index 0000000..84ff327 --- /dev/null +++ b/src/grep/tests/options @@ -0,0 +1,49 @@ +#! /bin/sh +# Test for POSIX options for grep +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. +# +# grep [ -E| -F][ -c| -l| -q ][-insvx] -e pattern_list +# [-f pattern_file] ... [file. ..] +# grep [ -E| -F][ -c| -l| -q ][-insvx][-e pattern_list] +# -f pattern_file ... [file ...] +# grep [ -E| -F][ -c| -l| -q ][-insvx] pattern_list [file...] + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# checking for -E extended regex +echo "abababccccccd" | grep -E -e 'c{3}' > /dev/null 2>&1 +if test $? -ne 0 ; then + echo "Options: Wrong status code, test #1 failed" + fail=1 +fi + +# checking for basic regex +echo "abababccccccd" | grep -G -e 'c\{3\}' > /dev/null 2>&1 +if test $? -ne 0 ; then + echo "Options: Wrong status code, test #2 failed" + fail=1 +fi + +# checking for fixed string +echo "abababccccccd" | grep -F -e 'c\{3\}' > /dev/null 2>&1 +if test $? -ne 1 ; then + echo "Options: Wrong status code, test #3 failed" + fail=1 +fi + +# checking for multiple -e options; see: +# https://bugs.gnu.org/21670 +echo abchelloabc | grep -e '^hello' -e 'hello$' > /dev/null 2>&1 +if test $? -ne 1 ; then + echo "Options: Wrong status code, test #4 failed" + fail=1 +fi + +Exit $fail diff --git a/src/grep/tests/pcre b/src/grep/tests/pcre new file mode 100755 index 0000000..449156d --- /dev/null +++ b/src/grep/tests/pcre @@ -0,0 +1,22 @@ +#! /bin/sh +# Simple PCRE tests. +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ + +fail=0 + +echo | grep -P '\s*$' || fail=1 +echo | grep -zP '\s$' || fail=1 +echo '.ab' | returns_ 1 grep -Pwx ab || fail=1 +echo x | grep -Pz '[^a]' || fail=1 +printf 'x\n\0' | returns_ 1 grep -zP 'x$' || fail=1 +printf 'a\nb\0' | grep -zxP a && fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-abort b/src/grep/tests/pcre-abort new file mode 100755 index 0000000..51cee25 --- /dev/null +++ b/src/grep/tests/pcre-abort @@ -0,0 +1,20 @@ +#! /bin/sh +# Show that grep handles PCRE's PCRE_ERROR_MATCHLIMIT. +# In grep-2.8, it would abort. +# +# Copyright (C) 2011-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ + +fail=0 + +echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab > in || framework_failure_ +returns_ 2 grep -P '((a+)*)+$' in > out || fail=1 +compare /dev/null out || fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-context b/src/grep/tests/pcre-context new file mode 100755 index 0000000..b910a20 --- /dev/null +++ b/src/grep/tests/pcre-context @@ -0,0 +1,36 @@ +#!/bin/sh +# Test Perl regex with context +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ + +cat >in <<'EOF' +Preceded by 0 empty lines. + +Preceded by 1 empty line. + + +Preceded by 2 empty lines. + + + +Preceded by 3 empty lines. + + + + +Preceded by 4 empty lines. + +EOF +test $? -eq 0 || framework_failure_ + +printf '%s\0' \ + 'Preceded by 2 empty lines.' \ + 'Preceded by 3 empty lines.' \ + 'Preceded by 4 empty lines.' >exp || framework_failure_ + +fail=0 + +grep -Pzo '(?<=\n\n\n).*' in >out || fail_ 'grep -Pzo failed' +compare exp out || fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-count b/src/grep/tests/pcre-count new file mode 100755 index 0000000..9eda54b --- /dev/null +++ b/src/grep/tests/pcre-count @@ -0,0 +1,28 @@ +#! /bin/sh +# grep -P / grep -Pc are inconsistent results +# This bug affected grep versions 2.21 through 2.22. +# +# Copyright (C) 2015-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ + +fail=0 + +printf 'a\n%032768d\nb\0\n%032768d\na\n' 0 0 > in || framework_failure_ + +# grep will discover that the input is a binary file sooner if the +# page size is larger, so allow for either possible output. +printf 'a\n' >exp1a || framework_failure_ +LC_ALL=C grep -P 'a' in >out || fail=1 +compare exp1a out || compare /dev/null out || fail=1 + +printf '2\n' >exp2 || framework_failure_ +LC_ALL=C grep -Pc 'a' in >out || fail=1 +compare exp2 out || fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-infloop b/src/grep/tests/pcre-infloop new file mode 100755 index 0000000..a4c7cac --- /dev/null +++ b/src/grep/tests/pcre-infloop @@ -0,0 +1,33 @@ +#!/bin/sh +# With some versions of libpcre, apparently including 8.35, +# the following would trigger an infinite loop in its match function. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_timeout_ +require_en_utf8_locale_ +require_compiled_in_MB_support +LC_ALL=en_US.UTF-8 require_pcre_ + +printf 'a\201b\r' > in || framework_failure_ + +fail=0 + +returns_ 1 env LC_ALL=en_US.UTF-8 timeout 10 grep -P 'a.?..b' in \ + || fail_ "libpcre's match function appears to infloop" + +Exit $fail diff --git a/src/grep/tests/pcre-invalid-utf8-infloop b/src/grep/tests/pcre-invalid-utf8-infloop new file mode 100755 index 0000000..45b5ee1 --- /dev/null +++ b/src/grep/tests/pcre-invalid-utf8-infloop @@ -0,0 +1,26 @@ +#! /bin/sh +# Ensure that grep -oaP doesn't infloop for invalid multi-byte input +# +# Copyright (C) 2015-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_timeout_ +require_en_utf8_locale_ +require_compiled_in_MB_support +LC_ALL=en_US.UTF-8 require_pcre_ + +fail=0 + +printf '\201_\0' > in || framework_failure_ +printf '_\n' > exp || framework_failure_ + +LC_ALL=en_US.UTF-8 timeout 10 grep -aoP _ in > out 2> err || fail=1 + +compare exp out || fail=1 +compare /dev/null err || fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-invalid-utf8-input b/src/grep/tests/pcre-invalid-utf8-input new file mode 100755 index 0000000..d1a2920 --- /dev/null +++ b/src/grep/tests/pcre-invalid-utf8-input @@ -0,0 +1,31 @@ +#! /bin/sh +# Ensure that grep -P doesn't abort or infloop for invalid multi-byte input +# +# Copyright (C) 2013-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_timeout_ +require_en_utf8_locale_ +require_compiled_in_MB_support +LC_ALL=en_US.UTF-8 require_pcre_ + +fail=0 + +printf 'j\202j\nj\nk\202\n' > in || framework_failure_ + +LC_ALL=en_US.UTF-8 timeout 10 grep -P j in +test $? -eq 0 || fail=1 + +LC_ALL=en_US.UTF-8 timeout 10 grep -P 'k$' in +test $? -eq 1 || fail=1 + +echo k >exp + +LC_ALL=en_US.UTF-8 timeout 10 grep -aoP 'k*' in >out || fail=1 +compare exp out || fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-jitstack b/src/grep/tests/pcre-jitstack new file mode 100755 index 0000000..2a2b1b9 --- /dev/null +++ b/src/grep/tests/pcre-jitstack @@ -0,0 +1,63 @@ +#! /bin/sh +# Grep 2.21 would report "grep: internal PCRE error: -27" +# +# Copyright 2015-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ + +for p in 'base64 -d' 'base64 -D' 'openssl base64 -d' \ + "perl -MMIME::Base64 -0777ne 'print decode_base64(\$_)'" FAIL; do + test "$p" = FAIL && skip_ "your system lacks a base64 decoder" + x=$(echo eA==| ( eval "$p" ) 2>/dev/null) && test "X$x" = Xx && + { + eval "b64_decode() { $p; }" + break + } +done + +foo=$( (echo foo | gzip | gzip -d) 2>/dev/null) && test "X$foo" = Xfoo \ + || skip_ "your system lacks the gzip program" + +fail=0 + +b64_decode >pcrejit.txt.gz <<'EOF' || framework_failure_ +H4sIAAAAAAACA+2bUU4DMQxE/7mMz5T7XwKE+IBKVLue58yk0B9EtX6xJxN7t4VaH69a6+tHrW+/ +r4e3n75KARWShSOFTtiumE3FPVyo79ATIJ0Ry0No/yXe99UIUqTGKKUzYHFJHJoaCONQDCnDSCDS +IPAvGCVeXNsZ7lpbWFfdaZtgPos5LeK2C1TBKzD09V3HFlCOsbFT/hNbz4HzJaRjnjdam9FXw/o6 +VyPozhMmiaRYAMeNSJR1iMjBEFLMtsH7lptartfxkzPQgFVofwRlxKsMYn2KNDnU9fsOQCkRIYVT +G80ZRqBpSQjRYPX7s9gvtqknyNE2f8V09sxHM7YPmMMJgrmVna2AT717n5fUAIDkiBCqFgWUUgKD +8jOc0Rgj5JS6vZnQI14wkaTDAkD266p/iVHs8gjCrMFARVM0iEVgFAa9YRAQT4tkgsmloTJLmyCm +uSHRnTkzIdZMmZ5kYX/iJFtTwu9cFvr3aDWcUx4pUW/cVQwPoQSlwguNd4M0vTpAauKodmLFXv1P +dkcKkYUglER2Q4L4gnmOiNGzSBATwGQgwihs5/QffIhyfg4hJvM2r4Rp6L+1ibCCd4jYZ6jCiBlc +2+y4fl4yTGIwcWXNAUEeXmu8iCMV96DNTnmRNICDk2N5qaXGbsF91OX/0hlcYTjrMfy02p9Xv70D +mv3RZCFOAAA= +EOF + +gzip -d pcrejit.txt || framework_failure_ + +LC_ALL=C grep -P -n '^([/](?!/)|[^/])*~/.*' pcrejit.txt +if test $? != 1; then + # The above often makes grep attempt to use an inordinate amount + # of stack space. If grep fails with $? != 1, try again, but this + # time with no soft limit: + + # Use ulimit to remove that limit, if possible. + # If ulimit is not usable, just skip this test. + (ulimit -s unlimited) || skip_ this shell lacks ulimit support + + # Rerun that same test, but now with no limit on stack size: + (ulimit -s unlimited; + returns_ 1 env LC_ALL=C grep -P -n '^([/](?!/)|[^/])*~/.*' pcrejit.txt 2> err) \ + || fail=1 + + # If that failed due to stack overflow, don't cry foul. + overflow_pat="stack overflow|exceeded PCRE's recursion limit" + test $fail = 1 && { grep -Eq "$overflow_pat" err && fail=0 || cat err; } +fi + +Exit $fail diff --git a/src/grep/tests/pcre-o b/src/grep/tests/pcre-o new file mode 100755 index 0000000..1d155a7 --- /dev/null +++ b/src/grep/tests/pcre-o @@ -0,0 +1,17 @@ +#! /bin/sh +# Ensure that grep -oP doesn't cause internal error at match. +# +# Copyright (C) 2014-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ + +fail=0 + +echo ab | grep -oP 'a' || fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-utf8 b/src/grep/tests/pcre-utf8 new file mode 100755 index 0000000..c5d0b80 --- /dev/null +++ b/src/grep/tests/pcre-utf8 @@ -0,0 +1,40 @@ +#! /bin/sh +# Ensure that, with -P, Unicode \p{} symbols are correctly matched. +# +# Copyright (C) 2012-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_en_utf8_locale_ +LC_ALL=en_US.UTF-8 require_pcre_ + +fail=0 + +echo '$' | LC_ALL=en_US.UTF-8 grep -qP '\p{S}' \ + || skip_ 'PCRE support is compiled out, or it does not support properties' + +euro='\342\202\254 euro' +printf "$euro\\n" > in || framework_failure_ + +# The euro sign has the unicode "Symbol" property, so this must match: +LC_ALL=en_US.UTF-8 grep -P '^\p{S}' in > out || fail=1 +compare in out || fail=1 + +# This RE must *not* match in the C locale, because the first +# byte is not a "Symbol". +LC_ALL=C grep -P '^\p{S}' in > out && fail=1 +compare /dev/null out || fail=1 + +LC_ALL=en_US.UTF-8 grep -P '^. euro$' in > out2 || fail=1 +compare in out2 || fail=1 + +LC_ALL=en_US.UTF-8 grep -oP '. euro' in > out3 || fail=1 +compare in out3 || fail=1 + +LC_ALL=en_US.UTF-8 grep -P '^\P{S}' in > out4 +compare /dev/null out4 || fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-w b/src/grep/tests/pcre-w new file mode 100755 index 0000000..7173b58 --- /dev/null +++ b/src/grep/tests/pcre-w @@ -0,0 +1,31 @@ +#! /bin/sh +# Before grep-2.19, grep -Pw %% would match %% enclosed in word boundaries +# +# Copyright (C) 2014-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ + +fail=0 + +echo %aa% > in || framework_failure_ +grep -Pw aa in > out || fail=1 +compare out in || fail=1 + +echo a%%a > in || framework_failure_ +grep -Pw %% in > out && fail=1 +compare /dev/null out || fail=1 + +echo %%%% > in || framework_failure_ +grep -Pw %% in > out || fail=1 +compare out in || fail=1 + +echo %% > in || framework_failure_ +grep -Pw %% in > out || fail=1 +compare out in || fail=1 + +Exit $fail diff --git a/src/grep/tests/pcre-wx-backref b/src/grep/tests/pcre-wx-backref new file mode 100755 index 0000000..350091a --- /dev/null +++ b/src/grep/tests/pcre-wx-backref @@ -0,0 +1,28 @@ +#! /bin/sh +# Before grep-2.19, grep -P and -w/-x would not work with a back-reference. +# +# Copyright (C) 2014-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ + +echo aa > in || framework_failure_ +echo 'grep: reference to non-existent subpattern' > exp-err \ + || framework_failure_ + +fail=0 + +for xw in x w; do + grep -P$xw '(.)\1' in > out 2>&1 || fail=1 + compare out in || fail=1 + + grep -P$xw '(.)\2' in > out 2> err && fail=1 + compare /dev/null out || fail=1 + compare exp-err err || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/pcre-z b/src/grep/tests/pcre-z new file mode 100755 index 0000000..4ce9a93 --- /dev/null +++ b/src/grep/tests/pcre-z @@ -0,0 +1,28 @@ +#!/bin/sh +# Test Perl regex with NUL-separated input +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_pcre_ +require_en_utf8_locale_ + +REGEX=a + +printf '%s\n\0' abc def ghi aaa gah > in || framework_failure_ + +grep -z "$REGEX" in > exp 2>err || fail_ 'Cannot do BRE (grep -z) match.' +compare /dev/null err || fail_ 'stderr not empty on grep -z.' + +# Sanity check the output +test "$(grep -cz $REGEX in 2>err)" = 3 \ + || fail_ 'Incorrect BRE (grep -cz) match.' +compare /dev/null err || fail_ 'stderr not empty on grep -cz.' + +fail=0 +grep -Pz "$REGEX" in > out 2>err || fail=1 +compare exp out || fail=1 +compare /dev/null err || fail=1 + +printf '\303\200\0' >in0 # "À" followed by a NUL. +LC_ALL=en_US.UTF-8 grep -z . in0 >out || fail=1 +cmp in0 out || fail=1 + +Exit $fail diff --git a/src/grep/tests/posix-bracket b/src/grep/tests/posix-bracket new file mode 100755 index 0000000..5b8a0fc --- /dev/null +++ b/src/grep/tests/posix-bracket @@ -0,0 +1,34 @@ +#!/bin/sh +# Check various bracket expressions in the POSIX locale. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +LC_ALL=C +export LC_ALL + +fail=0 + +echo a >in || framework_failure_ +for bracketed in '[.a.]' '[.a.]-a' 'a-[.a.]' '[.a.]-[.a.]' \ + '[=a=]' '[:alpha:]' 'a-a[.-.]--'; do + grep "[$bracketed]" in >out || fail=1 + compare in out || fail=1 + grep "[^$bracketed]" in >out + test $? -eq 1 || fail=1 + compare /dev/null out || fail=1 +done +Exit $fail diff --git a/src/grep/tests/prefix-of-multibyte b/src/grep/tests/prefix-of-multibyte new file mode 100755 index 0000000..2228a22 --- /dev/null +++ b/src/grep/tests/prefix-of-multibyte @@ -0,0 +1,44 @@ +#!/bin/sh +# This would mistakenly print a line prior to grep-2.18. +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support + +encode() { echo "$1" | tr ABC '\357\274\241'; } + +encode ABC >exp1 +encode aABC >exp2 +encode ABCABC >exp3 +encode _____________________ABCABC___ >exp4 + +fail=0 + +for LOC in en_US.UTF-8 $LOCALE_FR_UTF8; do + for pat in A aA BCA; do + for file in exp1 exp2 exp3 exp4; do + for type in regex dfa fgrep; do + case $type in + dfa) opt= prefix= ;; + fgrep) opt=-F prefix= ;; + regex) opt= prefix='\(\)\1' ;; + esac + pattern=$prefix$(encode $pat) + out=out-$type-$LOC + LC_ALL=$LOC grep $opt "$pattern" $file >$out + status=$? + echo $status >$out.status + if test $status -eq 0; then + compare $file $out + elif test $status -eq 1; then + compare_dev_null_ /dev/null $out + else + test $status -eq 2 + fi || fail=1 + compare out-regex-$LOC.status $out.status || fail=1 + done + done + done +done + +Exit $fail diff --git a/src/grep/tests/proc b/src/grep/tests/proc new file mode 100755 index 0000000..43b62d8 --- /dev/null +++ b/src/grep/tests/proc @@ -0,0 +1,18 @@ +#! /bin/sh +# Test the /proc file system if available. + +# Copyright 2016-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +test -r /proc/self/status || skip_ 'No /proc/self/status on this platform.' + +grep '^' </proc/self/status >/dev/null || fail=1 + +Exit $fail diff --git a/src/grep/tests/r-dot b/src/grep/tests/r-dot new file mode 100755 index 0000000..29aedad --- /dev/null +++ b/src/grep/tests/r-dot @@ -0,0 +1,20 @@ +#!/bin/sh +# Check that "grep -r PAT" reads ".". +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +mkdir dir || framework_failure_ +echo aaa > dir/a || framework_failure_ +echo bbb > dir/b || framework_failure_ + +echo a:aaa > exp || framework_failure_ + +(cd dir && grep -r aaa) > out || fail=1 +compare exp out || fail=1 + +(cd dir && grep -r aaa < a) > out || fail=1 +compare exp out || fail=1 + +(cd dir && grep -r aaa *) > out || fail=1 +compare exp out || fail=1 + +Exit $fail diff --git a/src/grep/tests/repetition-overflow b/src/grep/tests/repetition-overflow new file mode 100755 index 0000000..38a652d --- /dev/null +++ b/src/grep/tests/repetition-overflow @@ -0,0 +1,19 @@ +#!/bin/sh +# These would fail (i.e., match erroneously) prior to grep-2.11. +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +xp1=4294967297 # 2^32+1 +xp2=4294967298 # 2^32+2 + +fail=0 + +# Before grep-2.11, when DFA-matching, a repetition count exceeding the +# range of "unsigned int" would silently wrap around. Hence, 2^32+1 +# would be treated just like "1", and both of these would mistakenly match. + +echo abc | returns_ 2 grep -E "b{$xp1}" > out 2> /dev/null || fail=1 +compare /dev/null out || fail=1 +echo abbc | returns_ 2 grep -E "b{1,$xp2}" > out 2> /dev/null || fail=1 +compare /dev/null out || fail=1 + +Exit $fail diff --git a/src/grep/tests/reversed-range-endpoints b/src/grep/tests/reversed-range-endpoints new file mode 100755 index 0000000..4c2193c --- /dev/null +++ b/src/grep/tests/reversed-range-endpoints @@ -0,0 +1,18 @@ +#!/bin/sh +# Ensure that an invalid range like [b-a] evokes exit status of 2. +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +printf 'grep: Invalid range end\n' > exp +for prog in grep 'grep -E'; do + # exit status must be 2, not 1 + returns_ 2 $prog '[b-a]' < /dev/null > out 2>&1 || fail=1 + + # Normalize the diagnostic prefix from e.g., "/mnt/dir/grep: " to "grep: " + sed 's/^[^:]*: /grep: /' out > k && mv k out + + compare exp out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/sjis-mb b/src/grep/tests/sjis-mb new file mode 100755 index 0000000..abe2c0c --- /dev/null +++ b/src/grep/tests/sjis-mb @@ -0,0 +1,62 @@ +#!/bin/sh +# similar to euc-mb and fgrep-infloop, but tests SJIS encoding. +# in this encoding, an ASCII character is both a valid single-byte +# character, and a suffix of a valid double-byte character + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Add "." to PATH for the use of get-mb-cur-max. +path_prepend_ . + +require_compiled_in_MB_support +require_timeout_ + +# Sequences used in this test ("%" and "@" become 8-bit characters, while "A" +# is the real ASCII character for "A"): +# - "%" becomes an half-width katakana in SJIS, but it is an invalid sequence +# in UTF-8. +# - "@@" and "@A" are both valid sequences in SJIS. We try to fool grep into +# matching "A" against "@A", or mistaking a valid "A" match for the second +# byte of a multi-byte character. + +encode() { echo "$1" | tr @% '\203\301'; } + +for locale in ja_JP.SHIFT_JIS ja_JP.SJIS ja_JP.PCK ''; do + test "$(get-mb-cur-max $locale)" = 2 && break +done +test -n "$locale" || skip_ 'SJIS locale not found' + +k=0 +test_grep_reject() { + k=$(expr $k + 1) + encode "$2" > in || return 1 + returns_ 1 env LC_ALL=$locale timeout 10s \ + grep $1 $(encode "$3") in >out$k 2>&1 \ + && compare /dev/null out$k +} + +test_grep() { + k=$(expr $k + 1) + encode "$2" > exp$k + LC_ALL=$locale \ + timeout 10s grep $1 $(encode "$3") exp$k > out$k 2>&1 + test $? = 0 && compare exp$k out$k +} + +failure_tests=@A +successful_tests='%%AA @AA @A@@A' + +fail=0 +for i in $successful_tests; do + test_grep -F $i A || fail=1 + test_grep -E $i A || fail=1 +done + +for i in $failure_tests; do + test_grep_reject -F $i A || fail=1 + test_grep_reject -E $i A || fail=1 +done + +test_grep_reject -E @A '^$|A' || fail=1 + +Exit $fail diff --git a/src/grep/tests/skip-device b/src/grep/tests/skip-device new file mode 100755 index 0000000..d6368f1 --- /dev/null +++ b/src/grep/tests/skip-device @@ -0,0 +1,16 @@ +#!/bin/sh +# grep must ignore --devices=ACTION (-D) when reading stdin +# For grep-2.11, this test would fail. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Test both with no file argument, and with "-". +echo foo | grep -D skip foo - || fail=1 +echo foo | grep --devices=skip foo || fail=1 + +require_timeout_ +mkfifo myfifo || framework_failure_ +timeout 10 grep -D skip foo myfifo +test $? -eq 1 || fail=1 + +Exit $fail diff --git a/src/grep/tests/skip-read b/src/grep/tests/skip-read new file mode 100755 index 0000000..1e9e718 --- /dev/null +++ b/src/grep/tests/skip-read @@ -0,0 +1,25 @@ +#!/bin/sh +# Check that grep skips reading in some cases. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +echo /dev/null >exp || framework_failure_ + +for opts in '-m0 y' '-f /dev/null' '-v ""'; do + for matcher in '' -E -F; do + for file in /dev/null no-such-file; do + eval returns_ 1 grep $opts $matcher no-such-file > out || fail=1 + compare /dev/null out || fail=1 + eval returns_ 1 grep -l $opts $matcher /dev/null > out || fail=1 + compare /dev/null out || fail=1 + done + eval returns_ 1 grep -L $opts $matcher /dev/null > out || fail=1 + compare exp out || fail=1 + eval returns_ 1 grep -L $opts $matcher /dev/null > /dev/null || fail=1 + done +done + + +Exit $fail diff --git a/src/grep/tests/spencer1 b/src/grep/tests/spencer1 new file mode 100755 index 0000000..56eaeda --- /dev/null +++ b/src/grep/tests/spencer1 @@ -0,0 +1,21 @@ +#! /bin/sh +# Regression test for GNU grep. +# Copyright (C) 1988 Henry Spencer. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# . . . and the following by Henry Spencer. + +${AWK-awk} -f $abs_top_srcdir/tests/spencer1.awk \ + $abs_top_srcdir/tests/spencer1.tests > spencer1.script || fail=1 + +. ./spencer1.script || fail=1 + +Exit 1 diff --git a/src/grep/tests/spencer1-locale b/src/grep/tests/spencer1-locale new file mode 100755 index 0000000..6a3d58a --- /dev/null +++ b/src/grep/tests/spencer1-locale @@ -0,0 +1,23 @@ +#! /bin/sh +# Regression test for GNU grep. +# +# Copyright (C) 1988 Henry Spencer. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# . . . and the following by Henry Spencer. + +${AWK-awk} -v extra_locale=$LOCALE_FR_UTF8 \ + -f "$abs_srcdir/spencer1-locale.awk" "$abs_srcdir/spencer1.tests" \ + > spencer1-locale.script || fail=1 + +${re_shell-${SHELL-sh}} spencer1-locale.script || fail=1 + +Exit $fail diff --git a/src/grep/tests/spencer1-locale.awk b/src/grep/tests/spencer1-locale.awk new file mode 100644 index 0000000..36a2c5b --- /dev/null +++ b/src/grep/tests/spencer1-locale.awk @@ -0,0 +1,32 @@ +# Copyright (C) 1988 Henry Spencer. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +BEGIN { + FS = "@"; + printf ("failures=0\n"); +} + +$0 !~ /^#/ && NF == 3 { + test("en_US.UTF-8") + test("ru_RU.KOI8-R") + test("fr_FR.ISO-8859-1") + test("zh_CN") + if (extra_locale != "") { + test(extra_locale) + } +} + +function test(locale) +{ + printf ("status=$(echo '%s'| { LC_ALL=%s grep -E -e '%s' >/dev/null 2>&1 ; echo $?; })\n",$3, locale, $2); + printf ("if test $status -ne %s ; then\n", $1); + printf ("\techo Spencer test \\#%d failed \\(%s\\)\n", ++n, locale); + printf ("\tfailures=1\n"); + printf ("fi\n"); +} + +END { printf ("exit $failures\n"); } diff --git a/src/grep/tests/spencer1.awk b/src/grep/tests/spencer1.awk new file mode 100644 index 0000000..6b9d3ee --- /dev/null +++ b/src/grep/tests/spencer1.awk @@ -0,0 +1,22 @@ +# Copyright (C) 1988 Henry Spencer. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +BEGIN { + FS = "@"; + printf ("failures=0\n"); +} + +$0 !~ /^#/ && NF == 3 { +# printf ("status=$(echo '%s'| { grep -E -e '%s' > /dev/null 2>&1; echo $?; cat >/dev/null; })\n",$3, $2); + printf ("status=$(echo '%s'| { grep -E -e '%s' >/dev/null 2>&1 ; echo $?; })\n",$3, $2); + printf ("if test $status -ne %s ; then\n", $1); + printf ("\techo Spencer test \\#%d failed\n", ++n); + printf ("\tfailures=1\n"); + printf ("fi\n"); +} + +END { printf ("exit $failures\n"); } diff --git a/src/grep/tests/spencer1.tests b/src/grep/tests/spencer1.tests new file mode 100644 index 0000000..50581e8 --- /dev/null +++ b/src/grep/tests/spencer1.tests @@ -0,0 +1,144 @@ +0@abc@abc +1@abc@xbc +1@abc@axc +1@abc@abx +0@abc@xabcy +0@abc@ababc +0@ab*c@abc +0@ab*bc@abc +0@ab*bc@abbc +0@ab*bc@abbbbc +0@ab+bc@abbc +1@ab+bc@abc +1@ab+bc@abq +0@ab+bc@abbbbc +0@ab?bc@abbc +0@ab?bc@abc +1@ab?bc@abbbbc +0@ab?c@abc +0@^abc$@abc +1@^abc$@abcc +0@^abc@abcc +1@^abc$@aabc +0@abc$@aabc +0@^@abc +0@$@abc +0@a.c@abc +0@a.c@axc +0@a.*c@axyzc +1@a.*c@axyzd +1@a[bc]d@abc +0@a[bc]d@abd +1@a[b-d]e@abd +0@a[b-d]e@ace +0@a[b-d]@aac +0@a[-b]@a- +0@a[b-]@a- +2@a[b-a]@- +2@a[]b@- +2@a[@- +0@a]@a] +0@a[]]b@a]b +0@a[^bc]d@aed +1@a[^bc]d@abd +0@a[^-b]c@adc +1@a[^-b]c@a-c +1@a[^]b]c@a]c +0@a[^]b]c@adc +0@ab|cd@abc +0@ab|cd@abcd +0@()ef@def +0@()*@- +1@*a@- +0@^*@- +0@$*@- +2@(*)b@-@TO CORRECT +1@$b@b +2@a\@- +0@a\(b@a(b +0@a\(*b@ab +0@a\(*b@a((b +1@a\x@a\x +1@abc)@- +2@(abc@- +0@((a))@abc +0@(a)b(c)@abc +0@a+b+c@aabbabc +0@a**@- +0@a*?@- +0@(a*)*@- +0@(a*)+@- +0@(a|)*@- +0@(a*|b)*@- +0@(a+|b)*@ab +0@(a+|b)+@ab +0@(a+|b)?@ab +0@[^ab]*@cde +0@(^)*@- +0@(ab|)*@- +2@)(@- +1@abc@ +1@abc@ +0@a*@ +0@([abc])*d@abbbcd +0@([abc])*bcd@abcd +0@a|b|c|d|e@e +0@(a|b|c|d|e)f@ef +0@((a*|b))*@- +0@abcd*efg@abcdefg +0@ab*@xabyabbbz +0@ab*@xayabbbz +0@(ab|cd)e@abcde +0@[abhgefdc]ij@hij +1@^(ab|cd)e@abcde +0@(abc|)ef@abcdef +0@(a|b)c*d@abcd +0@(ab|ab*)bc@abc +0@a([bc]*)c*@abc +0@a([bc]*)(c*d)@abcd +0@a([bc]+)(c*d)@abcd +0@a([bc]*)(c+d)@abcd +0@a[bcd]*dcdcde@adcdcde +1@a[bcd]+dcdcde@adcdcde +0@(ab|a)b*c@abc +0@((a)(b)c)(d)@abcd +0@[A-Za-z_][A-Za-z0-9_]*@alpha +0@^a(bc+|b[eh])g|.h$@abh +0@(bc+d$|ef*g.|h?i(j|k))@effgz +0@(bc+d$|ef*g.|h?i(j|k))@ij +1@(bc+d$|ef*g.|h?i(j|k))@effg +1@(bc+d$|ef*g.|h?i(j|k))@bcdd +0@(bc+d$|ef*g.|h?i(j|k))@reffgz +1@((((((((((a))))))))))@- +0@(((((((((a)))))))))@a +0@ca{0,0}b@cb +1@ca{0,0}b@cab +0@ca{0,1}b@cb +0@ca{0,1}b@cab +1@ca{0,1}b@caab +1@ca{1,2}b@cb +0@ca{1,2}b@cab +0@ca{1,2}b@caab +1@ca{1,2}b@caaab +1@multiple words of text@uh-uh +0@multiple words@multiple words, yeah +0@(.*)c(.*)@abcde +1@\((.*),@(.*)\) +1@[k]@ab +0@abcd@abcd +0@a(bc)d@abcd +0@a[-]?c@ac +0@a[]?c@ac +0@(....).*\1@beriberi +0@(^|\B)a@abc +0@(^|\B)a@xyzabc +1@(^|\B)a@xyz abc +0@^a|\Ba@abc +0@^a|\Ba@xyzabc +1@^a|\Ba@xyz abc +0@(^|\>)a@abc +1@(^|\>)a@xyzabc +1@(^|\>)a@xyz abc +0@^a|\>a@abc +1@^a|\>a@xyzabc +1@^a|\>a@xyz abc diff --git a/src/grep/tests/stack-overflow b/src/grep/tests/stack-overflow new file mode 100755 index 0000000..d4d4b43 --- /dev/null +++ b/src/grep/tests/stack-overflow @@ -0,0 +1,53 @@ +#!/bin/sh +# Ensure a stack overflow no longer segfaults + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +case $host_triplet in + *-midnightbsd*) + skip_ 'our stack-overflow detection does not work on this system';; +esac + +# When compiled with ASAN, skip this test, because (on Fedora 32) it +# would fail due to output like this on stderr: +# +==2176827==WARNING: ASan is ignoring requested __asan_handle_no_return: +# stack top: 0x7ffc48f20000; bottom 0x000000e25000; size: 0x7ffc480fb000 (140721517473792) +# +False positive error reports may follow +# +For details see https://github.com/google/sanitizers/issues/189 +ASAN_OPTIONS=help=true grep --version 2>&1 | grep -q AddressSanitizer \ + && skip_ 'avoid false failure when built with ASAN' + +echo grep: stack overflow > exp || framework_failure_ + +# Limit stack size. Otherwise, it appears to be too hard to overflow the +# stack on some systems like gcc113, aarch64/linux-3.13.0 with 32GB of RAM +# and 20GB of swap. +ulimit -s 8192 2>/dev/null + +# grep attempts to detect overflow via gnulib's c-stack module. +# Trigger that with an input regex composed solely of open parentheses, +# increasing the size of that input until grep emits the expected diagnostic. +fail=0 +for i in 1 3 5 10 20 30 40 50 100 200 400 1000; do + # Create a file containing $i * 10000 open parentheses: + printf %0${i}0000d 0|tr 0 '(' > in || framework_failure_ + grep -E -f in >out 2>err; st=$? + if grep -q 'stack overflow' err; then + test $st = 2 || fail=1 + compare /dev/null out || fail=1 + compare exp err || fail=1 + test $fail = 0 && Exit 0 + fail_ 'printed "stack overflow", but something else was wrong' + fi +done + +# If there was no stack overflow message and the final run exited with +# status 1 and both stdout and stderr were empty, then assume it's a working +# regex that avoids the internal stack overflow problem like glibc's regexp +# used to. +test $st = 1 \ + && ! test -s out \ + && ! test -s err \ + && Exit 0 + +fail_ 'grep never printed "stack overflow"' diff --git a/src/grep/tests/status b/src/grep/tests/status new file mode 100755 index 0000000..4b15426 --- /dev/null +++ b/src/grep/tests/status @@ -0,0 +1,73 @@ +#! /bin/sh +# Test for status code for GNU grep. +# status code +# 0 match found +# 1 no match +# 2 file not found +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +# should return 0 found a match +echo "abcd" | grep -E -e 'abc' > /dev/null 2>&1 +if test $? -ne 0 ; then + echo "Status: Wrong status code, test \#1 failed" + fail=1 +fi + +# should return 1 found no match +echo "abcd" | grep -E -e 'zbc' > /dev/null 2>&1 +if test $? -ne 1 ; then + echo "Status: Wrong status code, test \#2 failed" + fail=1 +fi + +# the filename MMMMMMMM.MMM should not exist hopefully +if test -r MMMMMMMM.MMM; then + echo "Please remove MMMMMMMM.MMM to run check" +else + # should return 2 file not found + grep -E -e 'abc' MMMMMMMM.MMM > /dev/null 2>&1 + if test $? -ne 2 ; then + echo "Status: Wrong status code, test \#3 failed" + fail=1 + fi + + # should return 2 file not found + grep -E -s -e 'abc' MMMMMMMM.MMM > /dev/null 2>&1 + if test $? -ne 2 ; then + echo "Status: Wrong status code, test \#4 failed" + fail=1 + fi + + # should return 0 (found a match) or 2 (file not found) + echo "abcd" | grep -E -s 'abc' - MMMMMMMM.MMM > /dev/null 2>&1 + status=$? + if test $status -ne 0 && test $status -ne 2 ; then + echo "Status: Wrong status code, test \#5 failed" + fail=1 + fi + + # should return 0 found a match + echo "abcd" | grep -E -q -s 'abc' MMMMMMMM.MMM - > /dev/null 2>&1 + if test $? -ne 0 ; then + echo "Status: Wrong status code, test \#6 failed" + fail=1 + fi + + # should still return 0 found a match + echo "abcd" | grep -E -q 'abc' MMMMMMMM.MMM - > /dev/null 2>&1 + if test $? -ne 0 ; then + echo "Status: Wrong status code, test \#7 failed" + fail=1 + fi +fi + +Exit $fail diff --git a/src/grep/tests/surrogate-pair b/src/grep/tests/surrogate-pair new file mode 100755 index 0000000..a91fa36 --- /dev/null +++ b/src/grep/tests/surrogate-pair @@ -0,0 +1,60 @@ +#!/bin/sh +# Check the handling of characters outside the Unicode BMP. + +# Copyright (C) 2013-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support + +fail=0 + +s_pair=$(printf '\360\220\220\205') +printf '%s\n' "$s_pair" > in || framework_failure_ + +LC_ALL=en_US.UTF-8 +export LC_ALL + +# On Cygwin, before grep-2.15, this would segfault. +# Require not just non-zero exit status, but exactly 1. +returns_ 1 grep -i anything-else in > out 2>&1 || fail=1 +# Expect no output. +compare /dev/null out || fail=1 + +# This must always match, even on a 16-bit-wchar_t system. +grep . in > out 2> err || fail=1 + +# On platforms where wchar_t is only 16 bits, wchar_t cannot represent +# the character encoded in 'in'. + +# On such old systems the above prints nothing on stdout and a diagnostic +# on stderr. In that case, return early; otherwise, the following tests +# would all fail. +io_pair=$(cat out):$(cat err) +case $io_pair in + :'grep: in: binary file matches') Exit $fail;; + $s_pair:) ;; + *) fail_ "unexpected output: $io_pair"; fail=1;; +esac + +# Also test whether a surrogate-pair in the search string works. +for opt in '' -i -E -F -iE -iF; do + grep --file=in $opt in > out 2>&1 || fail=1 + compare out in || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/symlink b/src/grep/tests/symlink new file mode 100755 index 0000000..b580ce7 --- /dev/null +++ b/src/grep/tests/symlink @@ -0,0 +1,67 @@ +#!/bin/sh +# Check that "grep -r" does the right thing with symbolic links. + +# Copyright (C) 2012-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# written by Paul Eggert + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +mkdir dir || framework_failure_ +echo a > dir/a || framework_failure_ +echo b > dir/b || framework_failure_ +ln -s a dir/c || framework_failure_ +ln -s . dir/d || framework_failure_ +ln -s dangling dir/e || framework_failure_ + +touch out || framework_failure_ + +for recursion in '' -r -R +do + for files in '' '*' + do + case $recursion,$files in + -R,* | *,'*') expected_status=2 ;; + *) expected_status=0 ;; + esac + + (cd dir && grep $recursion '^' $files <a ) >grepout + test $? -eq $expected_status || fail=1 + + case $recursion,$files in + ,) + exp='a\n' ;; + ,'*' | -R,) + exp='a:a\nb:b\nc:a\n' ;; + -r,) + exp='a:a\nb:b\n' ;; + -r,'*') + exp='a:a\nb:b\nc:a\nd/a:a\nd/b:b\n' ;; + -R,'*') + exp='a:a\nb:b\nc:a\nd/a:a\nd/b:b\nd/c:a\n' ;; + *) + framework_failure_ ;; + esac + + printf "$exp" >exp || framework_failure_ + + LC_ALL=C sort grepout >out || fail=1 + + compare exp out || fail=1 + done +done + +Exit $fail diff --git a/src/grep/tests/triple-backref b/src/grep/tests/triple-backref new file mode 100755 index 0000000..796fa7b --- /dev/null +++ b/src/grep/tests/triple-backref @@ -0,0 +1,30 @@ +#! /bin/sh +# Test for a bug in glibc's regex code as of September 7, 2014. +# +# Copyright (C) 2014-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +# This tickles a bug in the regex code that can cause heap violations etc. +# A fix would be welcome, though fixing is not trivial. See: +# https://sourceware.org/bugzilla/show_bug.cgi?id=11053 + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_timeout_ + +echo a > in || framework_failure_ + +fail=0 + +# Clear this, so glibc doesn't bother to produce a core dump. +MALLOC_CHECK_= + +warn_ "$ME_: expect malfunction on glibc systems due to" \ + "https://sourceware.org/bugzilla/show_bug.cgi?id=11053" + +timeout 10 grep -E '(.?)(.?)(.?)\3\2\1' in > out || fail=1 +compare out in || fail=1 + +Exit $fail diff --git a/src/grep/tests/turkish-I b/src/grep/tests/turkish-I new file mode 100755 index 0000000..cfe90c2 --- /dev/null +++ b/src/grep/tests/turkish-I @@ -0,0 +1,33 @@ +#!/bin/sh +# grep -i in UTF-8: missing NL in output on line containing I WITH DOT (U+0130) + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support + +fail=0 + +i='\304\260' +printf "$i$i$i$i$i$i$i\n" > in || framework_failure_ + +LC_ALL=en_US.UTF-8 grep -i .... in > out || fail=1 + +compare out in || fail=1 + +Exit $fail diff --git a/src/grep/tests/turkish-I-without-dot b/src/grep/tests/turkish-I-without-dot new file mode 100755 index 0000000..127ec2f --- /dev/null +++ b/src/grep/tests/turkish-I-without-dot @@ -0,0 +1,55 @@ +#!/bin/sh +# grep -i would misbehave for any matched line containing a character +# (like "I" in the tr_TR.utf8 locale) whose lower-case representation +# occupies more bytes (two in this case, for 0xc4b1, aka U+0131). + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_tr_utf8_locale_ +require_compiled_in_MB_support + +# Before this change, grep could print a lot of uninitialized memory: +# $ printf "IIIIIII\n" > in +# $ for i in $(seq 10); do LC_ALL=tr_TR.utf8 src/grep -i . in|wc -c; done +# 760 +# 754 +# 585 +# 298 +# 273 +# 458 +# 660 +# 552 +# 936 +# 678 + +fail=0 + +printf "IIIIIII\n" > in || framework_failure_ +LC_ALL=tr_TR.utf8 grep -i .... in > out || fail=1 +compare out in || fail=1 + +# Also exercise the case in which the original string and the lower-case +# buffer have precisely the same length (22 bytes here), yet internal +# offsets do differ. Lengths are the same because while some bytes shrink +# when converted to lower case, others grow, and here they balance out. +i='I\304\260' +printf "$i$i$i$i$i$i$i\n" > in || framework_failure_ +LC_ALL=tr_TR.utf8 grep -i .... in > out || fail=1 +compare out in || fail=1 + +Exit $fail diff --git a/src/grep/tests/turkish-eyes b/src/grep/tests/turkish-eyes new file mode 100755 index 0000000..2969d09 --- /dev/null +++ b/src/grep/tests/turkish-eyes @@ -0,0 +1,58 @@ +#!/bin/sh +# Ensure that case-insensitive matching works with all Turkish i's + +# Copyright (C) 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_compiled_in_MB_support + +fail=0 + +L=tr_TR.UTF-8 + +# Check for a broken tr_TR.UTF-8 locale definition. +# In this locale, 'i' is not a lower-case 'I'. +echo I | LC_ALL=$L grep -i i > /dev/null \ + && skip_ "your $L locale appears to be broken" + +# Ensure that this matches: +# printf 'I:İ ı:i\n'|LC_ALL=tr_TR.utf8 grep -i 'ı:i I:İ' +I=$(printf '\304\260') # capital I with dot +i=$(printf '\304\261') # lowercase dotless i + + data="I:$I $i:i" +search_str="$i:i I:$I" +printf "$data\\n" > in || framework_failure_ + +for opt in -E -F -G; do + for pat in i I "$i" "$I" " " : "$search_str"; do + LC_ALL=$L grep $opt -i "$pat" in > out || fail=1 + compare in out || fail=1 + + case $pat in + i|"$I") printf "$I\\ni\\n";; + I|"$i") printf "I\\n$i\\n";; + :) printf ":\\n:\\n";; + ' ') printf " \\n";; + *) cat in;; + esac >exp || framework_failure_ + LC_ALL=$L grep -o $opt -i "$pat" in > out || fail=1 + compare exp out || fail=1 + done +done + +Exit $fail diff --git a/src/grep/tests/two-chars b/src/grep/tests/two-chars new file mode 100755 index 0000000..f866d6a --- /dev/null +++ b/src/grep/tests/two-chars @@ -0,0 +1,24 @@ +#! /bin/sh +# Check for grep -F with two patterns consisting of the same char. +# +# Copyright 2016-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +fail=0 + +for LOC in en_US.UTF-8 $zh $LOCALE_FR_UTF8; do + printf '0\n0\n' >pat + printf '0\n' >in + out=out-$LOC + LC_ALL=$LOC grep -Ff pat in >$out || fail=1 + compare in $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/two-files b/src/grep/tests/two-files new file mode 100755 index 0000000..0129a9d --- /dev/null +++ b/src/grep/tests/two-files @@ -0,0 +1,22 @@ +#! /bin/sh +# Read two files, of increasing size. +# With ASAN, this would have triggered a false-positive read of poisoned memory. +# +# Copyright 2015-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +fail=0 + +printf a > 1 || framework_failure_ +printf ab > 2 || framework_failure_ + +grep x 1 2 > out 2>&1 +test $? -eq 1 || fail=1 +compare /dev/null out || fail=1 + +Exit $fail diff --git a/src/grep/tests/unibyte-binary b/src/grep/tests/unibyte-binary new file mode 100755 index 0000000..f76276f --- /dev/null +++ b/src/grep/tests/unibyte-binary @@ -0,0 +1,32 @@ +#!/bin/sh +# Test binary files in unibyte locales with encoding errors + +# Copyright 2016-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_unibyte_locale + +fail=0 + +printf 'a\n\200\nb\n' >in || framework_failure_ +printf 'a\n' >exp || framework_failure_ +grep . in >out || fail=1 + +# In some unibyte locales, \200 is an encoding error; +# in others, it is a valid character. Allow either possibility. +compare exp out || compare in out || fail=1 + +Exit $fail diff --git a/src/grep/tests/unibyte-bracket-expr b/src/grep/tests/unibyte-bracket-expr new file mode 100755 index 0000000..4ee481f --- /dev/null +++ b/src/grep/tests/unibyte-bracket-expr @@ -0,0 +1,43 @@ +#!/bin/sh +# Exercise a DFA range bug that arises only with a unibyte encoding +# for which the wide-char-to-single-byte mapping is nontrivial. +# E.g., the regexp, [C] would fail to match C in a unibyte locale like +# ru_RU.KOI8-R for any C whose wide-char representation differed from +# its single-byte equivalent. + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_ru_RU_koi8_r +LC_ALL=ru_RU.KOI8-R +export LC_ALL + +fail=0 + +i=128 +while :; do + in=in-$i + octal=$(printf '%03o' $i) + b=$(printf "\\$octal") + echo "$b" > $in || framework_failure_ + grep "[$b]" $in > out || fail=1 + compare out $in || fail=1 + + test $i = 255 && break + i=$(expr $i + 1) +done + +Exit $fail diff --git a/src/grep/tests/unibyte-negated-circumflex b/src/grep/tests/unibyte-negated-circumflex new file mode 100755 index 0000000..47426be --- /dev/null +++ b/src/grep/tests/unibyte-negated-circumflex @@ -0,0 +1,27 @@ +#!/bin/sh +# Exercise a bug where [^^-^] was treated as if it were [^-^]. + +# Copyright 2014-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_unibyte_locale + +fail=0 + +echo a >in || framework_failure_ +grep '[^^-^]' in >out || fail=1 +compare out in || fail=1 +Exit $fail diff --git a/src/grep/tests/utf8-bracket b/src/grep/tests/utf8-bracket new file mode 100755 index 0000000..0d31ece --- /dev/null +++ b/src/grep/tests/utf8-bracket @@ -0,0 +1,40 @@ +#!/bin/sh +# Check bracket expressions in a UTF-8 locale. + +# Copyright 2015-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +require_en_utf8_locale_ + +printf '1\n2\n' >in || framework_failure_ + +fail=0 + +for locale in C en_US.UTF-8; do + for options in -qz -qzE; do + case $options in + *E*) parens='()';; + *) parens='\(\)';; + esac + for pattern in '1.2' '[12].2' '[1-2].2' '[1-2][^a][1-2]'; do + for suffix in '' "$parens\\1"; do + LC_ALL=$locale grep $options "$pattern$suffix" in || fail=1 + done + done + done +done + +Exit $fail diff --git a/src/grep/tests/warn-char-classes b/src/grep/tests/warn-char-classes new file mode 100755 index 0000000..b1db240 --- /dev/null +++ b/src/grep/tests/warn-char-classes @@ -0,0 +1,39 @@ +#!/bin/sh +# Use of any --include or --exclude* option would segfault in 2.6 and 2.6.1 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +echo f > x || framework_failure_ +echo b >> x || framework_failure_ +echo h >> x || framework_failure_ +printf 'grep: character class syntax is [[:space:]], not [:space:]\n' \ + > exp-err || framework_failure_ + +# basic cases + +returns_ 2 grep '[:space:]' x 2> err || fail=1 +sed 's/^\([A-Za-z]:\)\{0,1\}[^: ]*: /grep: /' err > err1 && mv err1 err +compare exp-err err || fail=1 + +returns_ 1 grep '[[:space:]]' x 2> err || fail=1 +test -s err && fail=1 + +# disabled by POSIXLY_CORRECT +returns_ 1 env POSIXLY_CORRECT=yes grep '[:space:]' x 2> err || fail=1 +test -s err && fail=1 + +# patterns that are considered valid +returns_ 1 grep '[::]' x 2> err || fail=1 +test -s err && fail=1 + +returns_ 1 grep '[:space]' x 2> err || fail=1 +test -s err && fail=1 + +returns_ 1 grep '[:space:wxyz]' x 2> err || fail=1 +test -s err && fail=1 + +returns_ 1 grep '[:space[:space:]:]' x 2> err || fail=1 +test -s err && fail=1 + +returns_ 1 grep '[:spac-e:]' x 2> err || fail=1 +test -s err && fail=1 +Exit $fail diff --git a/src/grep/tests/word-delim-multibyte b/src/grep/tests/word-delim-multibyte new file mode 100755 index 0000000..31190ad --- /dev/null +++ b/src/grep/tests/word-delim-multibyte @@ -0,0 +1,45 @@ +#!/bin/sh +# exercise \< and \> with multibyte data. +# Derived from https://savannah.gnu.org/bugs/?29537 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +e_acute=$(printf '\303\251') +echo "$e_acute" > in || framework_failure_ +LC_ALL=en_US.UTF-8 +export LC_ALL + +fail=0 + +grep "\\<$e_acute" in > out 2>err || fail=1 +compare out in || fail=1 +compare /dev/null err || fail=1 + +grep "$e_acute\\>" in > out 2>err || fail=1 +compare out in || fail=1 +compare /dev/null err || fail=1 + +grep -w "$e_acute" in > out 2>err || fail=1 +compare out in || fail=1 +compare /dev/null err || fail=1 + +# Also ensure that this works in both the C locale and that multibyte one. +# In the C locale, it failed due to a dfa.c regression in grep-3.2. +echo 123-x > in || framework_failure_ + +for locale in C en_US.UTF-8; do + LC_ALL=$locale grep '.\bx' in > out 2>err || fail=1 + compare out in || fail=1 + compare /dev/null err || fail=1 +done + +# Bug#43255 +printf 'a \303\255cone b\n' >in +for flag in '' -i; do + returns_ 1 env LC_ALL=en_US.UTF-8 grep -w $flag cone in >out 2>err || fail=1 + compare /dev/null out || fail=1 + compare /dev/null err || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/word-multi-file b/src/grep/tests/word-multi-file new file mode 100755 index 0000000..4b63520 --- /dev/null +++ b/src/grep/tests/word-multi-file @@ -0,0 +1,29 @@ +#!/bin/sh +# exercise the -w option on multiple files +# Derived from https://bugzilla.redhat.com/570500 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +mkdir a || framework_failure_ +( cd a \ + && echo aa bb cc > 1 \ + && echo bb dd ff > 2 \ + && echo ff gg hh > 3 \ + && echo bb xx zz > 4 \ +) || framework_failure_ + +cat << \EOF > exp1 || framework_failure_ +a/1:aa bb cc +a/2:bb dd ff +a/4:bb xx zz +EOF +sed s/..// exp1 > exp2 || framework_failure_ + +fail=0 +grep -rw bb a > out || fail=1 +sort < out > k; mv k out +compare exp1 out || fail=1 + +(cd a && grep -w bb [1-4]) > out || fail=1 +compare exp2 out || fail=1 + +Exit $fail diff --git a/src/grep/tests/word-multibyte b/src/grep/tests/word-multibyte new file mode 100755 index 0000000..9cbb71f --- /dev/null +++ b/src/grep/tests/word-multibyte @@ -0,0 +1,30 @@ +#!/bin/sh +# This would fail for grep-2.20 +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ + +e_acute=$(printf '\303\251') +printf "$e_acute\n" > in || framework_failure_ + +# Use this locale only if it is installed. +zh=zh_CN.UTF-8 +path_prepend_ . +case $(get-mb-cur-max $zh) in + [456]) ;; + *) zh=;; +esac + +fail=0 + +for LOC in en_US.UTF-8 $zh $LOCALE_FR_UTF8; do + out=out1-$LOC + LC_ALL=$LOC grep '\w' in >$out || fail=1 + compare in $out || fail=1 + + out=out2-$LOC + LC_ALL=$LOC grep '\W' in >$out && fail=1 + compare /dev/null $out || fail=1 +done + +Exit $fail diff --git a/src/grep/tests/write-error-msg b/src/grep/tests/write-error-msg new file mode 100755 index 0000000..f992df5 --- /dev/null +++ b/src/grep/tests/write-error-msg @@ -0,0 +1,55 @@ +#!/bin/sh +# Ensure that output errors are reported with errno information. + +# Copyright 2016-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +test -e /dev/full || skip_ your system lacks /dev/full + +export LC_ALL=C + +# generate large input, filling the libc stdio buffers +# and triggering a write(2) even without line buffering. +yes 12345 | head -n 50000 > in || framework_failure_ + +fail=0 + +# disk-full error, line buffered +# (note: GNU grep returns 2 on error) +returns_ 2 grep --line-buffered -v '^$' <in >/dev/full 2>err1 \ + || framework_failure_ + +# disk-full error, unbuffered +# (note: GNU grep returns 2 on error) +returns_ 2 grep -v '^$' <in >/dev/full 2>err2 \ + || framework_failure_ + +# ensure each error message file contains a 'write error' with additional text +for f in err1 err2 ; +do + grep -Eiq '^[^:]*: write error: [a-z]+' $f \ + || { + warn_ "incorrect/missing error message in file $f" + compare /dev/null $f # print the content in the logs + fail=1 + } +done + +# These messages should be identical +compare err1 err2 \ + || { warn_ "err1,err2 contain different error messages" ; fail=1 ; } + +Exit $fail diff --git a/src/grep/tests/yesno b/src/grep/tests/yesno new file mode 100755 index 0000000..be03d2c --- /dev/null +++ b/src/grep/tests/yesno @@ -0,0 +1,135 @@ +#! /bin/sh +# Test feature interaction of -C, -v, -o, and -m. +# +# Copyright (C) 2001, 2006, 2009-2021 Free Software Foundation, Inc. +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. +# +# This set of tests was started by Charles Levert. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +: ${VERBOSE=} # empty or "1" +failures=0 + +# Lines, including terminating LF, contain 10 octets. +# The words "yes" and "no" are at zero-based octet offsets of 5, 15, ... +yn='yesno.txt' +cat > "$yn" <<EOF +[A01 no ] +[B02 no ] +[C03 yes] +[D04 yes] +[E05 yes] +[F06 no ] +[G07 no ] +[H08 yes] +[I09 yes] +[J10 no ] +[K11 no ] +[L12 no ] +[M13 yes] +[N14 yes] +EOF +# Noticed the symmetry? + +# All possible output substrings (lines): +# selected whole, rejected whole, never-read whole, selected part, rejected part. + A='1:0:[A01 no ]/'; rA='1-0-[A01 no ]/'; XA='X[A01 no ]/'; + B='2:10:[B02 no ]/'; rB='2-10-[B02 no ]/'; XB='X[B02 no ]/'; + C='3:20:[C03 yes]/'; rC='3-20-[C03 yes]/'; XC='X[C03 yes]/'; c='3:25:yes/'; rc='3-25-yes/' + D='4:30:[D04 yes]/'; rD='4-30-[D04 yes]/'; XD='X[D04 yes]/'; d='4:35:yes/'; rd='4-35-yes/' + E='5:40:[E05 yes]/'; rE='5-40-[E05 yes]/'; XE='X[E05 yes]/'; e='5:45:yes/'; re='5-45-yes/' + F='6:50:[F06 no ]/'; rF='6-50-[F06 no ]/'; XF='X[F06 no ]/'; + G='7:60:[G07 no ]/'; rG='7-60-[G07 no ]/'; XG='X[G07 no ]/'; + H='8:70:[H08 yes]/'; rH='8-70-[H08 yes]/'; XH='X[H08 yes]/'; h='8:75:yes/'; rh='8-75-yes/' + I='9:80:[I09 yes]/'; rI='9-80-[I09 yes]/'; XI='X[I09 yes]/'; i='9:85:yes/'; ri='9-85-yes/' + J='10:90:[J10 no ]/'; rJ='10-90-[J10 no ]/'; XJ='X[J10 no ]/'; +K='11:100:[K11 no ]/'; rK='11-100-[K11 no ]/'; XK='X[K11 no ]/'; +L='12:110:[L12 no ]/'; rL='12-110-[L12 no ]/'; XL='X[L12 no ]/'; +M='13:120:[M13 yes]/'; rM='13-120-[M13 yes]/'; XM='X[M13 yes]/'; m='13:125:yes/'; rm='13-125-yes/' +N='14:130:[N14 yes]/'; rN='14-130-[N14 yes]/'; XN='X[N14 yes]/'; n='14:135:yes/'; rn='14-135-yes/' +# Group separators. +s='--/' +S='XYZ/' +# Exit statuses. +z0='?0/' +z1='?1/' +z2='?2/' + +# What needs fixing? Specification, documentation, implementation, or this? +# The individual tests. +set x \ + '' "$C$D$E$H$I$M$N$z0" \ + '-o' "$c$d$e$h$i$m$n$z0" \ + '-C,1' "$rB$C$D$E$rF$rG$H$I$rJ$s$rL$M$N$z0" \ + '-C,1,-o' "$c$d$e$h$i$s$m$n$z0" \ + '-C,1,-o,--group=XYZ' "$c$d$e$h$i$S$m$n$z0" \ + '-C,1,-o,--no-gr' "$c$d$e$h$i$m$n$z0" \ + '-C,4,-1' "$rB$C$D$E$rF$rG$H$I$rJ$s$rL$M$N$z0" \ + '-C,1,--group=XYZ' "$rB$C$D$E$rF$rG$H$I$rJ$S$rL$M$N$z0" \ + '-C,1,--no-gr' "$rB$C$D$E$rF$rG$H$I$rJ$rL$M$N$z0" \ + '-m,4' "$C$D$E$H$z0$XI$XJ$XK$XL$XM$XN" \ + '-m,4,-o' "$c$d$e$h$z0$XI$XJ$XK$XL$XM$XN" \ + '-m,4,-C,1' "$rB$C$D$E$rF$rG$H$rI$z0$XI$XJ$XK$XL$XM$XN" \ + '-m,4,-C,1,-o' "$c$d$e$h$z0$XI$XJ$XK$XL$XM$XN" \ + '-m,5' "$C$D$E$H$I$z0$XJ$XK$XL$XM$XN" \ + '-m,5,-o' "$c$d$e$h$i$z0$XJ$XK$XL$XM$XN" \ + '-m,5,-C,1,-o' "$c$d$e$h$i$z0$XJ$XK$XL$XM$XN" \ + '-m,6' "$C$D$E$H$I$M$z0$XN" \ + '-m,6,-o' "$c$d$e$h$i$m$z0$XN" \ + '-m,6,-C,1' "$rB$C$D$E$rF$rG$H$I$rJ$s$rL$M$rN$z0$XN" \ + '-m,6,-C,1,-o' "$c$d$e$h$i$s$m$z0$XN" \ + '-v' "$A$B$F$G$J$K$L$z0" \ + '-v,-o' "$z0" \ + '-v,-C,1' "$A$B$rC$s$rE$F$G$rH$rI$J$K$L$rM$z0" \ + '-v,-C,1,-o' "$rc$s$re$rh$ri$rm$z0" \ + '-v,-C,1,--group=XYZ' "$A$B$rC$S$rE$F$G$rH$rI$J$K$L$rM$z0" \ + '-v,-C,1,--no-gr' "$A$B$rC$rE$F$G$rH$rI$J$K$L$rM$z0" \ + '-4,-1' "$rB$C$D$E$rF$rG$H$I$rJ$s$rL$M$N$z0" \ + '-4,-v,-1' "$A$B$rC$s$rE$F$G$rH$rI$J$K$L$rM$z0" \ + '-m,1,-v' "$A$z0$XB$XC$XD$XE$XF$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,1,-v,-o' "$z0$XB$XC$XD$XE$XF$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,1,-v,-C,1' "$A$rB$z0$XB$XC$XD$XE$XF$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,1,-v,-C,1,-o' "$z0$XB$XC$XD$XE$XF$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,2,-v' "$A$B$z0$XC$XD$XE$XF$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,2,-v,-o' "$z0$XC$XD$XE$XF$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,3,-v' "$A$B$F$z0$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,3,-v,-o' "$z0$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,3,-v,-C,1' "$A$B$rC$s$rE$F$rG$z0$XG$XH$XI$XJ$XK$XL$XM$XN" \ + '-m,3,-v,-C,1,-o' "$rc$s$re$z0$XG$XH$XI$XJ$XK$XL$XM$XN" \ + x +shift +# Comment out cases that are known to fail. These should be uncommented after the 2.5.4 release. TAA. +# These should be added back in above and fixed in the code. TAA. +# '-m,5,-C,1' "$rB$C$D$E$rF$rG$H$I$z0$XJ$XK$XL$XM$XN" \ +# '-m,2,-v,-C,1' "$A$B$z0$XC$XD$XE$XF$XG$XH$XI$XJ$XK$XL$XM$XN" \ +# '-m,2,-v,-C,1,-o' "$z0$XC$XD$XE$XF$XG$XH$XI$XJ$XK$XL$XM$XN" \ + +# Test execution and reporting. +t=1 +while test xx != "x$1"; do + opts=$(echo "$1" | sed 's/,/ /g') + expect="$2" + shift 2 + + output=$({ grep -F -n -b $opts yes 2>/dev/null; echo "?$?"; sed 's!^!X!'; } < "$yn" | tr '\n' '/') + + if test "$output" != "$expect" || test "$VERBOSE" = "1"; then + echo " Test #$t: { grep -F -n -b $opts yes; echo \"?\$?\"; sed 's!^!X!'; }" + echo " output: \"$output\"" + fi + if test "$output" != "$expect"; then + echo " expect: \"$expect\"" + echo ' FAIL' + failures=1 + elif test "$VERBOSE" = "1"; then + echo ' PASS' + fi + + t=$(expr $t + 1) +done + +Exit $failures diff --git a/src/grep/tests/z-anchor-newline b/src/grep/tests/z-anchor-newline new file mode 100755 index 0000000..cacce66 --- /dev/null +++ b/src/grep/tests/z-anchor-newline @@ -0,0 +1,42 @@ +#!/bin/sh +# grep -z with an anchor in the regex could mistakenly match text +# including a newline. + +# Copyright 2016-2021 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +require_en_utf8_locale_ +require_compiled_in_MB_support +LC_ALL=en_US.UTF-8 + +printf 'a\nb\0' > in || framework_failure_ + +fail=0 + +# These three would all mistakenly match, because the [a-b] range +# forced the non-DFA (regexp-using) code path. +returns_ 1 grep -z '^[a-b]*$' in || fail=1 +returns_ 1 grep -z 'a[a-b]*$' in || fail=1 +returns_ 1 grep -z '^[a-b]*b' in || fail=1 + +# Test these for good measure; they exercise the DFA code path +# and always worked +returns_ 1 grep -z '^[ab]*$' in || fail=1 +returns_ 1 grep -z 'a[ab]*$' in || fail=1 +returns_ 1 grep -z '^[ab]*b' in || fail=1 + +Exit $fail |