1*2c7292dcSBram Moolenaar#!/usr/bin/python
2*2c7292dcSBram Moolenaar# -*- coding: utf-8 -*-
3*2c7292dcSBram Moolenaar
4*2c7292dcSBram Moolenaar# Test program for :make, :grep and :cgetfile.
5*2c7292dcSBram Moolenaar
6*2c7292dcSBram Moolenaarfrom __future__ import print_function, unicode_literals
7*2c7292dcSBram Moolenaarimport locale
8*2c7292dcSBram Moolenaarimport io
9*2c7292dcSBram Moolenaarimport sys
10*2c7292dcSBram Moolenaar
11*2c7292dcSBram Moolenaardef set_output_encoding(enc=None):
12*2c7292dcSBram Moolenaar    """Set the encoding of stdout and stderr
13*2c7292dcSBram Moolenaar
14*2c7292dcSBram Moolenaar    arguments:
15*2c7292dcSBram Moolenaar      enc -- Encoding name.
16*2c7292dcSBram Moolenaar             If omitted, locale.getpreferredencoding() is used.
17*2c7292dcSBram Moolenaar    """
18*2c7292dcSBram Moolenaar    if enc is None:
19*2c7292dcSBram Moolenaar        enc = locale.getpreferredencoding()
20*2c7292dcSBram Moolenaar
21*2c7292dcSBram Moolenaar    def get_text_writer(fo, **kwargs):
22*2c7292dcSBram Moolenaar        kw = dict(kwargs)
23*2c7292dcSBram Moolenaar        kw.setdefault('errors', 'backslashreplace') # use \uXXXX style
24*2c7292dcSBram Moolenaar        kw.setdefault('closefd', False)
25*2c7292dcSBram Moolenaar
26*2c7292dcSBram Moolenaar        if sys.version_info[0] < 3:
27*2c7292dcSBram Moolenaar            # Work around for Python 2.x
28*2c7292dcSBram Moolenaar            # New line conversion isn't needed here. Done in somewhere else.
29*2c7292dcSBram Moolenaar            writer = io.open(fo.fileno(), mode='w', newline='', **kw)
30*2c7292dcSBram Moolenaar            write = writer.write    # save the original write() function
31*2c7292dcSBram Moolenaar            enc = locale.getpreferredencoding()
32*2c7292dcSBram Moolenaar            def convwrite(s):
33*2c7292dcSBram Moolenaar                if isinstance(s, bytes):
34*2c7292dcSBram Moolenaar                    write(s.decode(enc))    # convert to unistr
35*2c7292dcSBram Moolenaar                else:
36*2c7292dcSBram Moolenaar                    write(s)
37*2c7292dcSBram Moolenaar                try:
38*2c7292dcSBram Moolenaar                    writer.flush()  # needed on Windows
39*2c7292dcSBram Moolenaar                except IOError:
40*2c7292dcSBram Moolenaar                    pass
41*2c7292dcSBram Moolenaar            writer.write = convwrite
42*2c7292dcSBram Moolenaar        else:
43*2c7292dcSBram Moolenaar            writer = io.open(fo.fileno(), mode='w', **kw)
44*2c7292dcSBram Moolenaar        return writer
45*2c7292dcSBram Moolenaar
46*2c7292dcSBram Moolenaar    sys.stdout = get_text_writer(sys.stdout, encoding=enc)
47*2c7292dcSBram Moolenaar    sys.stderr = get_text_writer(sys.stderr, encoding=enc)
48*2c7292dcSBram Moolenaar
49*2c7292dcSBram Moolenaar
50*2c7292dcSBram Moolenaardef main():
51*2c7292dcSBram Moolenaar    enc = 'utf-8'
52*2c7292dcSBram Moolenaar    if len(sys.argv) > 1:
53*2c7292dcSBram Moolenaar        enc = sys.argv[1]
54*2c7292dcSBram Moolenaar    set_output_encoding(enc)
55*2c7292dcSBram Moolenaar
56*2c7292dcSBram Moolenaar    message_tbl = {
57*2c7292dcSBram Moolenaar            'utf-8': 'ÀÈÌÒÙ こんにちは 你好',
58*2c7292dcSBram Moolenaar            'latin1': 'ÀÈÌÒÙ',
59*2c7292dcSBram Moolenaar            'cp932': 'こんにちは',
60*2c7292dcSBram Moolenaar            'cp936': '你好',
61*2c7292dcSBram Moolenaar            }
62*2c7292dcSBram Moolenaar
63*2c7292dcSBram Moolenaar    print('Xfoobar.c(10) : %s (%s)' % (message_tbl[enc], enc))
64*2c7292dcSBram Moolenaar
65*2c7292dcSBram Moolenaar
66*2c7292dcSBram Moolenaarif __name__ == "__main__":
67*2c7292dcSBram Moolenaar    main()
68