Mercurial > hg
view mercurial/cffi/mpatch.py @ 40396:973ff03d9bc0
exewrapper: convert to _tcsxxx functions for Unicode compatability
This fixes more than 50 tests on py3 on Windows when enabled, mostly hooks and
such that invoked `hg` directly. 187 left to go.
I skipped doing the abort printing with Unicode because of apparent issues with
MinGW [1]. It may be moot though, as MinGW isn't listed as a supported compiler
after 3.4 [2].
[1] https://stackoverflow.com/questions/17700797/printf-wprintf-s-s-ls-char-and-wchar-errors-not-announced-by-a-compil
[2] https://wiki.python.org/moin/WindowsCompilers
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Fri, 19 Oct 2018 18:32:13 -0400 |
parents | 857876ebaed4 |
children | 2372284d9457 |
line wrap: on
line source
# mpatch.py - CFFI implementation of mpatch.c # # Copyright 2016 Maciej Fijalkowski <fijall@gmail.com> # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from __future__ import absolute_import from ..pure.mpatch import * from ..pure.mpatch import mpatchError # silence pyflakes from . import _mpatch ffi = _mpatch.ffi lib = _mpatch.lib @ffi.def_extern() def cffi_get_next_item(arg, pos): all, bins = ffi.from_handle(arg) container = ffi.new("struct mpatch_flist*[1]") to_pass = ffi.new("char[]", str(bins[pos])) all.append(to_pass) r = lib.mpatch_decode(to_pass, len(to_pass) - 1, container) if r < 0: return ffi.NULL return container[0] def patches(text, bins): lgt = len(bins) all = [] if not lgt: return text arg = (all, bins) patch = lib.mpatch_fold(ffi.new_handle(arg), lib.cffi_get_next_item, 0, lgt) if not patch: raise mpatchError("cannot decode chunk") outlen = lib.mpatch_calcsize(len(text), patch) if outlen < 0: lib.mpatch_lfree(patch) raise mpatchError("inconsistency detected") buf = ffi.new("char[]", outlen) if lib.mpatch_apply(buf, text, len(text), patch) < 0: lib.mpatch_lfree(patch) raise mpatchError("error applying patches") res = ffi.buffer(buf, outlen)[:] lib.mpatch_lfree(patch) return res