mirror of https://github.com/acidanthera/audk.git
133 lines
4.0 KiB
Python
133 lines
4.0 KiB
Python
|
## @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
|
||
|
|
||
|
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)
|