equal
deleted
inserted
replaced
337 char *sa, *sb, *rb; |
337 char *sa, *sb, *rb; |
338 PyObject *result = NULL; |
338 PyObject *result = NULL; |
339 struct line *al, *bl; |
339 struct line *al, *bl; |
340 struct hunk l, *h; |
340 struct hunk l, *h; |
341 int an, bn, len = 0, la, lb, count; |
341 int an, bn, len = 0, la, lb, count; |
|
342 PyThreadState *_save; |
342 |
343 |
343 if (!PyArg_ParseTuple(args, "s#s#:bdiff", &sa, &la, &sb, &lb)) |
344 if (!PyArg_ParseTuple(args, "s#s#:bdiff", &sa, &la, &sb, &lb)) |
344 return NULL; |
345 return NULL; |
345 |
346 |
|
347 _save = PyEval_SaveThread(); |
346 an = splitlines(sa, la, &al); |
348 an = splitlines(sa, la, &al); |
347 bn = splitlines(sb, lb, &bl); |
349 bn = splitlines(sb, lb, &bl); |
348 if (!al || !bl) |
350 if (!al || !bl) |
349 goto nomem; |
351 goto nomem; |
350 |
352 |
359 if (h->a1 != la || h->b1 != lb) |
361 if (h->a1 != la || h->b1 != lb) |
360 len += 12 + bl[h->b1].l - bl[lb].l; |
362 len += 12 + bl[h->b1].l - bl[lb].l; |
361 la = h->a2; |
363 la = h->a2; |
362 lb = h->b2; |
364 lb = h->b2; |
363 } |
365 } |
|
366 PyEval_RestoreThread(_save); |
|
367 _save = NULL; |
364 |
368 |
365 result = PyBytes_FromStringAndSize(NULL, len); |
369 result = PyBytes_FromStringAndSize(NULL, len); |
366 |
370 |
367 if (!result) |
371 if (!result) |
368 goto nomem; |
372 goto nomem; |
383 la = h->a2; |
387 la = h->a2; |
384 lb = h->b2; |
388 lb = h->b2; |
385 } |
389 } |
386 |
390 |
387 nomem: |
391 nomem: |
|
392 if (_save) |
|
393 PyEval_RestoreThread(_save); |
388 free(al); |
394 free(al); |
389 free(bl); |
395 free(bl); |
390 freehunks(l.next); |
396 freehunks(l.next); |
391 return result ? result : PyErr_NoMemory(); |
397 return result ? result : PyErr_NoMemory(); |
392 } |
398 } |