author | Boris Feld <boris.feld@octobus.net> |
Fri, 27 Jul 2018 19:09:41 +0200 | |
changeset 39120 | 8f83a953dddf |
parent 33572 | 857876ebaed4 |
child 43076 | 2372284d9457 |
permissions | -rw-r--r-- |
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
1 |
# mpatch.py - CFFI implementation of mpatch.c |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
2 |
# |
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
3 |
# Copyright 2016 Maciej Fijalkowski <fijall@gmail.com> |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
4 |
# |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
7775
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
10263 | 6 |
# GNU General Public License version 2 or any later version. |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
7 |
|
27337
9a17576103a4
mpatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
16683
diff
changeset
|
8 |
from __future__ import absolute_import |
9a17576103a4
mpatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
16683
diff
changeset
|
9 |
|
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
10 |
from ..pure.mpatch import * |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
11 |
from ..pure.mpatch import mpatchError # silence pyflakes |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
12 |
from . import _mpatch |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
13 |
|
32545
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
14 |
ffi = _mpatch.ffi |
0e8b0b9a7acc
cffi: split modules from pure
Yuya Nishihara <yuya@tcha.org>
parents:
32539
diff
changeset
|
15 |
lib = _mpatch.lib |
7699
fac054f84600
pure Python implementation of mpatch.c
Martin Geisler <mg@daimi.au.dk>
parents:
diff
changeset
|
16 |
|
32546
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
17 |
@ffi.def_extern() |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
18 |
def cffi_get_next_item(arg, pos): |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
19 |
all, bins = ffi.from_handle(arg) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
20 |
container = ffi.new("struct mpatch_flist*[1]") |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
21 |
to_pass = ffi.new("char[]", str(bins[pos])) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
22 |
all.append(to_pass) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
23 |
r = lib.mpatch_decode(to_pass, len(to_pass) - 1, container) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
24 |
if r < 0: |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
25 |
return ffi.NULL |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
26 |
return container[0] |
29709
f2846d546645
mpatch: write a cffi version of mpatch.patches
Maciej Fijalkowski <fijall@gmail.com>
parents:
28861
diff
changeset
|
27 |
|
32546
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
28 |
def patches(text, bins): |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
29 |
lgt = len(bins) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
30 |
all = [] |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
31 |
if not lgt: |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
32 |
return text |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
33 |
arg = (all, bins) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
34 |
patch = lib.mpatch_fold(ffi.new_handle(arg), |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
35 |
lib.cffi_get_next_item, 0, lgt) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
36 |
if not patch: |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
37 |
raise mpatchError("cannot decode chunk") |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
38 |
outlen = lib.mpatch_calcsize(len(text), patch) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
39 |
if outlen < 0: |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
40 |
lib.mpatch_lfree(patch) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
41 |
raise mpatchError("inconsistency detected") |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
42 |
buf = ffi.new("char[]", outlen) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
43 |
if lib.mpatch_apply(buf, text, len(text), patch) < 0: |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
44 |
lib.mpatch_lfree(patch) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
45 |
raise mpatchError("error applying patches") |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
46 |
res = ffi.buffer(buf, outlen)[:] |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
47 |
lib.mpatch_lfree(patch) |
25b37900d6e0
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org>
parents:
32545
diff
changeset
|
48 |
return res |