From ba81e21197de3bccc33050028383f6ef14a96b09 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Sat, 21 Mar 2020 11:51:18 +0100 Subject: [PATCH] rcheckn: rcheck plus freeing allocated memory --- src/include/ngspice/complex.h | 5 ++++- src/maths/cmaths/cmath3.c | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/include/ngspice/complex.h b/src/include/ngspice/complex.h index 9ed79eac7..2963b0ce2 100644 --- a/src/include/ngspice/complex.h +++ b/src/include/ngspice/complex.h @@ -76,7 +76,10 @@ typedef struct { #define rcheck(cond, name) if (!(cond)) { \ fprintf(cp_err, "Error: argument out of range for %s\n", name); \ return (NULL); } - +#define rcheckn(cond, name, clean) if (!(cond)) { \ + fprintf(cp_err, "Error: argument out of range for %s\n", name); \ + tfree(clean); \ + return (NULL); } #define cdiv(r1, i1, r2, i2, r3, i3) \ { \ diff --git a/src/maths/cmaths/cmath3.c b/src/maths/cmaths/cmath3.c index 41e763479..4a45530be 100644 --- a/src/maths/cmaths/cmath3.c +++ b/src/maths/cmaths/cmath3.c @@ -41,7 +41,7 @@ cx_divide(void *data1, void *data2, short int datatype1, short int datatype2, in if ((datatype1 == VF_REAL) && (datatype2 == VF_REAL)) { d = alloc_d(length); for (i = 0; i < length; i++) { - rcheck(dd2[i] != 0, "divide"); + rcheckn(dd2[i] != 0, "divide", d); d[i] = dd1[i] / dd2[i]; } return ((void *) d); @@ -60,7 +60,7 @@ cx_divide(void *data1, void *data2, short int datatype1, short int datatype2, in } else { c2 = cc2[i]; } - rcheck((realpart(c2) != 0) || (imagpart(c2) != 0), "divide"); + rcheckn((realpart(c2) != 0) || (imagpart(c2) != 0), "divide", c); #define xx5 realpart(c1) #define xx6 imagpart(c1) cdiv(xx5, xx6, realpart(c2), imagpart(c2), realpart(c[i]), imagpart(c[i]));