184 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/perl
 | |
| 
 | |
| #
 | |
| #//===----------------------------------------------------------------------===//
 | |
| #//
 | |
| #//                     The LLVM Compiler Infrastructure
 | |
| #//
 | |
| #// This file is dual licensed under the MIT and the University of Illinois Open
 | |
| #// Source Licenses. See LICENSE.txt for details.
 | |
| #//
 | |
| #//===----------------------------------------------------------------------===//
 | |
| #
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| use File::Glob ":glob";
 | |
| 
 | |
| use FindBin;
 | |
| use lib "$FindBin::Bin/lib";
 | |
| 
 | |
| use tools;
 | |
| 
 | |
| our $VERSION = "0.02";
 | |
| 
 | |
| sub wipe($$$) {
 | |
| 
 | |
|     my ( $input, $output, $wipe ) = @_;
 | |
|     my $bulk = read_file( $input, -binary => 1 );
 | |
|     $bulk =~ s{($wipe)}{ " " x length( $1 ) }ge;
 | |
|     write_file( $output, \$bulk, -binary => 1 );
 | |
|     return undef;
 | |
| 
 | |
| }; # sub wipe
 | |
| 
 | |
| my @wipe;
 | |
| my $target = ".";
 | |
| get_options(
 | |
|     "wipe-literal=s"     =>
 | |
|         sub { my $arg = $_[ 1 ]; push( @wipe, qr{@{ [ quotemeta( $arg ) ] }} ); },
 | |
|     "wipe-regexp=s"      =>
 | |
|         sub { my $arg = $_[ 1 ]; push( @wipe, qr{$arg} ); },
 | |
|     "target-directory=s" => \$target,
 | |
| );
 | |
| 
 | |
| # Convert strings to regular expression.
 | |
| my $wipe = qr{@{ [ join( "|", @wipe ) ] }};
 | |
| 
 | |
| my %jobs;
 | |
| 
 | |
| # Collect files to process.
 | |
| # jobs: output -> input.
 | |
| foreach my $arg ( @ARGV ) {
 | |
|     my @inputs = ( $^O eq "MSWin32" ? bsd_glob( $arg ) : ( $arg ) );
 | |
|     foreach my $input ( @inputs ) {
 | |
|         my $file   = get_file( $input );
 | |
|         my $output = cat_file( $target, $file );
 | |
|         if ( exists( $jobs{ $output } ) ) {
 | |
|             runtime_error(
 | |
|                 "\"$jobs{ $output }\" and \"$input\" input files tend to be written " .
 | |
|                     "to the same output file \"$output\""
 | |
|             );
 | |
|         }; # if
 | |
|         $jobs{ $output } = $input;
 | |
|     }; # foreach
 | |
| }; # foreach $file
 | |
| 
 | |
| # Process files.
 | |
| %jobs = reverse( %jobs ); # jobs: input -> output.
 | |
| foreach my $input ( sort( keys( %jobs ) ) ) {
 | |
|     my $output = $jobs{ $input };
 | |
|     info( "\"$input\" -> \"$output\"" );
 | |
|     wipe( $input, $output, $wipe );
 | |
| }; # foreach $input
 | |
| 
 | |
| exit( 0 );
 | |
| 
 | |
| __END__
 | |
| 
 | |
| #
 | |
| # Embedded documentation.
 | |
| #
 | |
| 
 | |
| =pod
 | |
| 
 | |
| =head1 NAME
 | |
| 
 | |
| B<wipe-string.pl> -- Wipe string in text or binary files.
 | |
| 
 | |
| =head1 SYNOPSIS
 | |
| 
 | |
| B<wipe-string.pl> I<OPTION>... I<FILE>...
 | |
| 
 | |
| =head1 OPTIONS
 | |
| 
 | |
| =over
 | |
| 
 | |
| =item B<--doc>
 | |
| 
 | |
| =item B<--manual>
 | |
| 
 | |
| Print full help message and exit.
 | |
| 
 | |
| =item B<--help>
 | |
| 
 | |
| Print short help message and exit.
 | |
| 
 | |
| =item B<--target-directory=>I<dir>
 | |
| 
 | |
| Directory to put result files to. By default result files are written in the current working
 | |
| directory.
 | |
| 
 | |
| =item B<--usage>
 | |
| 
 | |
| Print very short usage message and exit.
 | |
| 
 | |
| =item B<--version>
 | |
| 
 | |
| Print version and exit.
 | |
| 
 | |
| =item B<--wipe-literal=>I<str>
 | |
| 
 | |
| Specify literal string to wipe. Multiple literals are allowed.
 | |
| 
 | |
| =item B<--wipe-regexp=>I<str>
 | |
| 
 | |
| Specify Perl regular expression to wipe. Multiple regular expressions may be specified.
 | |
| 
 | |
| Be careful. Protect special characters from beign interpreted by shell.
 | |
| 
 | |
| =back
 | |
| 
 | |
| =head1 ARGUMENTS
 | |
| 
 | |
| =over
 | |
| 
 | |
| =item I<file>
 | |
| 
 | |
| File name to wipe string in.
 | |
| 
 | |
| =back
 | |
| 
 | |
| =head1 DESCRIPTION
 | |
| 
 | |
| The script wipes strings in files. String may be specified literally or by Perl regular expression.
 | |
| Strings are wiped by replacing characters with spaces, so size of file remains the same. The script
 | |
| may be applied to both text and binary files.
 | |
| 
 | |
| Result files are written by default to current directory, or to directory specified by
 | |
| B<--target-directory> option, if any. If multiple input files tend to be written to the same output
 | |
| file (e. g. identically named input files located in different directories), the script generates an
 | |
| error.
 | |
| 
 | |
| The script reads entire file, process it, and the writes to disk. Therefore it is (almost) safe to
 | |
| update files in-place (see examples).
 | |
| 
 | |
| =head1 EXAMPLES
 | |
| 
 | |
| Wipe "Copyright" word in all the files with "txt" suffix in current directory, overwrite original
 | |
| files (update them in-place):
 | |
| 
 | |
|     wipe-string.pl --wipe-literal="Copyright" *.txt
 | |
| 
 | |
| Wipe "Copyright" and "Copyleft" words in all the files with "txt" suffix in current directory,
 | |
| write result files to ../wiped directory:
 | |
| 
 | |
|     wipe-string.pl --wipe-literal=Copyright --wipe-literal=Copyleft --target-dir=../wiped *.txt
 | |
| 
 | |
| Wipe "Copyright" and "Copyleft" words in files from "doc" directory, write result files to current
 | |
| directory;
 | |
| 
 | |
|     wipe-string.pl --wipe-regexp="Copyright|Copyleft" doc/*
 | |
| 
 | |
| Wipe "defaultlib" directive in all the library files:
 | |
| 
 | |
|     wipe-string.pl --wipe-regexp="-defaultlib:[A-Za-z0-9_.]+" *.lib
 | |
| 
 | |
| (Be careful: the script does not analyze structure of library and object files, it just wipes
 | |
| U<strings>, so it wipes all the occurrences of strings matching to specified regular expression.)
 | |
| 
 | |
| =cut
 | |
| 
 | |
| # end of file #
 |