##// END OF EJS Templates
cffi: adjust the list returned by bdiff.blocks to never have a None entry...
Matt Harbison -
r50492:b2666e76 default
parent child Browse files
Show More
@@ -1,83 +1,83 b''
1 # bdiff.py - CFFI implementation of bdiff.c
1 # bdiff.py - CFFI implementation of bdiff.c
2 #
2 #
3 # Copyright 2016 Maciej Fijalkowski <fijall@gmail.com>
3 # Copyright 2016 Maciej Fijalkowski <fijall@gmail.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8
8
9 import struct
9 import struct
10
10
11 from ..pure.bdiff import *
11 from ..pure.bdiff import *
12 from . import _bdiff # pytype: disable=import-error
12 from . import _bdiff # pytype: disable=import-error
13
13
14 ffi = _bdiff.ffi
14 ffi = _bdiff.ffi
15 lib = _bdiff.lib
15 lib = _bdiff.lib
16
16
17
17
18 def blocks(sa, sb):
18 def blocks(sa, sb):
19 a = ffi.new(b"struct bdiff_line**")
19 a = ffi.new(b"struct bdiff_line**")
20 b = ffi.new(b"struct bdiff_line**")
20 b = ffi.new(b"struct bdiff_line**")
21 ac = ffi.new(b"char[]", str(sa))
21 ac = ffi.new(b"char[]", str(sa))
22 bc = ffi.new(b"char[]", str(sb))
22 bc = ffi.new(b"char[]", str(sb))
23 l = ffi.new(b"struct bdiff_hunk*")
23 l = ffi.new(b"struct bdiff_hunk*")
24 try:
24 try:
25 an = lib.bdiff_splitlines(ac, len(sa), a)
25 an = lib.bdiff_splitlines(ac, len(sa), a)
26 bn = lib.bdiff_splitlines(bc, len(sb), b)
26 bn = lib.bdiff_splitlines(bc, len(sb), b)
27 if not a[0] or not b[0]:
27 if not a[0] or not b[0]:
28 raise MemoryError
28 raise MemoryError
29 count = lib.bdiff_diff(a[0], an, b[0], bn, l)
29 count = lib.bdiff_diff(a[0], an, b[0], bn, l)
30 if count < 0:
30 if count < 0:
31 raise MemoryError
31 raise MemoryError
32 rl = [None] * count
32 rl = [(0, 0, 0, 0)] * count
33 h = l.next
33 h = l.next
34 i = 0
34 i = 0
35 while h:
35 while h:
36 rl[i] = (h.a1, h.a2, h.b1, h.b2)
36 rl[i] = (h.a1, h.a2, h.b1, h.b2)
37 h = h.next
37 h = h.next
38 i += 1
38 i += 1
39 finally:
39 finally:
40 lib.free(a[0])
40 lib.free(a[0])
41 lib.free(b[0])
41 lib.free(b[0])
42 lib.bdiff_freehunks(l.next)
42 lib.bdiff_freehunks(l.next)
43 return rl
43 return rl
44
44
45
45
46 def bdiff(sa, sb):
46 def bdiff(sa, sb):
47 a = ffi.new(b"struct bdiff_line**")
47 a = ffi.new(b"struct bdiff_line**")
48 b = ffi.new(b"struct bdiff_line**")
48 b = ffi.new(b"struct bdiff_line**")
49 ac = ffi.new(b"char[]", str(sa))
49 ac = ffi.new(b"char[]", str(sa))
50 bc = ffi.new(b"char[]", str(sb))
50 bc = ffi.new(b"char[]", str(sb))
51 l = ffi.new(b"struct bdiff_hunk*")
51 l = ffi.new(b"struct bdiff_hunk*")
52 try:
52 try:
53 an = lib.bdiff_splitlines(ac, len(sa), a)
53 an = lib.bdiff_splitlines(ac, len(sa), a)
54 bn = lib.bdiff_splitlines(bc, len(sb), b)
54 bn = lib.bdiff_splitlines(bc, len(sb), b)
55 if not a[0] or not b[0]:
55 if not a[0] or not b[0]:
56 raise MemoryError
56 raise MemoryError
57 count = lib.bdiff_diff(a[0], an, b[0], bn, l)
57 count = lib.bdiff_diff(a[0], an, b[0], bn, l)
58 if count < 0:
58 if count < 0:
59 raise MemoryError
59 raise MemoryError
60 rl = []
60 rl = []
61 h = l.next
61 h = l.next
62 la = lb = 0
62 la = lb = 0
63 while h:
63 while h:
64 if h.a1 != la or h.b1 != lb:
64 if h.a1 != la or h.b1 != lb:
65 lgt = (b[0] + h.b1).l - (b[0] + lb).l
65 lgt = (b[0] + h.b1).l - (b[0] + lb).l
66 rl.append(
66 rl.append(
67 struct.pack(
67 struct.pack(
68 b">lll",
68 b">lll",
69 (a[0] + la).l - a[0].l,
69 (a[0] + la).l - a[0].l,
70 (a[0] + h.a1).l - a[0].l,
70 (a[0] + h.a1).l - a[0].l,
71 lgt,
71 lgt,
72 )
72 )
73 )
73 )
74 rl.append(str(ffi.buffer((b[0] + lb).l, lgt)))
74 rl.append(str(ffi.buffer((b[0] + lb).l, lgt)))
75 la = h.a2
75 la = h.a2
76 lb = h.b2
76 lb = h.b2
77 h = h.next
77 h = h.next
78
78
79 finally:
79 finally:
80 lib.free(a[0])
80 lib.free(a[0])
81 lib.free(b[0])
81 lib.free(b[0])
82 lib.bdiff_freehunks(l.next)
82 lib.bdiff_freehunks(l.next)
83 return b"".join(rl)
83 return b"".join(rl)
General Comments 0
You need to be logged in to leave comments. Login now