Blob Blame History Raw
#! /usr/bin/perl -w
#
# genresscript - Generates empty resource scripts based on existing binaries.
#
# Copyright (C) 1998-2005 Oskar Liljeblad
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
#

use Getopt::Long;
use File::Basename;

# global stuff
$PROGRAM = 'genresscript';
$path_w32rtool = &path_or('wrestool','../wrestool/wrestool');

# initialize options
$arg_base = '';
$arg_help = $arg_version = 0;
$arg_type = 'group_icon';
$arg_sort = 0;

# parse options
exit 1 if (!GetOptions("t|type=s"      => \$arg_type,
                       "b|base=s"      => \$arg_base,
                       "help"          => \$arg_help,
                       "version"       => \$arg_version,
                       "s|sort"        => \$arg_sort));

# deal with standard options
if ($arg_help) {
	print "Usage: genresscript [OPTION]... [FILE]...\n";
	print "Generates empty resource scripts based on existing PE or NE binaries.\n";
	print "\n";
	print "  -t, --type=ID     list resources of this type instead of group_icon\n";
	print "  -b, --base=PATH   the default extraction name of all resources\n";
	print "  -s, --sort        sort alphabetically instead of using order in binary\n";
	print "\n";
  print "      --help        display this help and exit\n";
	print "      --version     output version information and exit\n";
	print "\n";
	print "The option --sort can be useful when making scripts from looking at image\n";
	print "directories (where images are sorted by filename).\n";
	print "\n";
	print 'Report bugs to <frank.richter@gmail.com>', "\n";
	exit;
}
if ($arg_version) {
	print "$PROGRAM (icoutils) 0.32.3\n";
	print "Written by Oskar Liljeblad.\n\n";
	print "Copyright (C) 1998-2005 Oskar Liljeblad.\n";
	print "This is free software; see the source for copying conditions.  There is NO\n";
	print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
	exit;
}

# got no arguments?
if ($#ARGV == -1) {
	print STDERR "$PROGRAM: missing file argument\n";
	print STDERR "Try `$PROGRAM --help' for more information.\n"
}

# process each non-option argument
my ($got_any) = 0;
for ($c = 0 ; $c <= $#ARGV ; $c++) {
	$got_any = 1 if (process_binary($ARGV[$c], ($c != 0 && $got_any)));
}

#
# Subroutines
#

sub process_binary {
	my ($file, $any_before) = @_;
	my ($cmd,$line,$is_first,@res);

	$cmd = "$path_w32rtool -l";
	$cmd .= " -t$arg_type" if (defined $arg_type && $arg_type ne '');
	$cmd .= " $file";

	if (!open (IN, "$cmd|")) {
		warn "$PROGRAM: execution of wrestool failed\n";
		return;
	}

	$is_first = 1;
	@res = ();
	while (defined ($line = <IN>)) {
		($type) = ($line =~ /\[type=([^ ]*)/);
		($name) = ($line =~ / --name=([^ ]*)/);
		($lang) = ($line =~ / --language=([^ ]*)/);

		$name =~ s/^`(.*)'$/$1/;
		$type =~ s/^`(.*)'$/$1/;
		$lang =~ s/^`(.*)'$/$1/ if defined $lang;

		if ($is_first) {
			print "\n" if ($any_before);
			print "file ", File::Basename::basename($file), "\n";
			$is_first = 0;
		}
		print "resource $type, $name: $arg_base\n" if (!$arg_sort);
		push @res, "resource $type, $name: $arg_base\n" if ($arg_sort);
	}

	print sort(@res) if ($arg_sort);

	return !$is_first;
}

sub path_or {
	my ($cmd,$def) = @_;

	my $real = `which $cmd`;
  return $def if !defined $real;
  chop $real;
  return $def if ($real eq '');

	return $real;
}