imgtools/imaker/buildrom_plugins/obyparse.pm
changeset 2 39c28ec933dd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/obyparse.pm	Mon May 10 19:54:49 2010 +0100
@@ -0,0 +1,191 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Symbian Foundation License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Split core image components to ROM/ROFS1.
+# Make UREL <-> UDEB conversions.
+#
+
+
+
+package obyparse;
+
+use strict;
+use warnings;
+use plugincommon;
+
+BEGIN
+{
+    use Exporter();
+    our($VERSION, @ISA, @EXPORT);
+    $VERSION = 1.00;
+    @ISA     = qw(Exporter);
+    @EXPORT  = qw(&obyparse_info &obyparse_init &obyparse_process);
+}
+
+my $conf = "";
+
+sub obyparse_info()
+{
+    return({
+        name       => "obyparse",
+        invocation => "InvocationPoint2",
+        initialize => "obyparse::obyparse_init",
+        single     => "obyparse::obyparse_process"});
+}
+
+sub obyparse_init($)
+{
+    plugin_init("obyparse.pm", $conf = shift());
+}
+
+sub obyparse_readconffile($$$$$);
+
+
+sub obyparse_process($)
+{
+    plugin_start("obyparse.pm", $conf);
+
+    my $obydata = shift();
+    my %targets = ();
+    my %patchdata = ();
+    my ($romfiles, $rofs1files, $udebfiles, $urelfiles) = (undef, undef, "", "");
+    my $fname = "";
+
+    foreach (@$obydata)
+    {
+        next if (my $parse = parse_obyline($_)) < 0;
+
+        if (($parse == 1) && ($gKeyword =~ FILEBITMAPSPECKEYWORD)) {
+            ($fname = lc($gTarget)) =~ /^(?:.*\\)?(.+?)$/;
+            my $tname = $1;
+            $targets{$fname} = $targets{$tname} = [$gLnum - 1, !$gRomid && ($gKeyword =~ ROFSBITMAPFILESPECKEYWORD)];
+            next;
+        }
+
+        next if !/^\s*OBYPARSE_(ROM|ROFS1|UDEB|UREL)\s+(.+?)\s*$/i;
+
+        (my $rule, $fname) = (uc($1), $2);
+        my $files = ($rule eq "ROM" ? \$romfiles : ($rule eq "ROFS1" ? \$rofs1files :
+            ($rule eq "UDEB" ? \$udebfiles : \$urelfiles)));
+        $$files = "" if !defined($$files);
+        dprint(2, "#$gLnum: `$gLine'");
+
+        if ($fname ne "*") {
+            my $basedir = "";
+            ($basedir, $fname) = ($1, $2) if $fname =~ /^(.*[\/\\])(.+?)$/;
+            dprint(3, "Found " . obyparse_readconffile($basedir, $fname, $rule, $files, 0) . " entries");
+        }
+        else {
+            $$files = ".*";
+            dprint(3, "Move/change all possible components to $rule");
+        }
+        $_ = "$gHandlestr $_";
+    }
+
+    $romfiles   = qr/^($romfiles)$/i   if defined($romfiles);
+    $rofs1files = qr/^($rofs1files)$/i if defined($rofs1files);
+    ($udebfiles, $urelfiles) = (qr/^($udebfiles)$/i, qr/^($urelfiles)$/i);
+
+    ($gLnum, $gRomid) = (0, 0);
+    my ($rofs1cnt, $udebcnt, $urelcnt, $offset, @torofs1) = (0, 0, 0, 0, ());
+
+    foreach (@$obydata)
+    {
+        my $parse = parse_obyline($_);
+        $offset++ if $gRomid < 2;
+        next if $parse != 1;
+
+        if ($gKeyword =~ /^patchdata$/i) {
+            $gSource =~ /^(.+?)(?:@.+)?$/;
+            $fname = lc($1);
+            $patchdata{$fname} = $targets{$fname}[0] if !exists($patchdata{$fname});
+        }
+        else {
+            $gTarget =~ /^(?:.*\\)?(.+?)$/;
+            $fname = $1;
+            if ($fname =~ $urelfiles && s/(?<=[\/\\])udeb(?=[\/\\])/urel/i) {
+                $urelcnt++;
+                dprint(2, "Changed to UREL: `$_'");
+            }
+            elsif ($fname =~ $udebfiles && s/(?<=[\/\\])urel(?=[\/\\])/udeb/i) {
+                $udebcnt++;
+                dprint(2, "Changed to UDEB: `$_'");
+            }
+        }
+
+        next if $gRomid || !defined($romfiles) && !defined($rofs1files);
+
+        if (($gKeyword =~ ROFSBITMAPFILESPECKEYWORD) ||
+            ($gKeyword =~ /^patchdata$/i) && exists($targets{$fname}) && $targets{$fname}[1]) {
+        }
+        elsif ($gKeyword =~ /^(?:alias|rename)/i && exists($targets{lc($gSource)}) && $targets{lc($gSource)}[1]) {
+            $gSource =~ /^(?:.*\\)?(.+?)$/;
+            $fname = $1;
+        }
+        else {
+            next;
+        }
+        if (defined($rofs1files) && ($fname =~ $rofs1files) || defined($romfiles) && ($fname !~ $romfiles)) {
+            $rofs1cnt++;
+            push(@torofs1, $_);
+            $_ = "$gHandlestr =>ROFS1 $_";
+        }
+    }
+
+    dprint(3, "Moved $rofs1cnt entries to ROFS1")    if $rofs1cnt;
+    dprint(3, "Changed $udebcnt components to UDEB") if $udebcnt;
+    dprint(3, "Changed $urelcnt components to UREL") if $urelcnt;
+
+    dprint(2, "Found " . keys(%patchdata) . " ROM-patched components:") if %patchdata;
+    foreach (sort({$a <=> $b} values(%patchdata))) {
+        ${$obydata}[$_] =~ /^(?:$gHandlestr =>ROFS1 )?(.+)$/;
+        parse_keyline($1);
+        dprint(2, "`$gSource'");
+    }
+
+    splice(@$obydata, $offset, 0, @torofs1) if @torofs1;
+
+    plugin_end();
+}
+
+
+sub obyparse_readconffile($$$$$)
+{
+    my ($basedir, $file, $type, $files, $indent) = @_;
+    $file = $basedir . $file;
+    my $filecnt = 0;
+
+    dprint(3, "Reading $type files") if $type;
+    dprint(3, ("." x $indent) . "`$file'");
+
+    open(FILE, $file) or die("ERROR: Can't open `$file'\n");
+
+    foreach my $line (<FILE>) {
+        if ($line =~ /^\s*#include\s+(.+?)\s*$/i) {
+            $filecnt += obyparse_readconffile($basedir, $1, "", $files, $indent + 2);
+            next;
+        }
+        next if ($line =~ /^\s*$/) || ($line =~ /^\s*(?:#|\/\/|REM\s)/i);
+        $filecnt++;
+        (my $fname = $line) =~ s/^\s+|\s+$//g;
+        $fname =~ s/(.)/{'*' => '.*', '?' => '.', '[' => '[', ']' => ']'}->{$1} || "\Q$1\E"/ge;
+        $$files .= ($$files eq "" ? "" : "|") . $fname;
+    }
+    close(FILE);
+    return($filecnt);
+}
+
+1;
+
+__END__ # OF OBYPARSE.PM