#!/usr/bin/env perl
use strict;
$^W=1;
# pst-geo-uncompress.pl
# Copyright (C) 2009 Heiko Oberdiek.
#
# This work may be distributed and/or modified under the
# conditions of the LaTeX Project Public License, either version 1.3
# of this license or (at your option) any later version.
# The latest version of this license is in
# http://www.latex-project.org/lppl.txt
# and version 1.3 or later is part of all distributions of LaTeX
# version 2005/12/01 or later.
#
# This work has the LPPL maintenance status `maintained'.
#
# The Current Maintainer of this work is Heiko Oberdiek.
#
# See file "README" for a list of files that belong to this project.
my $file = "pst-geo-uncompress.pl";
my $program = uc($&) if $file =~ /^\w+/;
my $version = "1.0";
my $date = "2009/07/30";
my $author = "Heiko Oberdiek";
my $copyright = "Copyright (c) 2009 by $author.";
# History:
# 2009/07/30 v1.0: First release.
my $title = "$program $version, $date - $copyright\n";
print STDERR $title;
my $prg_gs = "gs";
$prg_gs = "gs386" if $^O =~ /dos/i;
$prg_gs = "gsos2" if $^O =~ /os2/i;
$prg_gs = "gswin32c" if $^O =~ /mswin32/i;
$prg_gs = "gswin32c" if $^O =~ /cygwin/i;
$prg_gs = "mgs" if defined($ENV{"TEXSYSTEM"}) and
$ENV{"TEXSYSTEM"} =~ /miktex/i;
$::opt_help = 0;
my $usage = <<"END_OF_USAGE";
Function: Compresses data files for pst-geo
Syntax: $0 [output file]
If the output file is not given, standard output is used.
Options: (defaults:)
--help print usage
--gscmd call of ghostscript ($prg_gs)
END_OF_USAGE
use Getopt::Long;
GetOptions(
"help!",
"gscmd=s" => \$prg_gs
) or die $usage;
!$::opt_help or die $usage;
(@ARGV == 1 or @ARGV == 2) or die $usage;
my $input = $ARGV[0];
my $output = $ARGV[1];
open(IN, '<', $input) or die "!!! Error: Cannot open file `$input'!\n";
my $header = . ;
$header =~ /^%!PS\s+(.*)currentfile((<<[^>]+>>)?\/[\w\d]+ filter) cvx exec\s*$/s
or die "!!! Error: Unknown file format of `$input'!\n";
my $decode = $2;
my $pos = tell(IN);
my $ps_input = unpack 'H*', $input;
my $ps_output = '';
my $ps_output = unpack 'H*', $output if $output;
my $ps_code = <<"END_PS_CODE";
%!PS
/buf 10000 string def
<$ps_input> (r) file
dup $pos setfileposition
$decode
END_PS_CODE
$ps_code .= <<"END_PS_CODE" if $output;
<$ps_output> (w) file
exch
END_PS_CODE
$ps_code .= <<"END_PS_CODE";
{ dup buf readstring exch
END_PS_CODE
$ps_code .= <<"END_PS_CODE" unless $output;
print
END_PS_CODE
$ps_code .= <<"END_PS_CODE" if $output;
3 index exch writestring
END_PS_CODE
$ps_code .= <<"END_PS_CODE";
not {exit} if
} loop
closefile
END_PS_CODE
$ps_code .= <<"END_PS_CODE" if $output;
closefile
END_PS_CODE
$ps_code .= <<"END_PS_CODE";
quit
%%EOF
END_PS_CODE
my @cmd = (
$prg_gs,
'-q',
'-sDEVICE=nullpage',
'-dBATCH',
'-c',
$ps_code
);
system @cmd;
if ($? & 127) {
die sprintf "!!! Error: Ghostscript died with signal %d!\n",
($? & 127);
}
elsif ($? != 0) {
die sprintf "!!! Error: Ghostscript exited with error code %d!\n",
$? >> 8;
}
print STDERR "* `$output' written.\n" if $output;
__END__