]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Scripts/ConvertUni.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Scripts / ConvertUni.py
CommitLineData
3f45c137
JJ
1## @file\r
2# Check a patch for various format issues\r
3#\r
4# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
5#\r
2e351cbe 6# SPDX-License-Identifier: BSD-2-Clause-Patent\r
3f45c137
JJ
7#\r
8\r
9from __future__ import print_function\r
10\r
11VersionNumber = '0.1'\r
12__copyright__ = "Copyright (c) 2015, Intel Corporation All rights reserved."\r
13\r
14import argparse\r
15import codecs\r
16import os\r
17import sys\r
18\r
3f45c137
JJ
19class ConvertOneArg:\r
20 """Converts utf-16 to utf-8 for one command line argument.\r
21\r
22 This could be a single file, or a directory.\r
23 """\r
24\r
25 def __init__(self, utf8, source):\r
26 self.utf8 = utf8\r
27 self.source = source\r
28\r
29 self.ok = True\r
30\r
31 if not os.path.exists(source):\r
32 self.ok = False\r
33 elif os.path.isdir(source):\r
34 for (root, dirs, files) in os.walk(source):\r
35 files = filter(lambda a: a.endswith('.uni'), files)\r
36 for filename in files:\r
37 path = os.path.join(root, filename)\r
38 self.ok &= self.convert_one_file(path)\r
39 if not self.ok:\r
40 break\r
41\r
42 if not self.ok:\r
43 break\r
44 else:\r
45 self.ok &= self.convert_one_file(source)\r
46\r
47 def convert_one_file(self, source):\r
48 if self.utf8:\r
49 new_enc, old_enc = 'utf-8', 'utf-16'\r
50 else:\r
51 new_enc, old_enc = 'utf-16', 'utf-8'\r
52 #\r
53 # Read file\r
54 #\r
55 f = open(source, mode='rb')\r
56 file_content = f.read()\r
57 f.close()\r
58\r
59 #\r
60 # Detect UTF-16 Byte Order Mark at beginning of file.\r
61 #\r
62 bom = (file_content.startswith(codecs.BOM_UTF16_BE) or\r
63 file_content.startswith(codecs.BOM_UTF16_LE))\r
64 if bom != self.utf8:\r
65 print("%s: already %s" % (source, new_enc))\r
66 return True\r
67\r
68 #\r
69 # Decode old string data\r
70 #\r
71 str_content = file_content.decode(old_enc, 'ignore')\r
72\r
73 #\r
74 # Encode new string data\r
75 #\r
76 new_content = str_content.encode(new_enc, 'ignore')\r
77\r
78 #\r
79 # Write converted data back to file\r
80 #\r
81 f = open(source, mode='wb')\r
82 f.write(new_content)\r
83 f.close()\r
84\r
85 print(source + ": converted, size", len(file_content), '=>', len(new_content))\r
86 return True\r
87\r
88\r
89class ConvertUniApp:\r
90 """Converts .uni files between utf-16 and utf-8."""\r
91\r
92 def __init__(self):\r
93 self.parse_options()\r
94 sources = self.args.source\r
95\r
96 self.ok = True\r
97 for patch in sources:\r
98 self.process_one_arg(patch)\r
99\r
100 if self.ok:\r
101 self.retval = 0\r
102 else:\r
103 self.retval = -1\r
104\r
105 def process_one_arg(self, arg):\r
106 self.ok &= ConvertOneArg(self.utf8, arg).ok\r
107\r
108 def parse_options(self):\r
109 parser = argparse.ArgumentParser(description=__copyright__)\r
110 parser.add_argument('--version', action='version',\r
111 version='%(prog)s ' + VersionNumber)\r
112 parser.add_argument('source', nargs='+',\r
113 help='[uni file | directory]')\r
114 group = parser.add_mutually_exclusive_group()\r
115 group.add_argument("--utf-8",\r
116 action="store_true",\r
117 help="Convert from utf-16 to utf-8 [default]")\r
118 group.add_argument("--utf-16",\r
119 action="store_true",\r
120 help="Convert from utf-8 to utf-16")\r
121 self.args = parser.parse_args()\r
122 self.utf8 = not self.args.utf_16\r
123\r
124if __name__ == "__main__":\r
125 sys.exit(ConvertUniApp().retval)\r