srcanamdw/codescanner/BuildParser.py
changeset 1 22878952f6e2
equal deleted inserted replaced
0:509e4801c378 1:22878952f6e2
       
     1 # #################################################################
       
     2 # Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # 
       
     5 # Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
       
     6 # 
       
     7 # * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
       
     8 # * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
       
     9 # * Neither the name of Nokia Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
       
    10 # 
       
    11 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
       
    12 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 
       
    13 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
       
    14 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
       
    15 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#
       
    16 #
       
    17 # #################################################################
       
    18 
       
    19 import os
       
    20 import getopt
       
    21 import string
       
    22 import sys
       
    23 import re
       
    24 
       
    25 def usage(code, msg=""):
       
    26     print msg
       
    27     print "Usage: Buildparser.py -h -s <script dir> -m <main file> -o <output dir/file> -v <version text>"
       
    28     print 
       
    29     print "options:"
       
    30     print "     -h  command help"
       
    31     print "     -s  script dir is the directory containing python subscripts"
       
    32     print "     -m  main file is the file which contains main() function"
       
    33     print "     -o  output dir/file is the directory (and file) for output result"
       
    34     print "     -v  version text indicates within scripts which fractions to copy"
       
    35     print "         into resultant script"
       
    36     print "     -l  localised filename"
       
    37     print
       
    38     sys.exit(code)
       
    39 
       
    40 class CFileScanner:
       
    41 
       
    42     # Main scan file
       
    43     def startscan(self):
       
    44         # Default output file name is Resultant.py
       
    45         if os.path.isdir(output):
       
    46             resultantfile = open(output+"\Resultant.py", "w")
       
    47         else:
       
    48             resultantfile = open(output, "w")
       
    49 
       
    50         # Parse main file from begin to '#!PARSE' tag (copy appropriate lines to resultant file)
       
    51         # and store/parse remaining lines (lines after '#!Parse') into an array
       
    52         # scanfile is in use to scan script files. Here is in use to scan main file! (exception)
       
    53         storelines=self.scanfile(mainfile,resultantfile)
       
    54         # Parse other script files(copy appropriate lines to resultant file)
       
    55         self.traverse(scriptdir,resultantfile)
       
    56         # Flush remaining lines from main file (array) to resultant file
       
    57         self.FlushMainFile(resultantfile,storelines)
       
    58 
       
    59         resultantfile.close()
       
    60     # Flush
       
    61     def FlushMainFile(self,resultantfile,storelines):
       
    62         for line in storelines:
       
    63             resultantfile.write(line)
       
    64 
       
    65     def InsertFile( self, aResultantfile, aFilename ):
       
    66         # inserts a file without preparsing - for example localised text
       
    67         fileToInsert = open( aFilename, "r" )
       
    68         fileToInsertContent = fileToInsert.readlines()
       
    69 
       
    70         for fileToInsertLine in fileToInsertContent:
       
    71             aResultantfile.write( fileToInsertLine )
       
    72         
       
    73         fileToInsert.close()
       
    74 
       
    75 
       
    76     def scanfile(self,fullfilename,resultantfile):
       
    77         storelines=""
       
    78         ParseDelimiter=False
       
    79         # Copy by default (All lines will be copied which are not within tags)
       
    80         CopyIndicator=True
       
    81         sourcefile = open(fullfilename,"r")
       
    82         filelines = sourcefile.readlines()
       
    83         for line in filelines:
       
    84             delimiter=line.find("#!PARSE")
       
    85             # Parse to delimiter (#!PARSE)
       
    86             if (delimiter<>-1):
       
    87                 ParseDelimiter=True
       
    88 
       
    89             if( -1 <> line.find( "#!LOCALISEHERE" ) ):
       
    90                 self.InsertFile( resultantfile, localiseFilename )
       
    91                 
       
    92             
       
    93                 
       
    94             # Find begining tag
       
    95             delimiter=line.find("#<<")
       
    96             if (delimiter<>-1):
       
    97                 # Version (tag) text not found. Don't copy additional lines
       
    98                 if (line.find(version,delimiter+3,delimiter+3+len(version))==-1):
       
    99                     CopyIndicator=False
       
   100                 else:
       
   101                     # Found given version, copy lines
       
   102                     CopyIndicator=True
       
   103 
       
   104             # Find ending tag
       
   105             reMethod = re.compile("#.*>>")
       
   106             delimiter = reMethod.search(line)
       
   107             if (delimiter):
       
   108                 # End of previous version block declaration
       
   109                 if (not CopyIndicator):
       
   110                     # If previous version block was not copied, skip '# >>' (don't write this tag to resultant file)
       
   111                     CopyIndicator=True
       
   112                     continue
       
   113                 else:
       
   114                     CopyIndicator=True
       
   115 
       
   116             # Haven't reached '#!Parse' delimiter so copy current line to resultant file
       
   117             if (not ParseDelimiter):
       
   118                 # Copy indicator is still working
       
   119                 if (CopyIndicator):
       
   120                     resultantfile.write(line)
       
   121             else:
       
   122                 if (CopyIndicator):
       
   123                     # Store lines after '#!PARSE'
       
   124                     storelines=storelines+line
       
   125 
       
   126         resultantfile.write("\n")                
       
   127         sourcefile.close()
       
   128         return storelines
       
   129 
       
   130     # Searching subdirectories and files
       
   131     def traverse(self, currentdir,resultantfile):
       
   132         contents = os.listdir(currentdir)
       
   133         for entry in contents:
       
   134             fullfilename = os.path.normpath(os.path.join(currentdir, entry))
       
   135             if os.path.isdir(fullfilename):
       
   136                 self.traverse(fullfilename,resultantfile)
       
   137             else:
       
   138                 # Scan file if it is not the main file and it is python file
       
   139                 if (fullfilename.upper().find((mainfile[mainfile.rfind("\\")+1:]).upper())==-1 and fullfilename.upper()[-3:]==".PY"):
       
   140                     self.scanfile(fullfilename,resultantfile)
       
   141 
       
   142 #
       
   143 # main
       
   144 #
       
   145 opts, args = getopt.getopt(sys.argv[1:], "hs:m:o:v:l:", ["help", "scriptdir=", "mainfile=", "output=","version=","localisefile="])
       
   146 
       
   147 storelines=""
       
   148 scriptdir=""
       
   149 mainfile=""
       
   150 output=""
       
   151 version=0
       
   152 localiseFilename=""
       
   153 
       
   154 for o, a in opts:
       
   155     if o in ("-h", "--help"):
       
   156         usage(0)
       
   157     if o in ("-s", "--scriptdir"):
       
   158         scriptdir = a
       
   159     if o in ("-m", "--mainfile"):
       
   160         mainfile = a
       
   161     if o in ("-o", "--output"):
       
   162         output = a
       
   163     if o in ("-v", "--version"):
       
   164         version = a
       
   165     if o in ("-l", "--localisefile"):
       
   166         localiseFilename = a
       
   167 
       
   168 if (scriptdir=="" or mainfile=="" or output=="" or version==0 or localiseFilename=="" ):
       
   169     usage(1)
       
   170 
       
   171 scanner = CFileScanner()
       
   172 scanner.startscan()