[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/operator_feature_check.pl b/mcu/tools/operator_feature_check.pl
new file mode 100644
index 0000000..038c784
--- /dev/null
+++ b/mcu/tools/operator_feature_check.pl
@@ -0,0 +1,564 @@
+#!/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) 2007
+#
+# 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:
+# ---------
+# operator_feature_check.pl
+#
+# Description:
+# ------------
+# To generate dummy C files and pre-process them to get macro values.
+#
+# Auther:
+# -------
+# Frank Wu
+#
+# Note:
+# -----
+# none.
+#
+# Log:
+# -----
+# 2007/04/01 Create.
+#
+use strict;
+
+#******************************************************************************
+# Global Data
+#******************************************************************************
+my $returnErrorCode = 0; # return error code or not
+
+my $mcuPath = "$ARGV[1]";
+my $headerFilename = "$ARGV[2]";
+my $operatorHeaderFile = "$ARGV[3]";
+my $headerFilepath = "$ARGV[4]";
+my $IsResult = "$ARGV[6]";#1: To get finial values. 0: To get original values.
+
+# list the modules which their *.inc will be added into include path
+my @includeMod = (); # include *.inc
+
+# additional path for include files
+my @addIncPath = ($headerFilepath);
+
+# additional include files
+my @addIncFiles = ();
+
+# additional lines
+my @addLines = ();
+
+# additional features to watch
+my @addFeaturesToWatch = ();
+
+# remove temp file or not
+my $removeTempFile = 1;
+
+# also process disabled features or not
+my $alsoProcessDisabledFeatures = 0;
+
+# compiler
+my $compiler = "$ARGV[7]";
+my $VIA = "$ARGV[8]";
+
+my $checkMainFilename;
+my $logFilename;
+
+my %featureList = ();
+my @sortedAllFeatures = ();
+my @defFeatures = ();
+my @undefFeatures = ();
+
+my $allFeatureCount;
+my $defFeatureCount;
+my $undefFeatureCount;
+
+#******************************************************************************
+# Export Function
+#******************************************************************************
+
+#******************************************************************************
+# Internal Data
+#******************************************************************************
+my @fileData = ();
+my $logPath = "";
+my $prjName = "";
+
+#******************************************************************************
+# Program Start
+#******************************************************************************
+
+# get project name from input argument
+if (scalar(@ARGV) == 0)
+{
+ die "\nUsage: operator_feature_check.pl <project name> <mcu path>
+ <customer header file> <operator header file> <customer header file path>
+ <operator path> <1: To get final values 0: To get initial values>
+ <compiler path> <compiler via argument>\n";
+}
+else
+{
+ $prjName = $ARGV[0];
+}
+
+print "\nStart Header File Feature Check...\n";
+
+$logPath = $ARGV[5];
+
+# get all feature list
+open(hFile, "<$logPath\\$headerFilename") or die "can't open $logPath\\$headerFilename";
+@fileData = <hFile>;
+close(hFile);
+
+print "get feature list from $headerFilename...\n";
+foreach my $line (@fileData)
+{
+ my $feature = "";
+
+ # also process marked "//" features or not
+ if ($alsoProcessDisabledFeatures)
+ {
+ if ($line =~ /^([\s]*([\/]{2,})?[\s]*)(#define[\s]+)([\w_]+)([\s]*)/)
+ {
+ $feature = $4;
+ }
+ }
+ else
+ {
+ if ($line =~ /^([\s]*)(#define[\s]+)([\w_]+)([\s]*)/)
+ {
+ $feature = $3;
+ } elsif ($line =~ /^([\s]*([\/]{2,})[\s]*)\{(.+)\}/) {
+ $feature = $3;
+ }
+ }
+
+ # ignore empty one
+ if ($feature ne "")
+ {
+ $featureList{$feature} = "";
+ }
+}
+
+@sortedAllFeatures = sort(keys(%featureList));
+
+# add additional features to watch
+push @sortedAllFeatures, @addFeaturesToWatch;
+
+$allFeatureCount = @sortedAllFeatures;
+
+$checkMainFilename = "~".splitFilename($headerFilename, 0)."_check";
+
+# generate XXX_check.c
+print "generate feature check file...\n";
+genCheckDotC("$checkMainFilename.c", $headerFilename, \@sortedAllFeatures);
+
+# validate features
+print "validate features...\n";
+processCheckDotC("-E");
+
+# check def/undef features in pre-processed file
+print "check def/undef features in pre-processed file...\n";
+checkFeatures("$checkMainFilename.obj", \%featureList, \@sortedAllFeatures, \@defFeatures, \@undefFeatures);
+$defFeatureCount = @defFeatures;
+$undefFeatureCount = @undefFeatures;
+
+if ($removeTempFile)
+{
+ system("del /F /Q $checkMainFilename.c");
+ system("del /F /Q $checkMainFilename.obj");
+}
+$logFilename = splitFilename($headerFilename, 0)."_$prjName.log";
+
+checkConfig("$logPath\\$operatorHeaderFile", \%featureList, $logFilename);
+
+if ($returnErrorCode)
+{
+ exit 1;
+}
+exit 0;
+
+#******************************************************************************
+# Internal Function
+#******************************************************************************
+
+#******************************************************************************
+# FUNCTION
+# genCheckDotC
+# DESCRIPTION
+# xxx
+# PARAMETERS
+# xxx
+# RETURNS
+# none
+#******************************************************************************
+sub genCheckDotC()
+{
+ my $filename;
+ my $headerFilename;
+ my @fileData;
+ my $pUserData; # reference to data array
+
+ ($filename, $headerFilename, $pUserData) = @_;
+
+ open(hFile, ">$filename") or die "can't open $filename";
+
+ foreach my $line (@addLines)
+ {
+ print hFile $line;
+ }
+
+ # write header part
+
+ foreach my $inc (@addIncFiles)
+ {
+ print hFile "#include \"$inc\"\n";
+ }
+
+ print hFile "#include \"$headerFilename\"\n\n";
+
+ # write start tag
+ print hFile "static void * feature_check[] = {\n";
+
+ foreach my $data (@$pUserData)
+ {
+ print hFile "(void *)$data,\n";
+ }
+
+ # write end tag
+ print hFile "(void *)\"END FEATURE LIST\"};\n";
+
+ close(hFile);
+}
+
+
+#******************************************************************************
+# FUNCTION
+# processCheckDotC
+# DESCRIPTION
+# xxx
+# PARAMETERS
+# xxx
+# RETURNS
+# none
+#******************************************************************************
+sub processCheckDotC()
+{
+ my $infoFilename = "$mcuPath\\build\\$prjName\\log\\info.log";
+ my $defTmpFilename = "$checkMainFilename.def";
+ my $incTmpFilename = "$checkMainFilename.inc";
+ my $compileOptions;
+ my @fileData;
+ my $inSection = 0;
+ my $incPaths = "";
+ my $commonOptions = "";
+
+ my $incFilename;
+ my $count = 0;
+
+ ($compileOptions) = @_;
+
+ # read inc from *.inc
+ foreach my $mod (@includeMod)
+ {
+ $incFilename = "$mcuPath\\make\\$mod\\$mod.inc";
+ open(hFile, "<$incFilename") or die "can't open $incFilename";
+ @fileData = <hFile>;
+ close(hFile);
+
+ foreach my $line (@fileData)
+ {
+ if ($line =~ /(^[^\s]*)([\s]*$)/)
+ {
+ $incPaths = "$incPaths\n-I$mcuPath\\$1";
+ }
+ }
+ }
+
+ foreach my $inc (@addIncPath)
+ {
+ $incPaths = "$incPaths\n-I$mcuPath\\$inc";
+ }
+
+ # read common options and common include path from info.log
+ open(hFile, "<$infoFilename") or die "can't open $infoFilename";
+ @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)
+ {
+ $commonOptions = "$commonOptions\n-D$1";
+ }
+ elsif ($inSection == 2)
+ {
+ my $inc = "$1";
+
+ if ($inc !~ /:/)
+ {
+ $inc = "$mcuPath\\$inc";
+ }
+ $incPaths = "$incPaths\n-I$inc";
+ }
+ }
+ else
+ {
+ $inSection = 0;
+ }
+ }
+ open(hFile, ">$defTmpFilename") or die "can't open $defTmpFilename";
+ print hFile "$commonOptions\n";
+ close(hFile);
+
+ open(hFile, ">$incTmpFilename") or die "can't open $incTmpFilename";
+ print hFile "$incPaths\n";
+ close(hFile);
+
+ open(hFile, ">makeCheck.bat") or die "makeCheck.bat";
+ print hFile "\@echo off\n";
+ print hFile "$compiler $checkMainFilename.c -o $checkMainFilename.obj $compileOptions $VIA $defTmpFilename $VIA $incTmpFilename\n";
+ print hFile "\@echo on\n";
+ close(hFile);
+ system("makeCheck.bat");
+ if ($removeTempFile)
+ {
+ system("del /F /Q makeCheck.bat");
+ system("del /F /Q $defTmpFilename");
+ system("del /F /Q $incTmpFilename");
+ }
+
+ # post-process *.obj
+ open(hFile, "<$checkMainFilename.obj") or die "can't open $checkMainFilename.obj\n";
+ @fileData = <hFile>;
+ close(hFile);
+
+ # remove multi-CR/LF
+ my $tmpStr = join('',@fileData);
+ $tmpStr =~ s/\n([\s]+)\n/\n\n/g;
+ open(hFile, ">$checkMainFilename.obj") or die "can't open $checkMainFilename.obj\n";
+ print hFile $tmpStr;
+ close(hFile);
+}
+
+
+#******************************************************************************
+# FUNCTION
+# checkConfig
+# DESCRIPTION
+# xxx
+# PARAMETERS
+# xxx
+# RETURNS
+# none
+#******************************************************************************
+sub checkConfig()
+{
+ my $switchFilePathname;
+ my $featureHash_ref;
+ my %featureHash_temp = ();
+ my $logname = "";
+ my @fileData;
+ my %cfgHash = ();
+ my @cfgList = ();
+
+ ($switchFilePathname, $featureHash_ref, $logname) = @_;
+ open(hFile, "<$switchFilePathname") or die "can't open $switchFilePathname. $!\n";
+ @fileData = <hFile>;
+ close(hFile);
+
+ open(hFile, ">$logname") or die "can't open $logname:$!\n";
+ $switchFilePathname =~ /.+\\(.+)\./;
+ my $headerfile = $1;
+ if ($IsResult){
+ open(writeRsultValue,">$1_ResultValue.log") or die "Error: $!\n";
+ } else {
+ open(writeOriginalValue,">$1_OriginalValue.log") or die "Error: $!\n";
+ }
+ # generate cfgHash from featureHash
+ while (my ($feature, $value) = each (%{$featureHash_ref}))
+ {
+ $feature =~ s/(^[_]*)|([_]*$)//g;
+
+ $value =~ s/[\s]*//g; # remove empty
+ $value =~ s/(^[\(]*)|([\)]*$)//g; # remove head '(' and tail ')'
+ if ($IsResult){
+ print writeRsultValue "$feature = $value\n";
+ } else {
+ print writeOriginalValue "$feature = $value\n";
+ }
+ $featureHash_temp{$feature} = "$value";
+
+ $cfgHash{$feature} = $value;
+
+ }
+ foreach my $feature (%featureHash_temp){
+ if ($feature =~ /OP_WARNING_(.+)/){
+ if (index($featureHash_temp{$feature},"OPERATOR_CHECK_MESSAGE_ON")>=0){
+ print hFile "$1's value was modified\n";
+ }
+ }
+ }
+
+ close(hFile);
+}
+
+
+#******************************************************************************
+# FUNCTION
+# checkFeatures
+# DESCRIPTION
+# xxx
+# PARAMETERS
+# xxx
+# RETURNS
+# none
+#******************************************************************************
+sub checkFeatures()
+{
+ my $filename; # preprocessed object filename
+ my $pFeatureList; # reference to hash of feature list,
+ # after this call, only contains defined features
+ my $pSortedAllFeatures; # reference to array of sorted all features
+ my $pDefFeatures; # reference to array of defined features
+ my $pUndefFeatures; # reference to array of undefined features
+
+ my @fileData;
+ my $isFeature = 0;
+ my $featureIndex;
+ my $defFeature;
+
+ ($filename, $pFeatureList, $pSortedAllFeatures,
+ $pDefFeatures, $pUndefFeatures) = @_;
+
+ open(hFile, "<$filename") or die "Cannot open $filename. Error:$!\n";
+ @fileData = <hFile>;
+ close(hFile);
+
+ foreach my $line (@fileData)
+ {
+ if ($isFeature)
+ {
+ if ($line =~ /(^\(void \*\)[\s]*)([^,]*)([\s]*,$)/)
+ {
+ $defFeature = $$pSortedAllFeatures[$featureIndex];
+
+ if ($2 eq $defFeature)
+ {
+ # undefined symbols ("_XXX_" shows)
+ # When the symbol was not defined, the obj will show the symbol name directly.
+ # If the symbol name was shown, we know the symbol was not defined.
+ # If the symbol was defined, the evaluated value will be shown.
+ push @$pUndefFeatures, $2;
+
+ # remove it from feature list
+ delete $$pFeatureList{$2};
+ }
+ else
+ {
+ # process defined symbols
+
+ push @$pDefFeatures, $defFeature;
+
+ # update value of feature list
+ $$pFeatureList{$defFeature} = $2;
+ }
+ }
+ # end of feature list
+ elsif ($line =~ /"END FEATURE LIST"}/)
+ {
+ $isFeature = 0;
+ }
+ elsif ($line !~ /^[\s]*$/)
+ {
+ print "[Not Processed] \"$line\"\n";
+ }
+ $featureIndex++;
+ }
+
+ # check if begining of feature list
+ if ($line =~ /feature_check\[\]/)
+ {
+ $isFeature = 1;
+ $featureIndex = 0;
+ }
+ }
+}
+
+
+#******************************************************************************
+# FUNCTION
+# splitFilename
+# DESCRIPTION
+# xxx
+# PARAMETERS
+# $filename [IN] - filename
+# $refSubFilename [OUT] - reference to sub filename, may be NULL
+# RETURNS
+# main filename
+#******************************************************************************
+sub splitFilename()
+{
+ my $filename;
+ my $refSubFilename = "";
+ my $mainFilename = "";
+
+ ($filename, $refSubFilename) = @_;
+
+ if ($filename =~ /([^\s]*)(\.)([^\.]*$)/)
+ {
+ #print "$filename [$1][$3]\n";
+ $mainFilename = "$1";
+ if ($refSubFilename != 0)
+ {
+ $$refSubFilename = "$3";
+ }
+ }
+ return $mainFilename;
+}
+
+