[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/hExpand.pl b/mcu/tools/hExpand.pl
new file mode 100644
index 0000000..59ac344
--- /dev/null
+++ b/mcu/tools/hExpand.pl
@@ -0,0 +1,959 @@
+#!/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: 

+# ---------

+#  hExpand.pl

+#

+# Description: 

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

+#  this script is used to expand files included by #include.

+#

+# Auther: 

+# -------

+#  Shinn Lin

+# 

+# Note:

+# -----

+#

+# Log: 

+# -----

+#  2008/06/30   Create.

+#  2010/01/29   Correct header exclusion (all filename to lower case)

+#

+

+#BEGIN { push @INC, "pcore/" , 'U:\\00MyPerlLib'}  # add additional library path

+#package XXX;  

+use strict;

+

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

+# Global Data

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

+

+my $lineRedirect            = 1;    # add '#line' in expanded file to redirect warning/error msg

+my $g_removeTempFile        = 1;

+

+# these two only work when $lineRedirect = 0

+my $removeCommentOrNot      = 1;    # for correct #line redirect, should disable this

+my $removeConsecutiveEmpty  = 0;    # no much size difference

+

+my $g_nodeThreshold = 40;

+

+my @targetFileList = ();

+my $g_prjName = '';

+my $g_mcuPath = ".";

+my $g_outputPath = ".";

+

+my $logFilename = "hExpand.log";

+my $logPath = ".";

+my $logFileHandle;

+

+my $valSuccess          = 0;

+my $valAlreadyIncluded  = 1;

+my $valFileNotFound     = 2;

+my $valRecursiveInclude = 3;

+my $valOthers           = 4;

+

+my $idxPath         = 1;

+my $idxAlwaysInc    = 2;

+my $idxIncluded     = 3;

+my %g_incInfo = ();     # { filename => [1] path

+                        #               [2] always include or not

+                        #               [3] included or not}

+

+my @g_incPath = ();

+

+my %g_targetFileHash = ();

+my @nonExpandList = ("ps_trace.h");

+my %g_nonExpandList = ();

+

+my @incDeeps = ();

+my %incTreeHash = ();

+my $g_totalIncCount = 0;

+my $g_forceNotExpand = 0; # if set to 1, force NOT to expand #include

+

+my $foundFileList = {};     # found list

+my $notFoundFileList = {};  # not found list

+

+

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

+# Export Function

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

+

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

+# Internal Data

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

+

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

+# Program Start

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

+

+if (@ARGV)

+{

+    ($g_mcuPath, $g_outputPath, $g_prjName, @targetFileList) = @ARGV;

+}

+else

+{

+    die "\nUsage: 'hExpand.pl <mcu path> <output path> <prj name> <target filename>'\n".

+        "   e.g. hExpand.pl \\server\\w08.20\\mcu \\server\\w08.20\\mcu\\expandOutput superman29v31_demo mmi_include.h\n";

+}

+

+open($logFileHandle, ">$logPath\\$logFilename") or die "can't open $logPath\\$logFilename!\n";

+

+printBoth("\n[start hExpand]\n\n");

+

+&timeCheck();

+

+# prepare non-expand list

+foreach my $file (@nonExpandList)

+{

+    $g_nonExpandList{lc $file} = 1;

+}

+

+my @incMods = ("plutommi", "kal");

+&readCompileInfo(\@incMods, \@g_incPath, 0);

+

+$g_targetFileHash{$_} = 1 foreach (@targetFileList);

+

+foreach my $targetFile (@targetFileList)

+{

+    printLog("[$targetFile]\n");

+    

+    my @resultData = ();

+    @incDeeps = ();

+    %incTreeHash = ();

+    $g_totalIncCount = 0;

+    %g_incInfo = ();

+

+    my $fileHandle;

+    my $outputFile = "$g_outputPath\\$targetFile";

+    open($fileHandle, ">$outputFile");

+

+    # copy original header file to output folder

+    copyOriginalHeader($targetFile);

+    

+    # add compile option for MoDIS

+    print $fileHandle "#ifdef WIN32\n";

+    print $fileHandle "#include \"_".$targetFile."\"\n";

+    print $fileHandle "#else\n";

+

+    my $nodeCount = 0;

+    &expandInc($fileHandle, $targetFile, 0, \$nodeCount);

+   

+    #&findMismatchIf(\@resultData);

+    

+    # end of compile option for MoDIS

+    print $fileHandle "#endif /* WIN32 */\n\n";

+    

+    close($fileHandle);

+    printBoth("\n[hExpand.pl] $outputFile generated!\n\n");

+

+    &timeCheck();

+}

+

+

+close($logFileHandle);   # log file

+

+exit 0;

+

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

+# Internal Function

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

+

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

+# FUNCTION

+#  copyOriginalHeader

+# DESCRIPTION

+#  xxx

+# PARAMETERS

+#  xxx

+# RETURNS

+#  xxx

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

+sub copyOriginalHeader()

+{

+    my ($incFile) = @_;

+    

+    my $incPath = &searchIncPath($incFile, \@g_incPath);

+

+    open(hFile, "<$incPath\\$incFile") or die "can't open $incPath\\$incFile\n";

+    my @fileData = <hFile>;

+    close(hFile);

+    

+    open(hFile, ">$g_outputPath\\_".$incFile) or die "can't open $g_outputPath\\_".$incFile."\n";

+    

+    # add redirect info

+    my $incPrintPathName = "$incPath\\$incFile";

+    $incPrintPathName =~ s/\\/\\\\/g;

+    print hFile "#line 0 \"$incPrintPathName\"\n" if ($lineRedirect);

+    print hFile join('', @fileData);

+    close(hFile);

+}

+

+

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

+# FUNCTION

+#  expandInc

+# DESCRIPTION

+#  xxx

+# PARAMETERS

+#  xxx

+# RETURNS

+#  0: success, 1: already included, 2: file not found, 3: recursive include

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

+sub expandInc()

+{

+    my ($fileHandle, $incFile, $alwaysExpand, $nodeCount_ref) = @_;

+    $incFile = lc $incFile;

+          

+    my $incPath = "";

+    my @fileData = ();

+    my $printStr;

+        

+    printLog("[$incFile] check if include required\n");

+    

+    if (!(defined $g_incInfo{$incFile}))

+    {

+        # get path for every file's 1st entry

+        

+        $incPath = &searchIncPath($incFile, \@g_incPath);

+        if ($incPath eq "")

+        {

+            printLog("[Warning] can't find path for $incFile\n");

+            return $valFileNotFound;

+        }

+        $g_incInfo{$incFile}[$idxPath] = $incPath;

+               

+        # check for include condition

+        open(hFile, "<$incPath\\$incFile") or die "can't open $incPath\\$incFile\n";

+        @fileData = <hFile>;

+        close(hFile);

+        $g_incInfo{$incFile}[$idxIncluded] = 0;

+        if (&getIncWrapper(\@fileData) eq "")

+        {

+            $g_incInfo{$incFile}[$idxAlwaysInc] = 1;

+        }

+        else

+        {

+            $g_incInfo{$incFile}[$idxAlwaysInc] = 0;

+        }

+        printLog("[$incFile] ifAlwaysInc = ".$g_incInfo{$incFile}[$idxAlwaysInc]."\n");

+    }

+    else

+    {

+        # just return if this inc is already included

+        return $valAlreadyIncluded if ($g_incInfo{$incFile}[$idxIncluded]);

+        $incPath = $g_incInfo{$incFile}[$idxPath];

+    }

+

+    if (defined $incTreeHash{$incFile})

+    {

+        printLog("[Warning] recursive include!\n");

+        return $valRecursiveInclude;

+    }

+

+    $printStr = "//[hExpand.pl][$incFile] expanded (".join('->', @incDeeps)."->)\n";

+    printLog($printStr);

+    #print $fileHandle $printStr;

+

+    $g_totalIncCount++;

+    printBoth("[$g_totalIncCount][$incFile] included\n");

+    

+    # mark as included if appropriate

+    $g_incInfo{$incFile}[$idxIncluded] = 1 if (!$alwaysExpand);

+    printLog("//[hExpand.pl][$incFile][alwaysExpand] = $alwaysExpand, [included] = ".$g_incInfo{$incFile}[$idxIncluded]."\n");

+       

+    if (scalar(@fileData) == 0)

+    {

+        open(hFile, "<$incPath\\$incFile") or die "can't open $incPath\\$incFile\n";

+        @fileData = <hFile>;

+        close(hFile);

+    }

+

+    my @incOrderList = ();

+    if (!$lineRedirect)

+    {

+        @fileData = &removeComment(\@fileData) if ($removeCommentOrNot);    

+        @fileData = &removeConsecutiveEmpty(\@fileData) if ($removeConsecutiveEmpty);

+    }

+    else

+    {

+        # find inc order first

+        my @tmpData = &removeComment(\@fileData);

+        foreach my $line (@tmpData)

+        {

+            if ($line =~ /^[\s]*\#include[\s]+([<\"])[\s]*([\w\.]+)[\s]*\1/)

+            {

+                push @incOrderList, lc $2;

+            }

+        }

+    }

+

+    # add line redirect

+    my $incPrintPathName = "$incPath\\$incFile";

+    $incPrintPathName =~ s/\\/\\\\/g;

+    print $fileHandle "#line 1 \"$incPrintPathName\"\n" if ($lineRedirect);

+    

+    my $iMax = $#fileData;

+    my $conditionalInclude = 0;

+    my $ifDeeps = 0;

+    my $nodeMax = 0;    # max node counts

+    for (my $i=0; $i<=$iMax; $i++)

+    {

+        my $line = $fileData[$i];

+        if ($line =~ /^[\s]*\#include[\s]+([<\"])[\s]*([\w\.]+)[\s]*\1/)

+        {

+            my $inc = lc $2;

+            

+            # make sure we get correct #include (not in comments)

+            if ($lineRedirect)

+            {

+                if ($inc ne $incOrderList[0])

+                {

+                    print $fileHandle $line;

+                    next;                

+                }

+                else

+                {

+                    shift @incOrderList;  # remove from list

+                }

+            }

+            

+            # bypass all target files, since we'll expand them one by one

+            if ((defined $g_targetFileHash{$inc}) || $g_forceNotExpand || (defined $g_nonExpandList{$inc}))

+            {

+                printLog("[$inc] not to include");

+                print $fileHandle $line;

+                next;

+            }

+            

+            printLog("[$inc] found\n");

+

+            push @incDeeps, $incFile;

+            $incTreeHash{$incFile} = 1;

+

+            my $nodeCount = 0;

+            my $res = expandInc($fileHandle, $inc, ($alwaysExpand || $conditionalInclude), \$nodeCount);           

+            my $tmpLine = "";

+

+            #if ($conditionalInclude && !$alwaysExpand)

+            {

+                # get tree node counts

+                printLog("//[hExpand.pl][$inc]\t[nodes = $nodeCount]\t[".join('->', @incDeeps)."]\n");

+            }

+

+            pop @incDeeps;

+            delete $incTreeHash{$incFile};                

+             

+            if ($res == $valSuccess)

+            {

+                # do nothing

+                $nodeMax = $nodeCount if ($nodeCount > $nodeMax);

+                ($$nodeCount_ref) += 1 + $nodeCount;    # calculate tree-node count

+                $tmpLine = "#line ".($i+1)." \"$incPrintPathName\"\n" if ($lineRedirect);

+            }

+            elsif ($res == $valAlreadyIncluded)

+            {

+                $printStr = "//[hExpand.pl][$inc] already included (".join('->', @incDeeps).")\n";

+                #print $fileHandle $printStr;

+                printLog($printStr);

+                $tmpLine = "//$line" if ($lineRedirect);

+            }

+            elsif ($res == $valFileNotFound)

+            {

+                $printStr = "//[hExpand.pl][$inc] file not found\n";

+                #print $fileHandle $printStr;

+                printLog($printStr);

+                $tmpLine = $line;    # file not found, keep #include "xxx"

+            }

+            elsif ($res == $valRecursiveInclude)

+            {

+                $printStr = "//[hExpand.pl][$inc] recursive include (".join('->', @incDeeps).")\n";

+                #print $fileHandle $printStr;

+                printLog($printStr);

+                $tmpLine = "//$line" if ($lineRedirect);

+            }

+            print $fileHandle $tmpLine;

+        }

+        else

+        {

+            if ($line =~ /^[\s]*\#ifndef[\s]+([\w]+)/)

+            {

+                $ifDeeps++;

+                my $wrapper = $1;

+                if ((defined $fileData[$i+1]) && ($fileData[$i+1] =~ /^[\s]*\#define[\s]+$wrapper[^\w]+/) &&

+                    ($wrapper =~ /_h[_]*$/i))

+                {

+                    printLog("//[hExpand.pl][wrapper] $wrapper\n");

+                }

+                else

+                {

+                    $conditionalInclude = $ifDeeps if ($conditionalInclude == 0);

+                }

+            }

+            elsif ($line =~ /^[\s]*\#if/)

+            {

+                $ifDeeps++;

+                $conditionalInclude = $ifDeeps if ($conditionalInclude == 0);

+            }

+            elsif ($line =~ /^[\s]*\#endif/)

+            {

+                if ($conditionalInclude == $ifDeeps)

+                {

+                    $conditionalInclude = 0;

+                }

+                $ifDeeps--;

+            }

+            elsif ($line =~ /<hExpand[\s]+noExpand[\s]*>/i)

+            {

+                $g_forceNotExpand = 1;

+            }

+            elsif ($line =~ /<\/hExpand>/i)

+            {

+                $g_forceNotExpand = 0;

+            }

+

+            print $fileHandle $line;

+        }

+    }

+    

+    if (($$nodeCount_ref - $nodeMax) >= $g_nodeThreshold)

+    {

+        printLog("//[hExpand.pl][$incFile][diff lt node threshold]\t[$$nodeCount_ref][$nodeMax][".($$nodeCount_ref - $nodeMax)."]\n");

+    }

+    

+    print $fileHandle "\n";

+    return $valSuccess;

+}

+

+

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

+# FUNCTION

+#  getIncWrapper

+# DESCRIPTION

+#  xxx

+# PARAMETERS

+#  xxx

+# RETURNS

+#  xxx

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

+sub getIncWrapper()

+{

+    my ($fileData_aref) = @_;

+    

+    my @tmpData = &removeComment($fileData_aref);

+    

+    # remove beginning '#include'

+    my $iMax = $#tmpData;

+    for (my $i=0; $i<=$iMax; $i++)

+    {

+        my $line = $tmpData[$i];

+        if ($line =~ /^[\s]*\#include/)

+        {

+        }

+        elsif ($line =~ /^[\s]*$/)

+        {

+            # skip empty lines

+        }

+        elsif ($line =~ /^[\s]*\#if/)

+        {

+            @tmpData = @tmpData[$i..$iMax];

+            last;

+        }

+    }

+    

+    my $str = join('', @tmpData);

+    if ($str =~ /^[\s]*\#ifndef[\s]+([\w]+).*?\#endif[\s]*$/s)

+    {

+        # print "[$1] inc wrapper\n";

+        return $1;

+    }

+    return "";

+}

+

+

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

+# FUNCTION

+#  removeComment

+# DESCRIPTION

+#  xxx

+# PARAMETERS

+#  xxx

+# RETURNS

+#  xxx

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

+sub removeComment()

+{

+    my ($fileData_aref) = @_;

+    

+    my @outData = ();

+    

+    # remove '//'

+    foreach my $line (@{$fileData_aref})

+    {

+        push @outData, $line if ($line !~ /^[\s]*\/\//);

+    }

+    

+    my $tmpStr = join('', @outData);

+    

+    $tmpStr =~ s/(?<!\\)\/\*.*?\*\///sg;

+    @outData = split("\n", $tmpStr);

+    @outData = map {$_."\n"} @outData;

+    return @outData;

+}

+

+

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

+# FUNCTION

+#  removeConsecutiveEmpty

+# DESCRIPTION

+#  xxx

+# PARAMETERS

+#  xxx

+# RETURNS

+#  xxx

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

+sub removeConsecutiveEmpty()

+{

+    my ($fileData_aref) = @_;

+    

+    my $tmpStr = join('', @{$fileData_aref});

+    $tmpStr =~ s/\n{3,}/\n\n/sg;

+    my @outData = split("\n", $tmpStr);

+    @outData = map {$_."\n"} @outData;

+    return @outData;    

+}

+

+

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

+# FUNCTION

+#  searchIncPath

+# DESCRIPTION

+#  xxx

+# PARAMETERS

+#  xxx

+# RETURNS

+#  xxx

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

+sub searchIncPath()

+{

+    my ($incFile, $incPath_aref) = @_;

+    

+    if (defined $notFoundFileList->{$incFile})

+    {

+        return "";   

+    }

+    my $incPath = $foundFileList->{$incFile};

+    if (defined $incPath)

+    {

+        return $incPath if (-e "$incPath\\$incFile")

+    }

+    

+    foreach my $incPath (@{$incPath_aref})

+    {

+        my $filepath = "$incPath\\$incFile";

+        if (-e $filepath)

+        {

+            $foundFileList->{$incFile} = $incPath;

+            return $incPath;

+        }

+    }

+    

+    $notFoundFileList->{$incFile} = 1;

+    return "";

+}

+

+

+

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

+# FUNCTION

+#  readCompileInfo

+# DESCRIPTION

+#  xxx

+# PARAMETERS

+#  xxx

+# RETURNS

+#  xxx

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

+sub readCompileInfo()

+{

+    my ($incMod_aref, $incPath_aref, $def_aref) = @_;

+    

+    if ($g_prjName eq "")

+    {

+        push @{$incPath_aref}, ".";     # no project specified, just put current dir to inc path

+        print "[Warning] no compile info!\n";

+        return;

+    }

+    

+    my $infoFilename = "$g_mcuPath\\build\\$g_prjName\\log\\info.log";

+    

+    my %defHash = ();

+    my %incHash = ();   

+    

+    my $inSection;

+    if ($incPath_aref || $def_aref)

+    {

+        # read common options and common include path from info.log     

+        open(hFile, "<$infoFilename") or die "can't open $infoFilename";

+        my @fileData = <hFile>;

+        close(hFile);

+           

+        foreach my $line (@fileData)

+        {

+            if ($line =~ /\[ COMMON OPTION \]/)

+            {

+                $inSection = 1;

+                next;

+            }

+            elsif ($line =~ /\[ COMMON INCLUDE PATH \]/)

+            {

+                $inSection = 2;

+                next;

+            }

+        

+            if ($line =~ /(^[^\[][^\s]*)/)

+            {           

+                if ($inSection == 1)

+                {

+                    #print "$1\n";

+                    if ($def_aref && !(defined $defHash{$1}))

+                    {

+                        push @{$def_aref}, $1;

+                        $defHash{$1} = 1;

+                    }

+                }

+                elsif ($inSection == 2)

+                {

+                    my $incPath = "$1";

+                    

+                    if ($incPath !~ /:/)

+                    {

+                        $incPath = "$g_mcuPath\\$incPath";

+                    }

+                    #print "$incPath\n";

+                    

+                    if ($incPath_aref && !(defined $incHash{$incPath}))

+                    {

+                        push @{$incPath_aref}, $incPath;

+                        $incHash{$incPath} = 1;

+                    }

+                }

+            }

+            else            

+            {

+                $inSection = 0;

+            }

+        }

+    }

+    

+    # read inc from *.inc

+    if ($incPath_aref)

+    {

+        foreach my $myMod (@{$incMod_aref})

+        {

+            my @incFiles = ();

+            if (&getFileList("$g_mcuPath\\make\\$myMod\\*.inc", 1, \@incFiles) > 0)

+            {

+                foreach my $incFilename (@incFiles)

+                {

+                    open(hFile, "<$incFilename") or die "can't open $incFilename";

+                    my @fileData = <hFile>;

+                    close(hFile);

+                    

+                    foreach my $line (@fileData)

+                    {

+                        if ($line =~ /(^[^\s]+)([\s]*$)/)

+                        {

+                            my $incPath = "$g_mcuPath\\$1";

+                            #$incPaths = "$incPaths\n-I$g_mcuPath\\$1";

+                            if (!(defined $incHash{$incPath}))

+                            {

+                                push @{$incPath_aref}, $incPath;

+                                $incHash{$incPath} = 1;

+                            }                            

+                        }

+                    }

+                }            

+            }

+            else

+            {

+                print "[Warning] can't find *.inc for $myMod\n";

+            }

+        } 

+    }   

+    

+    # read macro from *.def

+    if ($def_aref)

+    {

+        foreach my $myMod (@{$incMod_aref})

+        {

+            my @defFiles = ();

+            if (&getFileList("$g_mcuPath\\make\\$myMod\\*.def", 1, \@defFiles) > 0)

+            {

+                foreach my $defFilename (@defFiles)

+                {

+                    open(hFile, "<$defFilename") or die "can't open $defFilename";

+                    my @fileData = <hFile>;

+                    close(hFile);

+                    

+                    foreach my $line (@fileData)

+                    {

+                        if ($line =~ /(^[^\s]+)([\s]*$)/)

+                        {

+                            #$commonOptions = "$commonOptions\n-D$1";

+                            if (!(defined $defHash{$1}))

+                            {

+                                push @{$def_aref}, $1;

+                                $defHash{$1} = 1;

+                            }                            

+                        }

+                    }

+                }            

+            }

+            else

+            {

+                print "[Warning] can't find *.def for $myMod\n";

+            }        

+        }    

+    }

+}

+

+

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

+# FUNCTION

+#  getFileList

+# DESCRIPTION

+#  get file/path list for given search string

+# PARAMETERS

+#  xxx

+# RETURNS

+#  xxx

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

+sub getFileList()

+{

+    my $rootDir;

+    my $incSubDir; # include sub dir (1) or not (0)

+    my $fileList_ref;

+    

+    ($rootDir, $incSubDir, $fileList_ref) = @_;

+    

+    my @fileData = ();

+

+    # get file list

+    my $tmpFilename = "~tmpFile.lst";

+    

+    my $dirStr = "$rootDir /b";

+    $dirStr .= " /s" if ($incSubDir);

+

+    system("dir ".$dirStr." > $tmpFilename");

+    open(hFile, "<$tmpFilename") or die "[ERROR] can't open $tmpFilename\n";

+    @fileData = <hFile>;

+    close(hFile);

+    system("del $tmpFilename") if ($g_removeTempFile);

+

+    foreach my $line (@fileData)

+    {

+        my $name = $line;

+        push @{$fileList_ref}, $name if ($name !~ /^[\s]*$/);

+        #print "$name";

+    }

+    return scalar(@{$fileList_ref});

+}

+

+

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

+# FUNCTION

+#  timeCheck

+# DESCRIPTION

+#  print current time (in sec.) and time-difference to previous check if exists

+# PARAMETERS

+#  none

+# RETURNS

+#  current time and time difference if exists (both in sec.)

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

+my @timePrev = ();

+sub timeCheck()

+{

+    my @timeCurr = localtime(time);

+    printBoth("[Time: ".&timeInSec(\@timeCurr)." sec.");

+    if (@timePrev > 0) # previous-time exists

+    {

+        printBoth("(Diff = ".&timeDiffInSec(\@timeCurr, \@timePrev).")");

+    }

+    printBoth("]\n");

+    @timePrev = @timeCurr;    

+}

+

+

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

+# FUNCTION

+#  timeDiffInSec

+# DESCRIPTION

+#  get time difference in sec.

+# PARAMETERS

+#  para 1 - reference to time1 in localtime array format

+#  para 2 - reference to time2 in localtime array format

+# RETURNS

+#  time difference in sec.

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

+sub timeDiffInSec()

+{

+    my $time1;

+    my $time2;

+    my $timeDiff;

+    

+    ($time1, $time2) = @_;

+    

+    $timeDiff = timeInSec($time1) - timeInSec($time2);

+    if ($timeDiff < 0)

+    {

+        return (-$timeDiff);

+    }

+    return $timeDiff;

+}

+

+

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

+# FUNCTION

+#  timeInSec

+# DESCRIPTION

+#  time in sec.

+# PARAMETERS

+#  para - time in localtime array format

+# RETURNS

+#  time in sec.

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

+sub timeInSec()

+{

+    my @daysInMon = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

+    my $sec = $_[0][0];

+    my $min = $_[0][1];

+    my $hour = $_[0][2];

+    my $day = $_[0][3];

+    my $mon = $_[0][4]+1;

+    my $year = $_[0][5];

+    my $timeInSec;    

+    

+    if (isLeapYear($year+1900))

+    {

+        $daysInMon[1] = 29;

+        $timeInSec = (((($year*366+$mon*$daysInMon[$mon-1]+$day)*24 + $hour)*60 + $min)*60 + $sec);

+    }

+    else

+    {

+        $timeInSec = (((($year*365+$mon*$daysInMon[$mon-1]+$day)*24 + $hour)*60 + $min)*60 + $sec);

+    }

+    return $timeInSec;

+}

+

+

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

+# FUNCTION

+#  isLeapYear

+# DESCRIPTION

+#  is input year leap-year

+# PARAMETERS

+#  year

+# RETURNS

+#  leap-year or not

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

+sub isLeapYear()

+{

+    my $year = $_[0];

+    

+    if (($year%4 == 0) && ($year%100 != 0))

+    {

+        return 1;

+    }

+    return 0;

+}

+

+

+sub findMismatchIf()

+{

+    my ($data_aref) = @_;

+    

+    my $nestNum = 0;

+    my %nestHash = ();

+

+    printLog("\n[findMismatchIf]\n");

+

+    foreach my $line (@{$data_aref})

+    {

+        if ($line =~ /^[\s]*\#if/)

+        {

+            $nestNum++;

+            $nestHash{$nestNum} = $line;

+            #printLog("[$nestNum][+] $line");

+            printLog("$line");

+        }

+        elsif ($line =~ /^[\s]*\#endif/)

+        {

+            #printLog("[$nestNum][-] $nestHash{$nestNum}");

+            delete $nestHash{$nestNum};

+            $nestNum--;

+        }

+    }

+    my @nestIdx = sort keys(%nestHash);

+

+    foreach my $idx (@nestIdx)

+    {

+        printLog("[$idx] $nestHash{$idx}\n");

+    }

+}

+

+sub printBoth()

+{

+    my ($str) = @_;

+    print $str;

+    print $logFileHandle $str;

+}

+

+sub printLog()

+{

+    my ($str) = @_;

+    print $logFileHandle $str;

+}

+

+

+sub trim()

+{

+    my ($str) = @_;

+    $str =~ s/(^\s*)|(\s*$)//g;

+    return $str;

+}