mercurial/pure/bdiff.py
changeset 29834 1ea77b75d266
parent 29833 a8933d992a71
child 30042 d24e03da24b5
equal deleted inserted replaced
29833:a8933d992a71 29834:1ea77b75d266
   111         def blocks(sa, sb):
   111         def blocks(sa, sb):
   112             a = ffi.new("struct bdiff_line**")
   112             a = ffi.new("struct bdiff_line**")
   113             b = ffi.new("struct bdiff_line**")
   113             b = ffi.new("struct bdiff_line**")
   114             ac = ffi.new("char[]", sa)
   114             ac = ffi.new("char[]", sa)
   115             bc = ffi.new("char[]", sb)
   115             bc = ffi.new("char[]", sb)
       
   116             l = ffi.new("struct bdiff_hunk*")
   116             try:
   117             try:
   117                 an = lib.bdiff_splitlines(ac, len(sa), a)
   118                 an = lib.bdiff_splitlines(ac, len(sa), a)
   118                 bn = lib.bdiff_splitlines(bc, len(sb), b)
   119                 bn = lib.bdiff_splitlines(bc, len(sb), b)
   119                 if not a[0] or not b[0]:
   120                 if not a[0] or not b[0]:
   120                     raise MemoryError
   121                     raise MemoryError
   121                 l = ffi.new("struct bdiff_hunk*")
       
   122                 count = lib.bdiff_diff(a[0], an, b[0], bn, l)
   122                 count = lib.bdiff_diff(a[0], an, b[0], bn, l)
   123                 if count < 0:
   123                 if count < 0:
   124                     raise MemoryError
   124                     raise MemoryError
   125                 rl = [None] * count
   125                 rl = [None] * count
   126                 h = l.next
   126                 h = l.next
   132             finally:
   132             finally:
   133                 lib.free(a[0])
   133                 lib.free(a[0])
   134                 lib.free(b[0])
   134                 lib.free(b[0])
   135                 lib.bdiff_freehunks(l.next)
   135                 lib.bdiff_freehunks(l.next)
   136             return rl
   136             return rl
       
   137 
       
   138         def bdiff(sa, sb):
       
   139             a = ffi.new("struct bdiff_line**")
       
   140             b = ffi.new("struct bdiff_line**")
       
   141             ac = ffi.new("char[]", sa)
       
   142             bc = ffi.new("char[]", sb)
       
   143             l = ffi.new("struct bdiff_hunk*")
       
   144             try:
       
   145                 an = lib.bdiff_splitlines(ac, len(sa), a)
       
   146                 bn = lib.bdiff_splitlines(bc, len(sb), b)
       
   147                 if not a[0] or not b[0]:
       
   148                     raise MemoryError
       
   149                 count = lib.bdiff_diff(a[0], an, b[0], bn, l)
       
   150                 if count < 0:
       
   151                     raise MemoryError
       
   152                 rl = []
       
   153                 h = l.next
       
   154                 la = lb = 0
       
   155                 while h:
       
   156                     if h.a1 != la or h.b1 != lb:
       
   157                         lgt = (b[0] + h.b1).l - (b[0] + lb).l
       
   158                         rl.append(struct.pack(">lll", (a[0] + la).l - a[0].l,
       
   159                             (a[0] + h.a1).l - a[0].l, lgt))
       
   160                         rl.append(str(ffi.buffer((b[0] + lb).l, lgt)))
       
   161                     la = h.a2
       
   162                     lb = h.b2
       
   163                     h = h.next
       
   164 
       
   165             finally:
       
   166                 lib.free(a[0])
       
   167                 lib.free(b[0])
       
   168                 lib.bdiff_freehunks(l.next)
       
   169             return "".join(rl)