#
# Copyright (c) 1997-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 "Eclipse Public License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
#
# Initial Contributors:
# Nokia Corporation - initial contribution.
#
# Contributors:
#
# Description: 
#

# This package contains routines to find the static and dynamic dependencies of a binary.
package dep_lister;

use cdfparser;
use romutl;

require Exporter;
@ISA=qw(Exporter);
@EXPORT=qw(
	StaticDeps
);

use strict;

# This subroutine evaluates the static dependencies of an E32 executable and returns the list of
# binary names that this binary is dependent on (as found in its import table). If the input file
# is not a valid E32 executable, this routine returns an 'undef'.
sub StaticDeps()
{
	my ($file) = @_;
	my @statdeps;

    is_existinpath("elf2e32", Romutl::DIE_NOT_FOUND);
	open PIPE, "elf2e32 --dump i --e32input=$file 2>&1 | ";
	my $executable;
	my $ver;
	my $ext;
	my $binary;
	my $binaryInfoRef;
	my $fileName;

	if($file =~ /.*[\/\\](\S+)/)
	{
		$fileName = $1;
	}
	while(<PIPE>)
	{
		if($_ =~ /(\d+) imports from (.*)\{(.*)\}\[?(.*)\]?\.(.*)/i)
		{
			my $skipLines = $1;
			$executable = $2;
			$ver = $3;
			$ext = $5;

			$binary = $executable . "." . $ext;
			
			push @statdeps,$binary;

#			Each imported symbol's ordinal number is printed in these lines...
#			Skip them
			if($skipLines > 0)
			{
				while(<PIPE>)
				{
					$skipLines--;
					if($skipLines == 0 )
					{
						last;
					}
				}	
			}
		}
		elsif($_ =~ /elf2e32 : Error: .* is not a valid E32Image file/)
		{
#			not an e32 image...mark the file as a data file
			return undef;
		}
	}
	close PIPE;
	return (@statdeps);
}

1;
