111 lines
2.4 KiB
Perl
111 lines
2.4 KiB
Perl
|
#!/usr/bin/env perl
|
||
|
############################################################################
|
||
|
# __________ __ ___.
|
||
|
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||
|
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||
|
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||
|
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||
|
# \/ \/ \/ \/ \/
|
||
|
# $Id$
|
||
|
#
|
||
|
# Copyright (C) 2005 by Jens Arnold
|
||
|
#
|
||
|
# All files in this archive are subject to the GNU General Public License.
|
||
|
# See the file COPYING in the source tree root for full license agreement.
|
||
|
#
|
||
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||
|
# KIND, either express or implied.
|
||
|
#
|
||
|
############################################################################
|
||
|
|
||
|
if (!$ARGV[0])
|
||
|
{
|
||
|
print <<HERE
|
||
|
Usage: ucl2src [-p=<prefix>] <ucl file>
|
||
|
|
||
|
Check & strip header from an .ucl file and generate <prefix>.c and
|
||
|
<prefix>.h from it.
|
||
|
HERE
|
||
|
;
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
my $prefix = $p;
|
||
|
if(!$prefix) {
|
||
|
$prefix="uclimage";
|
||
|
}
|
||
|
|
||
|
my $input = $ARGV[0];
|
||
|
my $buffer;
|
||
|
my $insize;
|
||
|
my $readsize = 0;
|
||
|
|
||
|
open(INF, "<$input") or die "Can't open $input";
|
||
|
binmode INF;
|
||
|
|
||
|
# check UCL header
|
||
|
|
||
|
# magic header
|
||
|
read(INF, $buffer, 8);
|
||
|
if ($buffer ne pack("C8", 0x00, 0xe9, 0x55, 0x43, 0x4c, 0xff, 0x01, 0x1a))
|
||
|
{
|
||
|
die "Not an UCL file.";
|
||
|
}
|
||
|
read(INF, $buffer, 4);
|
||
|
|
||
|
# method
|
||
|
read(INF, $buffer, 1);
|
||
|
if (ord($buffer) != 0x2E)
|
||
|
{
|
||
|
die sprintf("Wrong compression method (expected 0x2E, found 0x%02X)",
|
||
|
ord($buffer));
|
||
|
}
|
||
|
|
||
|
read(INF, $buffer, 9);
|
||
|
|
||
|
# file size
|
||
|
read(INF, $buffer, 4);
|
||
|
$insize = unpack("N", $buffer) + 8;
|
||
|
|
||
|
open(OUTF, ">$prefix.c") or die "Can't open $prefix.c";
|
||
|
|
||
|
print OUTF <<HERE
|
||
|
/* This file was automatically generated using ucl2src.pl */
|
||
|
|
||
|
/* Data compressed with UCL method 0x2e follows */
|
||
|
const unsigned char image[] = {
|
||
|
HERE
|
||
|
;
|
||
|
|
||
|
while (read(INF, $buffer, 1))
|
||
|
{
|
||
|
$readsize++;
|
||
|
printf OUTF ("0x%02x,", ord($buffer));
|
||
|
if (!($readsize % 16))
|
||
|
{
|
||
|
print OUTF "\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
close(INF);
|
||
|
|
||
|
if ($readsize != $insize)
|
||
|
{
|
||
|
die "Input file truncated, got $readsize of $insize bytes."
|
||
|
}
|
||
|
|
||
|
print OUTF <<HERE
|
||
|
};
|
||
|
/* end of compressed image */
|
||
|
HERE
|
||
|
;
|
||
|
close(OUTF);
|
||
|
|
||
|
open(OUTF, ">$prefix.h") or die "Can't open $prefix.h";
|
||
|
|
||
|
print OUTF "/* This file was automatically generated using ucl2src.pl */\n";
|
||
|
print OUTF "extern const unsigned char image[".$insize."];\n";
|
||
|
|
||
|
close(OUTF);
|
||
|
|