#!/usr/bin/perl -w # Extract or update a section from a combined patch + documentation + # meta information file. use FileHandle; use Getopt::Long; use strict; my $select; my $update; if (!GetOptions("s|select=s" => \$select, "u|update=s" => \$update) || (!defined $select && !defined $update)) { print STDERR "USAGE: $0 {-s|-u} section file [< replacement]\n"; exit 1; } foreach my $arg (@ARGV) { my $fh; if ($arg =~ /\.gz$/) { $fh = new FileHandle("gzip -cd $arg |"); } elsif ($arg =~ /\.bz2$/) { $fh = new FileHandle("bzip2 -cd $arg |"); } else { $fh = new FileHandle("< $arg"); } unless ($fh) { print STDERR "$arg: $!\n"; next; } if (defined $select) { my $section = "head"; my $newline = ""; while (<$fh>) { if (/^%(.*)/) { last if $section eq $select; $section = $1; next; } if ($section eq $select) { print $newline; if ($_ eq "\n") { $newline = $_; } else { $newline=""; print; } } } } elsif (defined $update) { my $fh2; if ($arg =~ /\.gz$/) { $fh2 = new FileHandle("| gzip -c > $arg.parse"); } elsif ($arg =~ /\.bz2$/) { $fh2 = new FileHandle("| bzip2 -c > $arg.parse"); } else { $fh2 = new FileHandle("$arg.parse", O_CREAT|O_WRONLY); } unless ($fh2) { die "$arg.parse: $!\n"; } # Copy things before updated section while (<$fh>) { if (/^%(.*)/ && $1 eq $update) { last; } print $fh2 $_; } # Create/replace updated section print $fh2 "%$update\n"; while () { print $fh2 $_; } print $fh2 "\n"; # Skip obsolete section while (<$fh>) { if (/^%(.*)/) { print $fh2 $_; last; } } # Copy things after updated section while (<$fh>) { print $fh2 $_; } unless (close $fh2) { die "$arg.patch: $!\n"; } unlink "$arg~"; unless (rename $arg, "$arg~") { die "Failed to rename $arg to $arg~: $!\n"; } unless (rename "$arg.parse", $arg) { die "Failed to rename $arg.parse to $arg: $!\n"; } } close $fh; }