1
0
Fork 0

Adding upstream version 1.15.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-05-28 19:30:33 +02:00
parent 69aa758e1b
commit f70e2a2220
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
24 changed files with 310 additions and 146 deletions

View file

@ -42,6 +42,7 @@
namespace {
#include "exclude.cc"
#include "recursive.cc"
#include "zcatgrep.cc"
@ -77,6 +78,7 @@ void show_help()
" --color[=<when>] show matched strings in color\n"
" -e, --regexp=<pattern> use <pattern> as the pattern to match\n"
" -E, --extended-regexp <pattern> is an extended regular expression\n"
" --exclude=<pattern> exclude files matching a shell pattern\n"
" -f, --file=<file> obtain patterns from <file>\n"
" -F, --fixed-strings <pattern> is a set of newline-separated strings\n"
" -G, --basic-regexp <pattern> is a basic regular expression (default)\n"
@ -186,7 +188,7 @@ int zgrep_file( int infd, const int format_index,
{ line_begin = true; if( line_buffered ) std::fflush( stdout ); }
}
else if( std::fwrite( buffer, 1, size, stdout ) != (unsigned)size )
{ std::fflush( stdout ); show_error( "Write error", errno ); return 2; }
{ std::fflush( stdout ); show_stdout_error( errno ); return 2; }
}
}
std::fflush( stdout );
@ -202,6 +204,8 @@ int zgrep_file( int infd, const int format_index,
{ show_close_error(); return 2; }
if( close( fda[0] ) != 0 )
{ show_close_error( GREP ); return 2; }
if( retval == 0 && std::ferror( stdout ) )
{ show_stdout_error(); retval = 2; }
return retval;
}
@ -210,8 +214,6 @@ int zgrep_file( int infd, const int format_index,
int main( const int argc, const char * const argv[] )
{
enum { help_opt = 256, verbose_opt, color_opt, label_opt, linebuf_opt,
bz2_opt, gz_opt, lz_opt, xz_opt, zst_opt };
int format_index = -1; // undefined
int list_mode = 0; // 1 = list matches, -1 = list non-matches
int recursive = 0; // 1 = '-r', 2 = '-R'
@ -228,6 +230,8 @@ int main( const int argc, const char * const argv[] )
program_name = "zgrep";
invocation_name = ( argc > 0 ) ? argv[0] : program_name;
enum { opt_bz2 = 256, opt_color, opt_exc, opt_gz, opt_help, opt_label,
opt_linebuf, opt_lz, opt_verbose, opt_xz, opt_zst };
const Arg_parser::Option options[] =
{
{ 'a', "text", Arg_parser::no }, // grep GNU
@ -238,7 +242,7 @@ int main( const int argc, const char * const argv[] )
{ 'C', "context", Arg_parser::yes }, // grep GNU
{ 'e', "regexp", Arg_parser::yes }, // grep
{ 'E', "extended-regexp", Arg_parser::no }, // grep
{ 'f', "file ", Arg_parser::yes }, // grep
{ 'f', "file", Arg_parser::yes }, // grep
{ 'F', "fixed-strings", Arg_parser::no }, // grep
{ 'G', "basic-regexp", Arg_parser::no }, // grep GNU
{ 'h', "no-filename", Arg_parser::no }, // grep GNU
@ -266,16 +270,17 @@ int main( const int argc, const char * const argv[] )
{ 'w', "word-regexp", Arg_parser::no }, // grep GNU
{ 'x', "line-regexp", Arg_parser::no }, // grep
{ 'Z', "null", Arg_parser::no }, // grep GNU
{ help_opt, "help", Arg_parser::no },
{ verbose_opt, "verbose", Arg_parser::no },
{ color_opt, "color", Arg_parser::maybe },
{ label_opt, "label", Arg_parser::yes },
{ linebuf_opt, "line-buffered", Arg_parser::no },
{ bz2_opt, "bz2", Arg_parser::yes },
{ gz_opt, "gz", Arg_parser::yes },
{ lz_opt, "lz", Arg_parser::yes },
{ xz_opt, "xz", Arg_parser::yes },
{ zst_opt, "zst", Arg_parser::yes },
{ opt_color, "color", Arg_parser::maybe },
{ opt_exc, "exclude", Arg_parser::yes },
{ opt_help, "help", Arg_parser::no },
{ opt_label, "label", Arg_parser::yes },
{ opt_linebuf, "line-buffered", Arg_parser::no },
{ opt_verbose, "verbose", Arg_parser::no },
{ opt_bz2, "bz2", Arg_parser::yes },
{ opt_gz, "gz", Arg_parser::yes },
{ opt_lz, "lz", Arg_parser::yes },
{ opt_xz, "xz", Arg_parser::yes },
{ opt_zst, "zst", Arg_parser::yes },
{ 0, 0, Arg_parser::no } };
const Arg_parser parser( argc, argv, options );
@ -332,21 +337,22 @@ int main( const int argc, const char * const argv[] )
case 'w': grep_args.push_back( "-w" ); break;
case 'x': grep_args.push_back( "-x" ); break;
case 'Z': z_null = true; break;
case help_opt: show_help(); return 0;
case verbose_opt: no_messages = false; if( verbosity < 4 ) ++verbosity;
case opt_help: show_help(); return 0;
case opt_exc: Exclude::add_pattern( sarg ); break;
case opt_verbose: no_messages = false; if( verbosity < 4 ) ++verbosity;
break;
case color_opt: color_option = "--color";
case opt_color: color_option = "--color";
if( !sarg.empty() ) { color_option += '='; color_option += sarg; }
break;
case label_opt: label_option = "--label="; label_option += sarg;
case opt_label: label_option = "--label="; label_option += sarg;
label = arg; break;
case linebuf_opt: grep_args.push_back( "--line-buffered" );
case opt_linebuf: grep_args.push_back( "--line-buffered" );
line_buffered = true; break;
case bz2_opt: parse_compressor( sarg, pn, fmt_bz2 ); break;
case gz_opt: parse_compressor( sarg, pn, fmt_gz ); break;
case lz_opt: parse_compressor( sarg, pn, fmt_lz ); break;
case xz_opt: parse_compressor( sarg, pn, fmt_xz ); break;
case zst_opt: parse_compressor( sarg, pn, fmt_zst ); break;
case opt_bz2: parse_compressor( sarg, pn, fmt_bz2 ); break;
case opt_gz: parse_compressor( sarg, pn, fmt_gz ); break;
case opt_lz: parse_compressor( sarg, pn, fmt_lz ); break;
case opt_xz: parse_compressor( sarg, pn, fmt_xz ); break;
case opt_zst: parse_compressor( sarg, pn, fmt_zst ); break;
default: internal_error( "uncaught option." );
}
} // end process options
@ -404,14 +410,12 @@ int main( const int argc, const char * const argv[] )
if( close( infd ) != 0 )
{ show_file_error( input_filename.c_str(), "Error closing input file",
errno ); error = true; }
if( retval == 0 && verbosity < 0 ) break;
if( ( retval == 0 && verbosity < 0 ) || // match
( retval == 2 && verbosity >= 0 ) ) break; // error
}
if( std::fclose( stdout ) != 0 )
{
show_error( "Error closing stdout", errno );
error = true;
}
if( std::fclose( stdout ) != 0 && !error )
{ show_error( "Error closing stdout", errno ); error = true; }
if( error && ( retval != 0 || verbosity >= 0 ) ) retval = 2;
return retval;
}