public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Liming Gao" <liming.gao@intel.com>
To: "Fan, ZhijuX" <zhijux.fan@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Feng, Bob C" <bob.c.feng@intel.com>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Leif Lindholm <leif.lindholm@linaro.org>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [edk2-platform patch V6] Platform/Intel:Add UniTool into edk2-platforms/Platform/Intel/Tools
Date: Fri, 28 Jun 2019 07:51:04 +0000	[thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E48F185@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <FAD0D7E0AE0FA54D987F6E72435CAFD50AF8532E@SHSMSX101.ccr.corp.intel.com>

Zhiju:
  This version is good to me. Reviewed-by: Liming Gao <liming.gao@intel.com> 

Thanks
Liming
>-----Original Message-----
>From: Fan, ZhijuX
>Sent: Friday, June 28, 2019 2:59 PM
>To: devel@edk2.groups.io
>Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C
><bob.c.feng@intel.com>; Ard Biesheuvel <ard.biesheuvel@linaro.org>; Leif
>Lindholm <leif.lindholm@linaro.org>; Kinney, Michael D
><michael.d.kinney@intel.com>
>Subject: [edk2-platform patch V6] Platform/Intel:Add UniTool into edk2-
>platforms/Platform/Intel/Tools
>
>BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=1855
>
>UniTool is one python script to generate UQI (Universal Question
>Identifier) unicode string for HII question PROMPT string. UQI
>string can be used to identify each HII question.
>The scripts function will sync up UQI definitions with uni files
>based on vfi/vfr/hfr/sd/sdi in the tree.
>
>This script can be run in both Py2 and Py3.
>
>Cc: Liming Gao <liming.gao@intel.com>
>Cc: Bob Feng <bob.c.feng@intel.com>
>Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>Cc: Leif Lindholm <leif.lindholm@linaro.org>
>Cc: Michael D Kinney <michael.d.kinney@intel.com>
>Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
>---
>Updata FileHeader in script
>
> Platform/Intel/Tools/UniTool/README.txt |  41 +++
> Platform/Intel/Tools/UniTool/UniTool.py | 488
>++++++++++++++++++++++++++++++++
> 2 files changed, 529 insertions(+)
> create mode 100644 Platform/Intel/Tools/UniTool/README.txt
> create mode 100644 Platform/Intel/Tools/UniTool/UniTool.py
>
>diff --git a/Platform/Intel/Tools/UniTool/README.txt
>b/Platform/Intel/Tools/UniTool/README.txt
>new file mode 100644
>index 0000000000..69da4aca24
>--- /dev/null
>+++ b/Platform/Intel/Tools/UniTool/README.txt
>@@ -0,0 +1,41 @@
>+
>+How to use UniTool
>+-----------------
>+The usage of the tool is:
>+UniTool.py [-b] [-u] [-l] [-x] [-h] [-d 'rootDirectory1'] [-d 'rootDirectory2'] [-d
>'rootDirectory3']... [-q e|w]
>+           'rootDirectory0' 'uqiFile'|'uqiFileDirectory' ['excludedDirectory1']
>['excludedDirectory2'] ['excludedDirectory3']...
>+
>+Function will sync up UQI definitions with uni files based on vfi/vfr/hfr/sd/sdi
>in the tree.
>+
>+Required Arguments:
>+  'rootdirectory0'       path to root directory
>+  'uqiFileDirectory'     path to UQI file(UqiList.uni)
>+  'uqiFile'              UQI file
>+
>+Options:
>+  -h                    Show this help
>+  -b                    Build option returns error if any new UQI needs assigning
>+                        based on vfi/vfr/hfr/sd/sdi when no -u option is specified
>+  -u                    Create new UQIs that does not already exist in uqiFile for
>+                        any string requiring a UQI based on vfi/vfr/hfr/sd/sdi
>+                        NOTE: 'uqiFile' cannot be readonly!
>+  -l                    Language deletion option (keeps only English and uqi)
>+                        moves all UQIs to 'uqiFile'
>+                        NOTE: Uni files cannot be readonly!
>+  -x                    Exclude 'rootDirectory'/'excludedDirectory1' &
>+                        'rootDirectory'/'excludedDirectory2'... from UQI list build
>+                        NOTE: Cannot be the same as rootDirectory
>+  -d                    Add multiple root directories to process
>+  -q                    Print warning(w) or return error(e) if different HII questions
>+                        are referring same string token
>+
>+Return error if any duplicated UQI string or value in UQI list or if no definition
>+for any string referred by HII question when -b or -u is specified
>+
>+NOTE: Options must be specified before parameters
>+
>+Notice
>+-----------------
>+- "S0000" style will be used if uqiFile needs to be new created.
>+  Use the same uqi style if uqiFile is existed. For example,
>+  if the exist UqiFile use "\x0000" style, "\x0000" will be used.
>diff --git a/Platform/Intel/Tools/UniTool/UniTool.py
>b/Platform/Intel/Tools/UniTool/UniTool.py
>new file mode 100644
>index 0000000000..9b51827cdd
>--- /dev/null
>+++ b/Platform/Intel/Tools/UniTool/UniTool.py
>@@ -0,0 +1,488 @@
>+## @file
>+# generate UQI (Universal Question Identifier) unicode string for HII
>question PROMPT string. UQI string can be used to
>+# identify each HII question.
>+#
>+# Copyright (c) 2019, Intel Corporation. All rights reserved.
>+#
>+# SPDX-License-Identifier: BSD-2-Clause-Patent
>+#
>+
>+import re
>+import sys
>+import os
>+import getopt
>+import codecs
>+import fnmatch
>+import logging
>+import argparse
>+
>+# global variable declarations
>+QuestionError = False
>+FileHeader = '//\r\n//  FILE auto-generated by
>UniTool\r\n//\r\n\r\n#langdef uqi "uqi"\r\n\r\n'
>+UqiList = re.compile('^#string[ \t]+([A-Z_0-
>9]+)[ \t]+#language[ \t]+uqi[ \t\r\n]+"(?:[x\S]{1,2})([0-9a-fA-F]{4,5})"',
>+                     re.M).findall
>+AllUqis = {}
>+StringDict = {}
>+GlobalVarId = {}
>+Options = {}
>+
>+# Version message
>+__prog__ = 'UniTool'
>+__description__ = 'The script generate UQI unicode string for HII question
>PROMPT string.\n'
>+__copyright__ = 'Copyright (c) 2019, Intel Corporation. All rights
>reserved.<BR>'
>+__version__ = '%s Version %s' % (__prog__, '0.1 ')
>+_Usage = "Syntax:  %s [-b] [-u] [-l] [-x] [-h] [-d 'rootDirectory1'] [-d
>'rootDirectory2'] [-d 'rootDirectory3']... \n[-q e|w]" \
>+         "'rootDirectory0' 'uqiFile'|'uqiFileDirectory' ['excludedDirectory1']
>['excludedDirectory2'] ['excludedDirectory3']...\n" \
>+          % (os.path.basename(sys.argv[0]))
>+
>+#
>***********************************************************
>***********
>+# description: Get uni file encoding
>+#
>+# arguments:   Filename - name of uni file
>+#
>+# returns:     utf-8 or utf-16
>+#
>+def GetUniFileEncoding(Filename):
>+    #
>+    # Detect Byte Order Mark at beginning of file.  Default to UTF-8
>+    #
>+    Encoding = 'utf-8'
>+
>+    #
>+    # Read file
>+    #
>+    try:
>+        with open(Filename, mode='rb') as UniFile:
>+            FileIn = UniFile.read()
>+    except:
>+        return Encoding
>+
>+    if (FileIn.startswith(codecs.BOM_UTF16_BE) or
>FileIn.startswith(codecs.BOM_UTF16_LE)):
>+        Encoding = 'utf-16'
>+
>+    return Encoding
>+
>+
>+# rewrite function os.path.walk
>+def Walk(Top, Func, Arg):
>+    try:
>+        Names = os.listdir(Top)
>+    except os.error:
>+        return
>+    Func(Arg, Top, Names)
>+    for Name in Names:
>+        Name = os.path.join(Top, Name)
>+        if os.path.isdir(Name):
>+            Walk(Name, Func, Arg)
>+
>+
>+#
>***********************************************************
>***********
>+# description: Parses commandline arguments and options
>+#              Calls function processUni to build dictionary of strings
>+#              Calls other functions according to user specified options
>+#
>+# arguments:   argv - contains all input from command line
>+#                   - must contain path to root directory
>+#                   - may contain options -h, -u, -l, -b or -x before path
>+#
>+# returns:     none
>+#
>+def main():
>+    ##### Read input arguments and options
>+    global AllUqis, UqiList, QuestionError
>+    parser = argparse.ArgumentParser(prog=__prog__,
>+                                     description=__description__ + __copyright__,
>+                                     usage=_Usage,
>+                                     conflict_handler='resolve')
>+    parser.add_argument('Path', nargs='+',
>+                        help='the path for files to be converted.It could be directory or
>file path.')
>+    parser.add_argument('-v', '--version', action='version',
>version=__version__,
>+                        help="show program's version number and exit")
>+    parser.add_argument('-b', '--build', action='store_true', dest='BuildOption',
>+                        help="Build option returns error if any new UQI needs assigning
>" \
>+                             "based on vfi/vfr/hfr/sd/sdi when no -u option is specified")
>+    parser.add_argument('-u', '--updata', action='store_true',
>dest='UpdateUQIs',
>+                        help="Create new UQIs that does not already exist in uqiFile for"
>\
>+                             "any string requiring a UQI based on vfi/vfr/hfr/sd/sdi" \
>+                             "NOTE: 'uqiFile' cannot be readonly!")
>+    parser.add_argument('-l', '--lang', action='store_true', dest='LangOption',
>+                        help="Language deletion option (keeps only English and uqi)" \
>+                             "moves all UQIs to 'uqiFile', NOTE: Uni files cannot be
>readonly!")
>+    parser.add_argument('-x', '--exclude', action='store_true',
>dest='ExcludeOption',
>+                        help="Exclude 'rootDirectory'/'excludedDirectory1' &" \
>+                             "'rootDirectory'/'excludedDirectory2'... from UQI list build")
>+    parser.add_argument('-d', '--dir', action='append', metavar='FILEDIR',
>dest='DirName',
>+                        help="Add multiple root directories to process")
>+    parser.add_argument('-q', '--question', dest='Question', choices=['w', 'e'],
>+                        help="Print warning(w) or return error(e) if different HII
>questions" \
>+                             "are referring same string token")
>+    Opts = parser.parse_args()
>+    Destname = ''
>+    DirNameList = []
>+    ExDirList = []
>+    if Opts.Path:
>+        DirNameList.append(Opts.Path[0])
>+        Destname = Opts.Path[1]
>+        ExDirList = Opts.Path[2:]
>+    if Opts.DirName:
>+        DirNameList.extend(Opts.DirName)
>+    QuestionOption = Opts.Question
>+    ExcludeOption = Opts.ExcludeOption
>+    BuildOption = Opts.BuildOption
>+    UpdateUQIs = Opts.UpdateUQIs
>+    LangOption = Opts.LangOption
>+    ExPathList = []
>+
>+    if ExDirList:
>+        try:
>+            for EachExDir in ExDirList:
>+                for EachRootDir in DirNameList:
>+                    if EachExDir == EachRootDir:
>+                        print("\nERROR: excludedDirectory is same as rootDirectory\n")
>+                        return
>+                    ExPathList.append(EachRootDir + os.sep + EachExDir)
>+        except:
>+            print(_Usage)
>+            return
>+
>+    global Options
>+    Options = {'Destname': Destname, 'DirNameList': DirNameList, 'ExPathList':
>ExPathList, 'BuildOption': BuildOption,
>+               'UpdateUQIs': UpdateUQIs, 'LangOption': LangOption,
>'ExcludeOption': ExcludeOption,
>+               'QuestionOption': QuestionOption}
>+    print("UQI file: %s" % Destname)
>+    for EachDirName in DirNameList:
>+        Walk(EachDirName, processUni, None)
>+    if QuestionError:
>+        return
>+    if os.path.isdir(Options['Destname']):
>+        DestFileName = Options['Destname'] + os.sep + 'UqiList.uni'
>+    else:
>+        DestFileName = Options['Destname']
>+    if os.path.exists(DestFileName) and (DestFileName not in
>list(AllUqis.keys())):
>+        try:
>+            Encoding = GetUniFileEncoding(DestFileName)
>+            with codecs.open(DestFileName, 'r+', Encoding) as destFile:
>+                DestFileBuffer = destFile.read()
>+        except IOError as e:
>+            print("ERROR: " + e.args[1])
>+            return
>+        AllUqis[DestFileName] = UqiList(DestFileBuffer)
>+    if BuildOption:
>+        ReturnVal = newUqi()
>+        if (ReturnVal == 1):
>+            print('Please fix UQI ERROR(s) above before proceeding.')
>+        else:
>+            print("No UQI issues detected\n")
>+    return
>+
>+
>+#
>***********************************************************
>***********
>+# description: newUqi collects a list of all currently used uqi values in the tree
>+#              Halt build if any duplicated string or value in UQI list.
>+#              If -u option was specified, creates new UQIs that does not
>+#              already exist in uqiFile for any string requiring a UQI.
>+#
>+# arguments:   none
>+#
>+# returns:     0 on success
>+#              1 on error - this should cause the build to halt
>+#
>+
>+Syntax = "S"
>+SyntaxRE = re.compile('#string[ \t]+[A-Z_0-
>9]+[ \t]+#language[ \t]+uqi[ \t\r\n]+"([x\S]{1,2}).*', re.DOTALL).findall
>+
>+
>+def newUqi():
>+    global Options, GlobalVarId, AllUqis, Syntax, SyntaxRE
>+    UqiRange = []
>+    UqiStringList = []
>+    CreateUQI = []
>+    ReturnVal = 0
>+    BaseNumSpaces = 47  # Used to line up the UQI values in the resulting
>uqiFile
>+
>+    # Look for duplication in the current UQIs and collect current range of UQIs
>+    for path in AllUqis.keys():
>+        for UqiString in AllUqis[path]:  # path contains the path and Filename of
>each uni file
>+            # Checks for duplicated strings in UQI list
>+            for TempString in UqiStringList:
>+                if TempString == UqiString[0]:
>+                    print("ERROR: UQI string %s was assigned more than once and will
>cause corruption!" % UqiString[0])
>+                    print("Delete one occurrence of the string and rerun tool.")
>+                    ReturnVal = 1  # halt build
>+
>+            UqiStringList.append(UqiString[0])
>+
>+            # Checks for duplicated UQI values in UQI list
>+            if int(UqiString[1], 16) in UqiRange:
>+                print("ERROR: UQI value %04x was assigned more than once and will
>cause corruption!" % int(UqiString[1],
>+                                                                                                           16))
>+                print("Delete one occurrance of the UQI and rerun tool to create
>alternate value.")
>+                ReturnVal = 1  # halt build
>+            UqiRange.append(int(UqiString[1], 16))
>+
>+    for StringValue in GlobalVarId.keys():
>+        StringFound = False
>+        for path in StringDict.keys():
>+            for UniString in StringDict[path]:  # path contains the path and
>Filename of each uni file
>+                if (StringValue == UniString):
>+                    StringFound = True
>+                    break
>+        if not StringFound:
>+            print("ERROR: No definition for %s referred by HII question" %
>(StringValue))
>+            ReturnVal = 1  # halt build
>+
>+    # Require a UQI for any string in vfr/vfi files
>+    for StringValue in GlobalVarId.keys():
>+        # Ignore strings defined as STRING_TOKEN(0)
>+        if (StringValue != "0"):
>+            # Check if this string already exists in the UQI list
>+            if (StringValue not in UqiStringList) and (StringValue not in CreateUQI):
>+                CreateUQI.append(StringValue)
>+                if not Options['UpdateUQIs']:
>+                    print("ERROR: No UQI for %s referred by HII question" %
>(StringValue))
>+                    ReturnVal = 1  # halt build after printing all error messages
>+
>+    if (ReturnVal == 1):
>+        return ReturnVal
>+
>+    # Update uqiFile with necessary UQIs
>+    if Options['UpdateUQIs'] and CreateUQI:
>+        if os.path.isdir(Options['Destname']):
>+            DestFileName = Options['Destname'] + os.sep + 'UqiList.uni'
>+        else:
>+            DestFileName = Options['Destname']
>+        try:
>+            Encoding = GetUniFileEncoding(DestFileName)
>+            with codecs.open(DestFileName, 'r+', Encoding) as OutputFile:
>+                PlatformUQI = OutputFile.read()
>+        except IOError as e:
>+            print("ERROR: " + e.args[1])
>+            if (e.args[0] == 2):
>+                try:
>+                    with codecs.open(DestFileName, 'w', Encoding) as OutputFile:
>+                        print(DestFileName + " did not exist.  Creating new file.")
>+                        PlatformUQI = FileHeader
>+                except:
>+                    print("Error creating " + DestFileName + ".")
>+                    return 1
>+            if (e.args[1] == "Permission denied"):
>+                print(
>+                    "\n%s is Readonly.  You must uncheck the ReadOnly attibute to run
>the -u option.\n" % DestFileName)
>+                return 1
>+
>+        # Determines and sets the UQI number format
>+        # TODO: there is probably a more elegant way to do this...
>+        SyntaxL = SyntaxRE(PlatformUQI)
>+        if len(SyntaxL) != 0:
>+            Syntax = SyntaxL[0]
>+
>+        # script is reading the file in and writing it back instead of appending
>because the codecs module
>+        # automatically adds a BOM wherever you start writing. This caused build
>failure.
>+        UqiRange.sort()
>+        if (UqiRange == []):
>+            NextUqi = 0
>+        else:
>+            NextUqi = UqiRange[len(UqiRange) - 1] + 1
>+
>+        for StringValue in CreateUQI:
>+            print("%s will be assigned a new UQI value" % StringValue)
>+            UqiRange.append(NextUqi)
>+            #
>+            # Lines up the UQI values in the resulting uqiFile
>+            #
>+            Spaces = " " * (BaseNumSpaces - len(StringValue))
>+            PlatformUQI += '#string %s%s #language uqi \"%s%04x\"\r\n' %
>(StringValue, Spaces, Syntax, NextUqi)
>+            print("#string %s%s #language uqi  \"%s%04X\"" % (StringValue,
>Spaces, Syntax, NextUqi))
>+            NextUqi += 1
>+
>+        with codecs.open(DestFileName, 'r+', Encoding) as OutputFile:
>+            OutputFile.seek(0)
>+            OutputFile.write(PlatformUQI)
>+
>+    return 0
>+
>+
>+#
>***********************************************************
>***********
>+# description: Parses each uni file to collect dictionary of strings
>+#              Removes additional languages and overwrites current uni files
>+#              if -l option was specified
>+#
>+# arguments:   path - directory location of file including file name
>+#              Filename - name of file to be modified
>+#
>+# returns:     error string if failure occurred;
>+#              none if completed sucessfully
>+#
>+# the following are global so that parsefile is quicker
>+
>+FindUniString = re.compile(
>+    '^#string[ \t]+([A-Z_0-9]+)(?:[ \t\r\n]+#language[ \t]+[a-zA-Z-
>]{2,5}[ \t\r\n]+".*"[ \t]*[\r]?[\n]?)*',
>+    re.M).findall
>+
>+OtherLang = re.compile(
>+    '^#string[ \t]+[A-Z_0-9]+(?:[ \t\r\n]+#language[ \t]+[a-zA-Z-
>]{2,5}[ \t\r\n]+".*"[ \t]*[\r]?[\n]?)*', re.M).findall
>+EachLang = re.compile('[ \t\r\n]+#language[ \t]+([a-zA-Z-
>]{2,5})[ \t\r\n]+".*"[ \t]*[\r]?[\n]?').findall
>+
>+UqiStrings = re.compile('^#string[ \t]+[A-Z_0-
>9]+[ \t]+#language[ \t]+uqi[ \t\r\n]+".*"[ \t]*[\r]?[\n]?', re.M)
>+
>+
>+def parsefile(path, Filename):
>+    global Options, StringDict, AllUqis, UqiList, FindUniString, OtherLang,
>EachLang, UqiStrings
>+
>+    FullPath = path + os.sep + Filename
>+
>+    try:
>+        UniEncoding = GetUniFileEncoding(FullPath)
>+        with codecs.open(FullPath, 'r', UniEncoding) as UniFile:
>+            Databuffer = UniFile.read()
>+    except:
>+        print("Error opening " + FullPath + " for reading.")
>+        return
>+    WriteFile = False
>+
>+    if os.path.isdir(Options['Destname']):
>+        DestFileName = Options['Destname'] + os.sep + 'UqiList.uni'
>+    else:
>+        DestFileName = Options['Destname']
>+
>+    if Options['LangOption']:
>+        try:
>+            UqiEncoding = GetUniFileEncoding(DestFileName)
>+            with codecs.open(DestFileName, 'r+', UqiEncoding) as OutputFile:
>+                PlatformUQI = OutputFile.read()
>+        except IOError as e:
>+            print("ERROR: " + e.args[1])
>+            if (e.args[0] == 2):
>+                try:
>+                    with codecs.open(DestFileName, 'w', UqiEncoding) as OutputFile:
>+                        print(DestFileName + " did not exist.  Creating new file.")
>+                        PlatformUQI = FileHeader
>+                except:
>+                    print("Error creating " + DestFileName + ".")
>+                    return
>+            else:
>+                print("Error opening " + DestFileName + " for appending.")
>+                return
>+
>+        if (Filename != DestFileName.split(os.sep)[-1]):
>+            Uqis = re.findall(UqiStrings, Databuffer)
>+            if Uqis:
>+                for Uqi in Uqis:
>+                    PlatformUQI += Uqi
>+                with codecs.open(DestFileName, 'r+', UqiEncoding) as OutputFile:
>+                    OutputFile.seek(0)
>+                    OutputFile.write(PlatformUQI)
>+            Databuffer = re.sub(UqiStrings, '', Databuffer)
>+            if Uqis:
>+                WriteFile = True
>+                print("Deleted uqis from %s" % FullPath)
>+            stringlist = OtherLang(Databuffer)
>+            for stringfound in stringlist:
>+                ThisString = EachLang(stringfound)
>+                for LanguageFound in ThisString:
>+                    if ((LanguageFound != 'en') and (LanguageFound != 'en-US') and
>(LanguageFound != 'eng') and (
>+                            LanguageFound != 'uqi')):
>+                        Databuffer = re.sub(re.escape(stringfound), '', Databuffer)
>+                        WriteFile = True
>+                        print("Deleted %s from %s" % (LanguageFound, FullPath))
>+    if (Filename != DestFileName.split(os.sep)[-1]):
>+        # adding strings to dictionary
>+        StringDict[r'%s' % FullPath] = FindUniString(Databuffer)
>+    # adding UQIs to dictionary
>+    AllUqis[r'%s' % FullPath] = UqiList(Databuffer)
>+
>+    if WriteFile:
>+        try:
>+            with codecs.open(FullPath, 'w', UniEncoding) as UniFile:
>+                UniFile.write(Databuffer)
>+        except:
>+            print("Error opening " + FullPath + " for writing.")
>+    return
>+
>+
>+#
>***********************************************************
>***********
>+# description: Searches tree for uni files
>+#              Calls parsefile to collect dictionary of strings in each uni file
>+#              Calls searchVfiFile for each vfi or vfr file found
>+#
>+# arguments:   argument list is built by os.path.walk function call
>+#              arg     - None
>+#              dirname - directory location of files
>+#              names   - specific files to search in directory
>+#
>+# returns:     none
>+#
>+def processUni(args, dirname, names):
>+    global Options
>+    # Remove excludedDirectory
>+    if Options['ExcludeOption']:
>+        for EachExDir in Options['ExPathList']:
>+            for dir in names:
>+                if os.path.join(dirname, dir) == EachExDir:
>+                    names.remove(dir)
>+
>+    for entry in names:
>+        FullPath = dirname + os.sep + entry
>+        if fnmatch.fnmatch(FullPath, '*.uni'):
>+            parsefile(dirname, entry)
>+        if fnmatch.fnmatch(FullPath, '*.vf*'):
>+            searchVfiFile(FullPath)
>+        if fnmatch.fnmatch(FullPath, '*.sd'):
>+            searchVfiFile(FullPath)
>+        if fnmatch.fnmatch(FullPath, '*.sdi'):
>+            searchVfiFile(FullPath)
>+        if fnmatch.fnmatch(FullPath, '*.hfr'):
>+            searchVfiFile(FullPath)
>+    return
>+
>+
>+#
>***********************************************************
>***********
>+# description: Compose a dictionary of all strings that may need UQIs
>assigned
>+#              to them and key is the string
>+#
>+# arguments:   Filename - name of file to search for strings
>+#
>+# returns:     none
>+#
>+
>+# separate regexes for readability
>+StringGroups = re.compile(
>+
>'^[ \t]*(?:oneof|numeric|checkbox|orderedlist)[ \t]+varid.+?(?:endoneof|e
>ndnumeric|endcheckbox|endorderedlist);',
>+    re.DOTALL | re.M).findall
>+StringVarIds = re.compile(
>+    '[ \t]*(?:oneof|numeric|checkbox|orderedlist)[ \t]+varid[ \t]*=[ \t]*([a-
>zA-Z_0-9]+\.[a-zA-Z_0-9]+)').findall
>+StringTokens = re.compile('prompt[ \t]*=[ \t]*STRING_TOKEN[ \t]*\(([a-zA-
>Z_0-9]+)\)').findall
>+
>+
>+def searchVfiFile(Filename):
>+    global Options, GlobalVarId, StringGroups, StringVarIds, StringTokens,
>QuestionError
>+    try:
>+        with open(Filename, 'r') as VfiFile:
>+            Databuffer = VfiFile.read()
>+
>+        # Finds specified lines in file
>+        VfiStringGroup = StringGroups(Databuffer)
>+
>+        # Searches for prompts within specified lines
>+        for EachGroup in VfiStringGroup:
>+            for EachString in StringTokens(EachGroup):
>+                # Ignore strings defined as STRING_TOKEN(0),
>STRING_TOKEN(STR_EMPTY) or STRING_TOKEN(STR_NULL)
>+                if (EachString != "0") and (EachString != "STR_EMPTY") and
>(EachString != "STR_NULL"):
>+                    if EachString not in GlobalVarId:
>+                        GlobalVarId[EachString] = StringVarIds(EachGroup)
>+                    else:
>+                        if (GlobalVarId[EachString][0] != StringVarIds(EachGroup)[0]):
>+                            if Options['QuestionOption']:
>+                                if Options['QuestionOption'] == "e":
>+                                    QuestionError = True
>+                                    print("ERROR:"),
>+                                if Options['QuestionOption'] == "w":
>+                                    print("WARNING:"),
>+                                print("%s referred by different HII questions(%s and %s)" % (
>+                                    EachString, GlobalVarId[EachString][0],
>StringVarIds(EachGroup)[0]))
>+    except:
>+        print("Error opening file at %s for reading." % Filename)
>+
>+
>+if __name__ == '__main__':
>+    sys.exit(main())
>--
>2.14.1.windows.1


  reply	other threads:[~2019-06-28  7:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-28  6:58 [edk2-platform patch V6] Platform/Intel:Add UniTool into edk2-platforms/Platform/Intel/Tools Fan, ZhijuX
2019-06-28  7:51 ` Liming Gao [this message]
2019-06-28  7:53 ` Bob Feng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E48F185@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox