diff --git a/src/sage/combinat/words/automataC.c b/src/sage/combinat/words/automataC.c index 93c7dfaba22..5861a0b845f 100644 --- a/src/sage/combinat/words/automataC.c +++ b/src/sage/combinat/words/automataC.c @@ -79,7 +79,10 @@ void printDict (Dict d) void dictAdd (Dict *d, int e) { d->n++; - d->e = (int *)realloc(d->e, sizeof(int)*d->n); + if (d->n == 1) + d->e = (int *)malloc(sizeof(int)); + else + d->e = (int *)realloc(d->e, sizeof(int)*d->n); if (!d->e) { printf("Out of memory !"); @@ -171,6 +174,7 @@ NAutomaton NewNAutomaton (int n, int na) a.na = na; if (n == 0) { + a.e = NULL; return a; } a.e = (NEtat *)malloc(sizeof(NEtat)*n); @@ -190,7 +194,10 @@ NAutomaton NewNAutomaton (int n, int na) void ReallocNAutomaton (NAutomaton *a, int n) { - a->e = (NEtat*)realloc(a->e, sizeof(NEtat)*n); + if (a->n) + a->e = (NEtat*)realloc(a->e, sizeof(NEtat)*n); + else + a->e = (NEtat*)malloc(sizeof(NEtat)*n); if (a->n < n) { int i; @@ -230,7 +237,10 @@ void ReallocAutomaton (Automaton *a, int n, bool init) free(a->e[i].f); } } - a->e = (Etat*)realloc(a->e, sizeof(Etat)*n); + if (a->n) + a->e = (Etat*)realloc(a->e, sizeof(Etat)*n); + else + a->e = (Etat*)malloc(sizeof(Etat)*n); if (a->n < n) { int i; @@ -873,7 +883,10 @@ void AddEtat (Automaton *a, bool final) { /**/ a->n++; - a->e = (Etat *)realloc(a->e, sizeof(Etat)*a->n); + if (a->n == 1) + a->e = (Etat *)malloc(sizeof(Etat)); + else + a->e = (Etat *)realloc(a->e, sizeof(Etat)*a->n); if (!a->e) { printf("Out of memory !"); @@ -983,7 +996,10 @@ bool AddEl (ListEtats *l, Etats e, int* res) } //ajoute l'élément l->n++; - l->e = (Etats*)realloc(l->e, sizeof(Etats)*l->n); + if (l->n == 1) + l->e = (Etats*)malloc(sizeof(Etats)); + else + l->e = (Etats*)realloc(l->e, sizeof(Etats)*l->n); if (!l->e) { printf("Out of memory !"); @@ -1000,7 +1016,10 @@ void AddEl2 (ListEtats *l, Etats e) { //ajoute l'élément l->n++; - l->e = (Etats*)realloc(l->e, sizeof(Etats)*l->n); + if (l->n == 1) + l->e = (Etats*)malloc(sizeof(Etats)); + else + l->e = (Etats*)realloc(l->e, sizeof(Etats)*l->n); if (!l->e) { printf("Out of memory !"); @@ -1128,19 +1147,25 @@ ListEtats2 NewListEtats2(int n, int na) void ReallocListEtats2(ListEtats2 *l, int n, bool marge) { - l->n = n; if (!marge) { + if (l->na) + l->e = (Etats2*)realloc(l->e, sizeof(Etats2)*n); + else + l->e = (Etats2*)malloc(sizeof(Etats2)*n); l->na = n; - l->e = (Etats2*)realloc(l->e, sizeof(Etats2)*n); }else { if (n > l->na) { - l->na = l->n*2; - l->e = (Etats2*)realloc(l->e, sizeof(Etats2)*l->na); + if (l->na) + l->e = (Etats2*)realloc(l->e, sizeof(Etats2)*n*2); + else + l->e = (Etats2*)malloc(sizeof(Etats2)*n*2); + l->na = n*2; } } + l->n = n; } void FreeListEtats2 (ListEtats2* l) @@ -2047,7 +2072,10 @@ NAutomaton Transpose (Automaton a) { //ajoute une arête de f vers i étiquetée par j r.e[f].n++; - r.e[f].a = (Arete *)realloc(r.e[f].a, sizeof(Arete)*r.e[f].n); + if (r.e[f].n == 1) + r.e[f].a = (Arete *)malloc(sizeof(Arete)); + else + r.e[f].a = (Arete *)realloc(r.e[f].a, sizeof(Arete)*r.e[f].n); r.e[f].a[r.e[f].n-1].l = j; r.e[f].a[r.e[f].n-1].e = i; } diff --git a/src/sage/monoids/beta_adic_monoid.pyx b/src/sage/monoids/beta_adic_monoid.pyx index 87c67bca7f6..4d698ddcf58 100644 --- a/src/sage/monoids/beta_adic_monoid.pyx +++ b/src/sage/monoids/beta_adic_monoid.pyx @@ -256,7 +256,7 @@ cdef extern from "draw.h": void FreeColorList (ColorList l) Color randColor (int a) Automate NewAutomate (int n, int na) - void FreeAutomate(Automate a) + void FreeAutomate(Automate *a) void FreeAutomates(Automate* a, int n) BetaAdic NewBetaAdic (int n) void FreeBetaAdic (BetaAdic b) @@ -878,7 +878,7 @@ class BetaAdicMonoid(Monoid_class): print "Free..." FreeSurface(s) if not isinstance(tss, FastAutomaton): - FreeAutomate(b.a) + FreeAutomate(&b.a) FreeBetaAdic(b) sig_off() @@ -1012,7 +1012,7 @@ class BetaAdicMonoid(Monoid_class): else: for i,a in enumerate(la): if not isinstance(a, FastAutomaton): - FreeAutomate(b.a[i]) + FreeAutomate(&b.a[i]) FreeBetaAdic2(b) FreeColorList(cl) sig_off() diff --git a/src/sage/monoids/draw.c b/src/sage/monoids/draw.c index d77d2e09505..90a059bd441 100644 --- a/src/sage/monoids/draw.c +++ b/src/sage/monoids/draw.c @@ -63,6 +63,12 @@ Automate NewAutomate (int n, int na) Automate a; a.n = n; a.na = na; + a.i = -1; + if (!n) + { + a.e = NULL; + return; + } a.e = (Etat *)malloc(sizeof(Etat)*n); int i, j; for (i=0;in;i++) { - free(a.e[i].f); + free(a->e[i].f); } - free(a.e); + if (a->n) + free(a->e); + a->e = NULL; } void FreeAutomates (Automate* a, int n) @@ -92,7 +100,7 @@ void FreeAutomates (Automate* a, int n) int j; for (j=0;j