#!/usr/bin/perl
#
# subst - replace strings in one or more files using
#         perl regular expressions (~= s/// syntax).
#         Files will be edited inline (perl -i).
#
# Copyright (c) 2002 - Thomas Linden <tom@daemon.de>
#

use strict;
use Getopt::Long;
use Data::Dumper;
use vars qw($VERSION @r $usage $version $me);

$VERSION = "1.0.0";
$me = $0;
$me =~ s(^.*/)();


if (! GetOptions (
                  "regex|r=s" => \@r,
		  "help|h"  => \$usage,
		  "version|v" => \$version
		 ) ) {
  $usage = 1;
}

if ($version) {
  print STDERR "$me $VERSION\n";
  exit;
}
if ($usage || ! @r) {
  print "Usage: $me -r 's/regex/replacement/<flags>' [ -r '...', ...] <file> ...\n\n";
  print "substitution regex must be perlish. See 'perldoc perlre' for details!\n";
  print "Version: $VERSION. Copyright (c) 2002 - Thomas Linden <tom\@daemon.de>\n";
  exit;
}

# check regex's
local $_= "";
foreach my $regex (@r) {
  eval $regex;
  if ($@) {
    print STDERR "ERROR: regex \'$regex\' failed:\n       $@\n";
    exit;
  }
}

# actually, do the substitute
foreach my $file (@ARGV) {
  next if (-l $file);
  next if (! -e $file);
  my $tmpfile = &gettemp();
  system("cp" ,$file, $tmpfile) and die "Could not make copy of \'$file\': $!\n";
  open T, "<$tmpfile" or die "Could not read file \'$tmpfile\': $!\n";
  open F, ">$file" or die "Could not write file \'$file\': $!\n";
  select F;
  while (<T>) {
    foreach my $regex (@r) {
      eval $regex;
    }
    print;
  }
  close T;
  close F;
  unlink $tmpfile;
}


sub gettemp {
    my($random, @range);
    @range=('0'..'9','a'..'z','A'..'Z');
    srand(time||$$);
    for (0..10) {
      $random .= $range[rand(int($#range)+1)];
    }
    my $tempfile = "/tmp/.subst-" . $random;
    if (-e $tempfile) {
      # avoid race conditions!
      unlink $tempfile;
    }
    return $tempfile;
}

