X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Falgebra.c;h=a8070fcbe8c006bfb8317c099d98ffd5188b3dec;hb=7a8c1e45c8d53a3b84a712c09c1fbdf9eaaa3e5a;hp=a1bcda571a7b083bcaa875a8ddc2508298f7f7ec;hpb=7bec4e0be8e5e095694080dd2bb81bd894acf5ef;p=monky diff --git a/src/algebra.c b/src/algebra.c index a1bcda5..a8070fc 100644 --- a/src/algebra.c +++ b/src/algebra.c @@ -195,6 +195,8 @@ int compare(const char *expr) char *expr_dup; int idx, mtype; enum arg_type type1, type2; + long lng_a, lng_b; + double dbl_a, dbl_b; idx = find_match_op(expr); mtype = get_match_type(expr); @@ -213,6 +215,7 @@ int compare(const char *expr) type2 = get_arg_type(expr_dup + idx + 1); if (type1 == ARG_BAD || type2 == ARG_BAD) { NORM_ERR("Bad arguments: '%s' and '%s'", expr_dup, (expr_dup + idx + 1)); + free(expr_dup); return -2; } if (type1 == ARG_LONG && type2 == ARG_DOUBLE) @@ -222,6 +225,7 @@ int compare(const char *expr) if (type1 != type2) { NORM_ERR("trying to compare args '%s' and '%s' of different type", expr_dup, (expr_dup + idx + 1)); + free(expr_dup); return -2; } switch (type1) { @@ -233,16 +237,22 @@ int compare(const char *expr) idx = scompare(a, mtype, b); free(a); free(b); + free(expr_dup); return idx; } case ARG_LONG: - return lcompare(arg_to_long(expr_dup), mtype, - arg_to_long(expr_dup + idx + 1)); + lng_a = arg_to_long(expr_dup); + lng_b = arg_to_long(expr_dup + idx + 1); + free(expr_dup); + return lcompare(lng_a, mtype, lng_b); case ARG_DOUBLE: - return dcompare(arg_to_double(expr_dup), mtype, - arg_to_double(expr_dup + idx + 1)); + dbl_a = arg_to_double(expr_dup); + dbl_b = arg_to_double(expr_dup + idx + 1); + free(expr_dup); + return lcompare(dbl_a, mtype, dbl_b); case ARG_BAD: /* make_gcc_happy() */; } /* not reached */ + free(expr_dup); return -2; }