https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Bob Feng <bob.c.feng@intel.com>
		
			
				
	
	
		
			126 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| ## @file
 | |
| #  Check a patch for various format issues
 | |
| #
 | |
| #  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
 | |
| #
 | |
| #  SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| #
 | |
| 
 | |
| from __future__ import print_function
 | |
| 
 | |
| VersionNumber = '0.1'
 | |
| __copyright__ = "Copyright (c) 2015, Intel Corporation  All rights reserved."
 | |
| 
 | |
| import argparse
 | |
| import codecs
 | |
| import os
 | |
| import sys
 | |
| 
 | |
| class ConvertOneArg:
 | |
|     """Converts utf-16 to utf-8 for one command line argument.
 | |
| 
 | |
|        This could be a single file, or a directory.
 | |
|     """
 | |
| 
 | |
|     def __init__(self, utf8, source):
 | |
|         self.utf8 = utf8
 | |
|         self.source = source
 | |
| 
 | |
|         self.ok = True
 | |
| 
 | |
|         if not os.path.exists(source):
 | |
|             self.ok = False
 | |
|         elif os.path.isdir(source):
 | |
|             for (root, dirs, files) in os.walk(source):
 | |
|                 files = filter(lambda a: a.endswith('.uni'), files)
 | |
|                 for filename in files:
 | |
|                     path = os.path.join(root, filename)
 | |
|                     self.ok &= self.convert_one_file(path)
 | |
|                     if not self.ok:
 | |
|                         break
 | |
| 
 | |
|                 if not self.ok:
 | |
|                     break
 | |
|         else:
 | |
|             self.ok &= self.convert_one_file(source)
 | |
| 
 | |
|     def convert_one_file(self, source):
 | |
|         if self.utf8:
 | |
|             new_enc, old_enc = 'utf-8', 'utf-16'
 | |
|         else:
 | |
|             new_enc, old_enc = 'utf-16', 'utf-8'
 | |
|         #
 | |
|         # Read file
 | |
|         #
 | |
|         f = open(source, mode='rb')
 | |
|         file_content = f.read()
 | |
|         f.close()
 | |
| 
 | |
|         #
 | |
|         # Detect UTF-16 Byte Order Mark at beginning of file.
 | |
|         #
 | |
|         bom = (file_content.startswith(codecs.BOM_UTF16_BE) or
 | |
|                file_content.startswith(codecs.BOM_UTF16_LE))
 | |
|         if bom != self.utf8:
 | |
|             print("%s: already %s" % (source, new_enc))
 | |
|             return True
 | |
| 
 | |
|         #
 | |
|         # Decode old string data
 | |
|         #
 | |
|         str_content = file_content.decode(old_enc, 'ignore')
 | |
| 
 | |
|         #
 | |
|         # Encode new string data
 | |
|         #
 | |
|         new_content = str_content.encode(new_enc, 'ignore')
 | |
| 
 | |
|         #
 | |
|         # Write converted data back to file
 | |
|         #
 | |
|         f = open(source, mode='wb')
 | |
|         f.write(new_content)
 | |
|         f.close()
 | |
| 
 | |
|         print(source + ": converted, size", len(file_content), '=>', len(new_content))
 | |
|         return True
 | |
| 
 | |
| 
 | |
| class ConvertUniApp:
 | |
|     """Converts .uni files between utf-16 and utf-8."""
 | |
| 
 | |
|     def __init__(self):
 | |
|         self.parse_options()
 | |
|         sources = self.args.source
 | |
| 
 | |
|         self.ok = True
 | |
|         for patch in sources:
 | |
|             self.process_one_arg(patch)
 | |
| 
 | |
|         if self.ok:
 | |
|             self.retval = 0
 | |
|         else:
 | |
|             self.retval = -1
 | |
| 
 | |
|     def process_one_arg(self, arg):
 | |
|         self.ok &= ConvertOneArg(self.utf8, arg).ok
 | |
| 
 | |
|     def parse_options(self):
 | |
|         parser = argparse.ArgumentParser(description=__copyright__)
 | |
|         parser.add_argument('--version', action='version',
 | |
|                             version='%(prog)s ' + VersionNumber)
 | |
|         parser.add_argument('source', nargs='+',
 | |
|                             help='[uni file | directory]')
 | |
|         group = parser.add_mutually_exclusive_group()
 | |
|         group.add_argument("--utf-8",
 | |
|                            action="store_true",
 | |
|                            help="Convert from utf-16 to utf-8 [default]")
 | |
|         group.add_argument("--utf-16",
 | |
|                            action="store_true",
 | |
|                            help="Convert from utf-8 to utf-16")
 | |
|         self.args = parser.parse_args()
 | |
|         self.utf8 = not self.args.utf_16
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     sys.exit(ConvertUniApp().retval)
 |