| ## @file | |
| # Check a patch for various format issues | |
| # | |
| # Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> | |
| # | |
| # This program and the accompanying materials are licensed and made | |
| # available under the terms and conditions of the BSD License which | |
| # accompanies this distribution. The full text of the license may be | |
| # found at http://opensource.org/licenses/bsd-license.php | |
| # | |
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" | |
| # BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER | |
| # EXPRESS OR IMPLIED. | |
| # | |
| 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 | |
| try: | |
| from io import StringIO | |
| except ImportError: | |
| from StringIO import StringIO | |
| 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) |