audk/BaseTools/Scripts/ConvertUni.py

138 lines
4.1 KiB
Python
Executable File

## @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)