1## @file 2# Check a patch for various format issues 3# 4# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR> 5# 6# This program and the accompanying materials are licensed and made 7# available under the terms and conditions of the BSD License which 8# accompanies this distribution. The full text of the license may be 9# found at http://opensource.org/licenses/bsd-license.php 10# 11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" 12# BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 13# EXPRESS OR IMPLIED. 14# 15 16from __future__ import print_function 17 18VersionNumber = '0.1' 19__copyright__ = "Copyright (c) 2015, Intel Corporation All rights reserved." 20 21import argparse 22import codecs 23import os 24import sys 25 26try: 27 from io import StringIO 28except ImportError: 29 from StringIO import StringIO 30 31class ConvertOneArg: 32 """Converts utf-16 to utf-8 for one command line argument. 33 34 This could be a single file, or a directory. 35 """ 36 37 def __init__(self, utf8, source): 38 self.utf8 = utf8 39 self.source = source 40 41 self.ok = True 42 43 if not os.path.exists(source): 44 self.ok = False 45 elif os.path.isdir(source): 46 for (root, dirs, files) in os.walk(source): 47 files = filter(lambda a: a.endswith('.uni'), files) 48 for filename in files: 49 path = os.path.join(root, filename) 50 self.ok &= self.convert_one_file(path) 51 if not self.ok: 52 break 53 54 if not self.ok: 55 break 56 else: 57 self.ok &= self.convert_one_file(source) 58 59 def convert_one_file(self, source): 60 if self.utf8: 61 new_enc, old_enc = 'utf-8', 'utf-16' 62 else: 63 new_enc, old_enc = 'utf-16', 'utf-8' 64 # 65 # Read file 66 # 67 f = open(source, mode='rb') 68 file_content = f.read() 69 f.close() 70 71 # 72 # Detect UTF-16 Byte Order Mark at beginning of file. 73 # 74 bom = (file_content.startswith(codecs.BOM_UTF16_BE) or 75 file_content.startswith(codecs.BOM_UTF16_LE)) 76 if bom != self.utf8: 77 print("%s: already %s" % (source, new_enc)) 78 return True 79 80 # 81 # Decode old string data 82 # 83 str_content = file_content.decode(old_enc, 'ignore') 84 85 # 86 # Encode new string data 87 # 88 new_content = str_content.encode(new_enc, 'ignore') 89 90 # 91 # Write converted data back to file 92 # 93 f = open(source, mode='wb') 94 f.write(new_content) 95 f.close() 96 97 print(source + ": converted, size", len(file_content), '=>', len(new_content)) 98 return True 99 100 101class ConvertUniApp: 102 """Converts .uni files between utf-16 and utf-8.""" 103 104 def __init__(self): 105 self.parse_options() 106 sources = self.args.source 107 108 self.ok = True 109 for patch in sources: 110 self.process_one_arg(patch) 111 112 if self.ok: 113 self.retval = 0 114 else: 115 self.retval = -1 116 117 def process_one_arg(self, arg): 118 self.ok &= ConvertOneArg(self.utf8, arg).ok 119 120 def parse_options(self): 121 parser = argparse.ArgumentParser(description=__copyright__) 122 parser.add_argument('--version', action='version', 123 version='%(prog)s ' + VersionNumber) 124 parser.add_argument('source', nargs='+', 125 help='[uni file | directory]') 126 group = parser.add_mutually_exclusive_group() 127 group.add_argument("--utf-8", 128 action="store_true", 129 help="Convert from utf-16 to utf-8 [default]") 130 group.add_argument("--utf-16", 131 action="store_true", 132 help="Convert from utf-8 to utf-16") 133 self.args = parser.parse_args() 134 self.utf8 = not self.args.utf_16 135 136if __name__ == "__main__": 137 sys.exit(ConvertUniApp().retval) 138