summaryrefslogtreecommitdiff
path: root/BaseTools/Scripts/ConvertUni.py
blob: 2af55dfc670246d117190003367b4f48e8fcb73c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
## @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)