[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6

MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF  modem version: NA

Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/tools/objListHelper.pm b/mcu/tools/objListHelper.pm
new file mode 100644
index 0000000..1df4745
--- /dev/null
+++ b/mcu/tools/objListHelper.pm
@@ -0,0 +1,746 @@
+#!/usr/bin/perl

+#

+#  Copyright Statement:

+#  --------------------

+#  This software is protected by Copyright and the information contained

+#  herein is confidential. The software may not be copied and the information

+#  contained herein may not be used or disclosed except with the written

+#  permission of MediaTek Inc. (C) 2005

+#

+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES

+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")

+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON

+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,

+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF

+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.

+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE

+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR

+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH

+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO

+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S

+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.

+#

+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE

+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,

+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,

+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO

+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.

+#

+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE

+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF

+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND

+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER

+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).

+#

+#

+#*****************************************************************************

+#*

+#* Filename:

+#* ---------

+#*   objListGen.pm

+#*

+#* Project:

+#* --------

+#*   Maui_Software

+#*

+#* Description:

+#* ------------

+#*   This file help to handle the object list common operations.

+#*

+#*

+#* Author:

+#* -------

+#*   Ke-Ting Chen (mtk03141)

+#*

+#*****************************************************************************

+package objListHelper;

+#****************************************************************************

+# Included Modules

+#****************************************************************************

+use strict;

+use warnings;

+BEGIN { push @INC, './pcore/tools/' }  # add additional library path

+use sysGenUtility;

+use FileInfoParser;

+use tools::pack_dep_gen;

+

+#****************************************************************************

+# History

+#****************************************************************************

+my $OBJ_LIST_HELPER_VERNO = " v1.03";

+   # v1.03: Move feature option evaluation functions to FileInfoParser.pm

+   # v1.02: Add checking check-in pattern function

+   # v1.01: Correct the compare object name algorithm

+   # v1.00: Phase in object list generate mechanism

+

+#****************************************************************************

+# Constants

+#****************************************************************************

+

+#****************************************************************************

+# Variables

+#****************************************************************************

+

+#****************************************************************************

+# subroutine:  InputObjectListFromObjListFile

+# description: Get the object list from the specified object list file.

+# input:       Input filename, object list ref

+# output:      Object list

+# need init:   No

+#****************************************************************************

+sub InputObjectListFromObjListFile

+{

+   my $filename = shift;

+   my $objectListRef = shift;

+   my $category = $filename;

+

+   &ErrorHandler("Undefined object list reference!", __FILE__, __LINE__) unless (defined $objectListRef);

+

+   open my $input, "<$filename" or

+      &ErrorHandler("Cannot open file $filename $!", __FILE__, __LINE__);

+

+   while (<$input>)

+   {

+      chomp;

+

+      if (/^\s*; =+ (.+) =+/)

+      {

+         $category = $1;

+      }

+      elsif (/^\s*;/)

+      {

+         # Skip the comment line

+      }

+      elsif (/^\s*(\S+)\s+\((.*)\)/)

+      {

+         my $objectName = $1;

+         my @attributeArray = ($2 =~ /([\w|\+|\-]+)/g);

+         my %object = ("name" => $objectName, "attributes" => \@attributeArray, "category" => $category);

+

+         push @$objectListRef, \%object;

+      }

+   }

+

+   close $input;

+}

+

+#****************************************************************************

+# subroutine:  OutputObjectListToObjListFile

+# description: Put the object list to the specified object list file.

+# input:       Output filename, object list ref, leading string, attribute string

+# output:      None

+# need init:   No

+#****************************************************************************

+sub OutputObjectListToObjListFile

+{

+   my $filename = shift;

+   my $objectListRef = shift;

+   my $leadingString = shift;

+   my $attributeString = shift;

+   my $category = "";

+

+   $leadingString = "" unless defined $leadingString;

+

+   if (&IsManualModified($filename))

+   {

+      return 0;

+   }

+

+   &ErrorHandler("Undefined object list reference!", __FILE__, __LINE__) unless (defined $objectListRef);

+

+   open my $output, ">$filename" or

+      &ErrorHandler("Cannot open file $filename $!", __FILE__, __LINE__);

+

+   if (defined $objectListRef->[0] and exists $objectListRef->[0]{"category"})

+   {

+      $category = $objectListRef->[0]{"category"};

+      print $output "$leadingString; ====== $category ======\n";

+   }

+

+   foreach my $objectRef (@$objectListRef)

+   {

+      if ($objectRef->{"category"} ne $category)

+      {

+         $category = $objectRef->{"category"};

+         print $output "\n$leadingString; ====== $category ======\n";

+      }

+

+      print $output $leadingString."$objectRef->{name} (";

+      if (defined $attributeString)

+      {

+         print $output $attributeString;

+      }

+      else

+      {

+         print $output join(', ', @{$objectRef->{"attributes"}});

+      }

+      print $output ")\n";

+   }

+

+   close $output;

+

+   return 1;

+}

+

+#****************************************************************************

+# subroutine:  InputObjectListFromCSVFile

+# description: Get the new object list from the specified csv file.

+# input:       Input filename, object list ref, makefile options hash ref

+# output:      Object list

+# need init:   No

+#****************************************************************************

+sub InputObjectListFromCSVFile

+{

+   my $filename = shift;

+   my $objectListRef = shift;

+   my $makefileOptionsHashRef = shift;

+

+   &ErrorHandler("Undefined object list reference!", __FILE__, __LINE__) unless (defined $objectListRef);

+

+   open my $input, "<$filename" or

+      &ErrorHandler("Cannot open file $filename $!", __FILE__, __LINE__);

+

+   # Skip the first line which contains only the column header

+   <$input>;

+

+   while (<$input>)

+   {

+      chomp;

+

+      # Object Name,Attributes,Library Name,Category,Feature Option

+      {

+         my @entry = split(/,/);

+         unless (3 <= scalar(@entry) and

+                 "" ne $entry[0] and

+                 "" ne $entry[1] and

+                 "" ne $entry[2])

+         {

+            &ErrorHandler("Incorrect CSV file format \"$_!\"", __FILE__, __LINE__);

+         }

+

+         $entry[3] = "" unless defined $entry[3];

+         $entry[4] = "" unless defined $entry[4];

+

+         # Check the feature option

+         if (($entry[4] ne "") and defined $makefileOptionsHashRef)

+         {

+            next unless (&FileInfo::EvaluateFeatureOptionCondition($entry[4], $makefileOptionsHashRef));

+         }

+

+         my @attributeArray = ($entry[1] =~ /([\w|\+|\-]+)/g);

+         my %object = ("name" => $entry[0],

+                       "attributes" => \@attributeArray,

+                       "library" => $entry[2],

+                       "category" => $entry[3],

+                       "feature_option" => $entry[4]);

+         push @$objectListRef, \%object;

+      }

+   }

+

+   close $input;

+}

+

+#****************************************************************************

+# subroutine:  InputObjectListFromLISInfo

+# description: Get the new object list from the LIS info list.

+# input:       LIS info list ref, object list ref, attribute string, category

+# output:      Object list

+# need init:   No

+#****************************************************************************

+sub InputObjectListFromLISInfo

+{

+   my $infoListRef = shift;

+   my $objectListRef = shift;

+   my $attributeString = shift;

+   my $category = shift;

+

+   $category = "" unless defined $category;

+

+

+   foreach my $info (@$infoListRef)

+   {

+      my @attributeArray = ($attributeString =~ /[\w|\+|\-]+/g);

+      my %object = ("name" => $info->{"name"},

+                    "attributes" => \@attributeArray,

+                    "library" => $info->{"library"},

+                    "category" => $category,

+                    "size" => $info->{"size"});

+      push @$objectListRef, \%object;

+   }

+}

+

+#****************************************************************************

+# subroutine:  OutputObjectListToCSVFile

+# description: Put the object list to the specified object list file.

+# input:       Output filename, object list ref

+# output:      None

+# need init:   No

+#****************************************************************************

+sub OutputObjectListToCSVFile

+{

+   my $filename = shift;

+   my $objectListRef = shift;

+

+   &ErrorHandler("Undefined object list reference!", __FILE__, __LINE__) unless (defined $objectListRef);

+

+   open my $output, ">$filename" or

+      &ErrorHandler("Cannot open file $filename $!", __FILE__, __LINE__);

+

+   # Print the column header

+   print $output "Object Name,Attributes,Library Name,Category,Feature Option\n";

+

+   foreach my $objectRef (@$objectListRef)

+   {

+      print $output "$objectRef->{name},(";

+      print $output join(' ', @{$objectRef->{"attributes"}});

+      print $output "),$objectRef->{library},$objectRef->{category},$objectRef->{feature_option}\n";

+   }

+

+   close $output;

+}

+

+#****************************************************************************

+# subroutine:  IsManualModified

+# description: Check whether the file is manual modified.

+# input:       File path

+# output:      1: the file is manual modified; 0: otherwise

+# need init:   No

+#****************************************************************************

+sub IsManualModified

+{

+   my $filename = shift;

+   my $result = &sysUtil::HasCheckinHistory($filename);

+

+   if (defined $result and 1 == $result)

+   {

+      return 1;

+   }

+   else

+   {

+      return 0;

+   }

+}

+

+#****************************************************************************

+# subroutine:  SortObjectListByCategory

+# description: Sort the object list by the category.

+# input:       Object list ref.

+# output:      Sorted object list

+# need init:   No

+#****************************************************************************

+sub SortObjectListByCategory

+{

+   my $listRef = shift;

+   my %categoryListHash;

+   my @categorySequence;

+

+   foreach my $object (@$listRef)

+   {

+      my $category = $object->{"category"};

+      if (exists $categoryListHash{$category})

+      {

+         push @{$categoryListHash{$category}}, $object;

+      }

+      else

+      {

+         $categoryListHash{$category} = [$object];

+         push @categorySequence, $category;

+      }

+   }

+

+   @$listRef = ();

+

+   foreach my $category (@categorySequence)

+   {

+      push @$listRef, @{$categoryListHash{$category}};

+   }

+}

+

+#****************************************************************************

+# subroutine:  CompareObjectList

+# description: Compare two object list.

+# input:       First object list, second object list

+# output:      0 for equal; 1 for larger; -1 for smaller

+# need init:   No

+#****************************************************************************

+sub CompareObjectList

+{

+   my $firstList = shift;

+   my $secondList = shift;

+

+   # Compare list entry number

+   if ((scalar(@$firstList) <=> scalar(@$secondList)) != 0)

+   {

+      return scalar(@$firstList) <=> scalar(@$secondList);

+   }

+

+   # Compare list entry name

+   my @sortedFirstList = sort {$a->{"name"} cmp $b->{"name"}} @$firstList;

+   my @sortedSecondList = sort {$a->{"name"} cmp $b->{"name"}} @$secondList;

+

+   for (my $i = 0; $i < scalar(@$firstList); ++$i)

+   {

+      if (($sortedFirstList[$i]{"name"} cmp $sortedSecondList[$i]{"name"}) != 0)

+      {

+         return ($sortedFirstList[$i]{"name"} cmp $sortedSecondList[$i]{"name"});

+      }

+      elsif (compareAttributeList($sortedFirstList[$i]{"attributes"}, $sortedSecondList[$i]{"attributes"}) != 0)

+      {

+         return compareAttributeList($sortedFirstList[$i]{"attributes"}, $sortedSecondList[$i]{"attributes"});

+      }

+   }

+

+   return 0;

+}

+

+#****************************************************************************

+# subroutine:  MergeAttributeList

+# description: Merge the attribute list to the first attribute list.

+# input:       First list ref, second list ref

+# output:      Merged list in first list ref

+# need init:   No

+#****************************************************************************

+sub MergeAttributeList

+{

+   my $firstRef;

+   my $secondRef;

+

+   my %resultHash;

+

+   foreach my $attribute (@$firstRef, @$secondRef)

+   {

+      $resultHash{$attribute} = 1;

+   }

+

+   if ($resultHash{"+RO"})

+   {

+      delete $resultHash{"+RO-CODE"} if (exists $resultHash{"+RO-CODE"});

+      delete $resultHash{"+RO-DATA"} if (exists $resultHash{"+RO-DATA"});

+   }

+

+   @$firstRef = sort compareAttribute keys %resultHash;

+}

+

+sub compareAttribute

+{

+   my $first = shift;

+   my $second = shift;

+

+   my %attributeToNumber = ("+RO" => 0, "+RO-CODE" => 1, "+RO-DATA" => 2);

+

+   return $attributeToNumber{$first} <=> $attributeToNumber{$second};

+}

+

+sub compareAttributeList

+{

+   my $firstList = shift;

+   my $secondList = shift;

+

+   # Compare list entry number

+   if ((scalar(@$firstList) <=> scalar(@$secondList)) != 0)

+   {

+      return scalar(@$firstList) <=> scalar(@$secondList);

+   }

+

+   for (my $i = 0; $i < scalar(@$firstList); ++$i)

+   {

+      if (compareAttribute($firstList->[$i], $secondList->[$i]) != 0)

+      {

+         return compareAttribute($firstList->[$i], $secondList->[$i]);

+      }

+   }

+

+   return 0;

+}

+

+#****************************************************************************

+# subroutine:  ChangeAttributeList

+# description: Chagne the attribute list to the specified string.

+# input:       Object ref, attribute string

+# output:      Object ref

+# need init:   No

+#****************************************************************************

+sub ChangeAttributeList

+{

+   my $objectRef = shift;

+   my $attributeString = shift;

+

+   my @attributeArray = ($attributeString =~ /([\w|\+|\-]+)/g);

+

+   $objectRef->{"attributes"} = \@attributeArray;

+}

+

+#****************************************************************************

+# subroutine:  ChangeObjectListAttributeList

+# description: Chagne the attribute list of each object in the list to

+#              the specified string.

+# input:       Object ref, attribute string

+# output:      Object ref

+# need init:   No

+#****************************************************************************

+sub ChangeObjectListAttributeList

+{

+   my $objectListRef = shift;

+   my $attributeString = shift;

+

+   foreach my $object (@$objectListRef)

+   {

+      &ChangeAttributeList($object, $attributeString);

+   }

+}

+

+#****************************************************************************

+# subroutine:  ChangeObjectListAttributeListByObjectList

+# description: Chagne the attribute list of each object in the list by

+#              the specified object list.

+# input:       Target object ref, source object ref

+# output:      Target object ref

+# need init:   No

+#****************************************************************************

+sub ChangeObjectListAttributeListByObjectList

+{

+   my $targetObjectListRef = shift;

+   my $sourceObjectListRef = shift;

+

+   my @matchList;

+   my @noMatchList;

+

+   &SplitObjectListByCheckList($targetObjectListRef, $sourceObjectListRef, \@matchList, \@matchList, \@noMatchList);

+

+   foreach my $object (@matchList)

+   {

+      if (exists $object->{"matchedObject"})

+      {

+         $object->{"attributes"} = \@{$object->{"matchedObject"}{"attributes"}};

+      }

+   }

+}

+

+#****************************************************************************

+# subroutine:  SplitObjectListByCheckList

+# description: Split the source object list by check object list

+# input:       Source object list ref, check object list ref,

+#              match object list ref, match library list ref, match none list ref

+# output: Match object list: the entry exactly match with the one in hash

+#         Match library list: the entry fall into the library in hash entry

+#         Match non list: match nothing

+# note: This function will append a field "matched" to the objects in check list

+#****************************************************************************

+sub SplitObjectListByCheckList

+{

+   my $sourceListRef = shift;

+   my $checkListRef = shift;

+

+   my $matchObjectListRef = shift;

+   my $matchLibraryListRef = shift;

+   my $matchNoneListRef = shift;

+

+   map { $_->{"matched"} = 0 } @$checkListRef;

+

+   foreach my $sourceObject (@$sourceListRef)

+   {

+      my $splitted = 0;

+

+      # Cannot use hash for fast search since there are evil wildcards...

+      foreach my $checkObject (@$checkListRef)

+      {

+         my $compareResult = compareObjectName($checkObject->{"name"}, $sourceObject->{"name"});

+         if (0 == $compareResult)

+         {

+            # Exactly match

+            push @$matchObjectListRef, $sourceObject;

+            $sourceObject->{"matchedObject"} = $checkObject;

+            $checkObject->{"matched"} = 1;

+            $splitted = 1;

+            last;

+         }

+         elsif (0 < $compareResult)

+         {

+            # Source object name is contained in the check object name

+            push @$matchObjectListRef, $sourceObject;

+            $sourceObject->{"matchedObject"} = $checkObject;

+            # Do not set the matched flag since they are not exactly the same

+            $splitted = 1;

+            last;

+         }

+         else

+         {

+            # Source object name is not contained in the check object name

+            # Check the library

+            if (isLibraryName($sourceObject->{"name"}))

+            {

+               # Source object is a library, and it can only be put in matchObjectList

+               next;

+            }

+            elsif ($sourceObject->{"library"} eq "Unknown")

+            {

+               # The library of the source object is unknown, push to match library list for safety

+               push @$matchLibraryListRef, $sourceObject;

+               $splitted = 1;

+               last;

+            }

+            else

+            {

+               # Source object is a true object

+               if (isLibraryName($checkObject->{"name"}))

+               {

+                  # Check object is a library, check if source is belong to it

+                  $compareResult = compareObjectName($checkObject->{"name"}, $sourceObject->{"library"});

+                  if (0 <= $compareResult)

+                  {

+                     # Match to the library

+                     push @$matchLibraryListRef, $sourceObject;

+                     $sourceObject->{"matchedObject"} = $checkObject;

+                     $splitted = 1;

+                     last

+                  }

+               }

+            }

+         } # if (0 == $compareResult)

+      } # foreach my $checkObject (@$checkListRef)

+

+      if (not $splitted)

+      {

+         # Matches nothing

+         push @$matchNoneListRef, $sourceObject;

+      }

+   } # foreach my $sourceObject (@$sourceListRef)

+}

+

+# Return 1 if the name is belong to a library

+sub isLibraryName

+{

+   my $name = shift;

+   $name = lc $name;

+

+   if ((substr($name, -4) eq ".lib") or (substr($name, -2) eq ".a"))

+   {

+      return 1;

+   }

+   else

+   {

+      return 0;

+   }

+}

+

+# Compare two object name with wildcard

+sub compareObjectName

+{

+   my $first = shift;

+   my $second = shift;

+

+   $first = lc $first;

+   $second = lc $second;

+

+   if ($first eq $second)

+   {

+      # Exactly match

+      return 0;

+   }

+   elsif ($first =~ m/\*/)

+   {

+      $first =~ s/\./\\./g;  # Change . to \.

+      $first =~ s/\*/.\*/g;  # Change to regular expression form

+      $second =~ s/\*//g;    # Remove wildcard symbol

+

+      if ($second =~ m/$first/)

+      {

+         # Second is contained in first

+         return 1;

+      }

+      else

+      {

+         return -1;

+      }

+   }

+   else

+   {

+      return -1;

+   }

+}

+

+#****************************************************************************

+# subroutine:  ErrorHandler

+# description: Handle the post process error and output the error message.

+#              Note calling this function will lead program terminated.

+# input:       Message, source filename, line number

+# output:      None

+# need init:   No

+#****************************************************************************

+sub ErrorHandler

+{

+   my ($message, $file, $line) = @_;

+

+   my $errorMessage = "OBJ LIST ERROR: $message at $file line $line\n";

+   print $errorMessage;

+

+   die $errorMessage;

+}

+

+1;

+

+#============================================================================

+# Not used but for backing-up

+#============================================================================

+

+#****************************************************************************

+# subroutine:  ChangeObjectListToHash

+# description: Chagne the object list to hash form.

+# input:       Object list ref, output hash ref, start serial number

+# output:      Object list hash

+# need init:   No

+#****************************************************************************

+sub ChangeObjectListToHash

+{

+   my $listRef = shift;

+   my $hashRef = shift;

+   my $serialNumber = shift;

+

+   $serialNumber = 0 unless defined $serialNumber;

+

+   foreach my $object (@$listRef)

+   {

+      my $key = GetObjectKey($object);

+      if (exists $hashRef->{$key})

+      {

+         mergeAttributeList($hashRef->{$key}->{"attributes"}, $object->{"attributes"});

+      }

+      else

+      {

+         $hashRef->{$key} = $object;

+         $object->{"matched"} = 0;

+         $object->{"serial"} = $serialNumber++;

+      }

+   }

+

+   return $serialNumber;

+}

+

+#****************************************************************************

+# subroutine:  GetObjectKey

+# description: Get the object key used in object hash.

+# input:       Object ref

+# output:      Key of the object

+# need init:   No

+#****************************************************************************

+sub GetObjectKey

+{

+   my $object = shift;

+

+   return "$object->{name}::$object->{library}";

+}

+

+#****************************************************************************

+# subroutine:  ChangeObjectHashToList

+# description: Chagne the object hash to list form.

+# input:       Object hash ref, output list ref

+# output:      Object list

+# need init:   No

+#****************************************************************************

+sub ChangeObjectHashToList

+{

+   my $hashRef = shift;

+   my $listRef = shift;

+

+   @$listRef = (sort {$a->{"serial"} <=> $b->{"serial"}} values %$hashRef);

+}