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