]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Scripts/ConvertUni.py
BaseTools/BinToPcd: Follow PEP-8 indent of 4 spaces
[mirror_edk2.git] / BaseTools / Scripts / ConvertUni.py
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
16 from __future__ import print_function
17
18 VersionNumber = '0.1'
19 __copyright__ = "Copyright (c) 2015, Intel Corporation All rights reserved."
20
21 import argparse
22 import codecs
23 import os
24 import sys
25
26 try:
27 from io import StringIO
28 except ImportError:
29 from StringIO import StringIO
30
31 class 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
101 class 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
136 if __name__ == "__main__":
137 sys.exit(ConvertUniApp().retval)