~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_patiencediff_c.c

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-06-05 04:05:05 UTC
  • mfrom: (3473.1.1 ianc-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20080605040505-i9kqxg2fps2qjdi0
Add the 'alias' command (Tim Penhey)

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#include <string.h>
28
28
#include <Python.h>
29
29
 
30
 
#include "python-compat.h"
 
30
 
 
31
/* http://www.python.org/dev/peps/pep-0353/ */
 
32
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
 
33
typedef int Py_ssize_t;
 
34
#define PY_SSIZE_T_MAX INT_MAX
 
35
#define PY_SSIZE_T_MIN INT_MIN
 
36
#endif
31
37
 
32
38
 
33
39
#if defined(__GNUC__)
535
541
}
536
542
 
537
543
 
538
 
static void
539
 
delete_lines(struct line *lines, Py_ssize_t size)
540
 
{
541
 
    struct line *line = lines;
542
 
    while (size-- > 0) {
543
 
        Py_XDECREF(line->data);
544
 
        line++;
545
 
    }
546
 
    free(lines);
547
 
}
548
 
 
549
 
 
550
544
static Py_ssize_t
551
545
load_lines(PyObject *orig, struct line **lines)
552
546
{
565
559
        return 0;
566
560
    }
567
561
 
568
 
    /* Allocate a memory block for line data, initialized to 0 */
569
 
    line = *lines = (struct line *)calloc(size, sizeof(struct line));
 
562
    line = *lines = (struct line *)malloc(sizeof(struct line) * size);
570
563
    if (line == NULL) {
571
564
        PyErr_NoMemory();
572
565
        Py_DECREF(seq);
575
568
 
576
569
    for (i = 0; i < size; i++) {
577
570
        item = PySequence_Fast_GET_ITEM(seq, i);
578
 
        Py_INCREF(item);
579
571
        line->data = item;
580
572
        line->hash = PyObject_Hash(item);
581
573
        if (line->hash == (-1)) {
589
581
 
590
582
    cleanup:
591
583
    Py_DECREF(seq);
592
 
    if (size == -1) {
593
 
        /* Error -- cleanup unused object references */
594
 
        delete_lines(*lines, i);
595
 
        *lines = NULL;
596
 
    }
597
584
    return size;
598
585
}
599
586
 
646
633
    free(backpointers);
647
634
    free(matches);
648
635
    free(hashtable.table);
649
 
    delete_lines(b, bsize);
650
 
    delete_lines(a, asize);
 
636
    free(b);
 
637
    free(a);
651
638
    return res;
652
639
 
653
640
error:
654
641
    free(backpointers);
655
642
    free(matches);
656
643
    free(hashtable.table);
657
 
    delete_lines(b, bsize);
658
 
    delete_lines(a, asize);
 
644
    free(b);
 
645
    free(a);
659
646
    return NULL;
660
647
}
661
648
 
724
711
    free(backpointers);
725
712
    free(matches.matches);
726
713
    free(hashtable.table);
727
 
    delete_lines(b, bsize);
728
 
    delete_lines(a, asize);
 
714
    free(b);
 
715
    free(a);
729
716
    Py_RETURN_NONE;
730
717
 
731
718
error:
732
719
    free(backpointers);
733
720
    free(matches.matches);
734
721
    free(hashtable.table);
735
 
    delete_lines(b, bsize);
736
 
    delete_lines(a, asize);
 
722
    free(b);
 
723
    free(a);
737
724
    return NULL;
738
725
}
739
726
 
782
769
{
783
770
    free(self->backpointers);
784
771
    free(self->hashtable.table);
785
 
    delete_lines(self->b, self->bsize);
786
 
    delete_lines(self->a, self->asize);
 
772
    free(self->b);
 
773
    free(self->a);
787
774
    self->ob_type->tp_free((PyObject *)self);
788
775
}
789
776