Changeset: 9366649b646f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9366649b646f
Modified Files:
        monetdb5/modules/kernel/batstr.c
Branch: txtsim
Log Message:

Improve bailing code. Missing iconv_close if success.


diffs (103 lines):

diff --git a/monetdb5/modules/kernel/batstr.c b/monetdb5/modules/kernel/batstr.c
--- a/monetdb5/modules/kernel/batstr.c
+++ b/monetdb5/modules/kernel/batstr.c
@@ -4917,11 +4917,16 @@ BATSTRasciify(bat *ret, bat *bid)
        BATiter bi;
        BUN start, end;
        size_t prev_out_len = 0, in_len = 0, out_len = 0;
+       str s = NULL, out = NULL, in = NULL;
+       int i = -1;
+       str     error[3] = { GDK_EXCEPTION,
+                                        MAL_MALLOC_FAIL,
+                                        "ICONV: string conversion failed" };
        iconv_t cd;
        const str f = "UTF8", t = "ASCII//TRANSLIT";
        /* man iconv; /TRANSLIT */
        if ((cd = iconv_open(t, f)) == (iconv_t)(-1))
-               throw(MAL, "str.asciify", "ICONV: cannot convert from (%s) to 
(%s).", f, t);
+               throw(MAL, "batstr.asciify", "ICONV: cannot convert from (%s) 
to (%s).", f, t);
        if ((b = BATdescriptor(*bid)) == NULL)
                throw(MAL, "batstr.asciify", RUNTIME_OBJECT_MISSING);
        if ((bn = COLnew(b->hseqbase, TYPE_str, BATcount(b), TRANSIENT)) == 
NULL) {
@@ -4930,57 +4935,57 @@ BATSTRasciify(bat *ret, bat *bid)
        }
        bi = bat_iterator(b);
        for (start = 0, end = BATcount(b); start < end; start++) {
-               str r = NULL, out = NULL, in = (str) BUNtail(bi, start);
+               in = (str) BUNtail(bi, start);
                if (strNil(in)) {
-                       if (BUNappend(bn, str_nil, false) != GDK_SUCCEED)
-                               goto bail_append_fail;
+                       if (BUNappend(bn, str_nil, false) != GDK_SUCCEED) {
+                               i = 2;
+                               goto bail;
+                       }
                        bn->tnonil = 0;
                        bn->tnil = 1;
                        continue;
                }
                in_len = strlen(in), out_len = in_len + 1;
                if (out == NULL) {
-                       if ((out = GDKmalloc(out_len)) == NULL)
-                               goto bail_alloc_fail;
+                       if ((out = GDKmalloc(out_len)) == NULL) {
+                               i = 1;
+                               goto bail;
+                       }
                        prev_out_len = out_len;
                }
                else if (out_len > prev_out_len) {
-                       if ((out = GDKrealloc(r, out_len)) == NULL)
-                               goto bail_alloc_fail;
+                       if ((out = GDKrealloc(s, out_len)) == NULL) {
+                               i = 1;
+                               goto bail;
+                       }
                        prev_out_len = out_len;
                }
-               r = out;
+               s = out;
                if (iconv(cd, &in, &in_len, &out, &out_len) == (size_t) - 1) {
                        GDKfree(out);
-                       r = NULL;
-                       iconv_close(cd);
-                       bat_iterator_end(&bi);
-                       BBPunfix(b->batCacheid);
-                       BBPunfix(bn->batCacheid);
-                       throw(MAL, "str.asciify", "ICONV: string conversion 
failed from (%s) to (%s)", f, t);
+                       s = NULL;
+                       i = 2;
+                       goto bail;
                }
                *out = '\0';
-               if (BUNappend(bn, r, false) != GDK_SUCCEED)
-                       goto bail_append_fail;
+               if (BUNappend(bn, s, false) != GDK_SUCCEED) {
+                       i = 0;
+                       goto bail;
+               }
        }
        bat_iterator_end(&bi);
+       iconv_close(cd);
        BATsetcount(bn, BATcount(b));
        BBPunfix(b->batCacheid);
        *ret = bn->batCacheid;
        BBPkeepref(bn);
        return MAL_SUCCEED;
- bail_append_fail:
+ bail:
        iconv_close(cd);
        bat_iterator_end(&bi);
        BBPunfix(b->batCacheid);
        BBPunfix(bn->batCacheid);
-       throw(MAL, "batstr.asciify", GDK_EXCEPTION);
- bail_alloc_fail:
-       iconv_close(cd);
-       bat_iterator_end(&bi);
-       BBPunfix(b->batCacheid);
-       BBPunfix(bn->batCacheid);
-       throw(MAL, "batstr.asciify", MAL_MALLOC_FAIL);
+       throw(MAL, "batstr.asciify", "%s", error[i]);
 #else
        throw(MAL, "str.asciify", "ICONV library not available.");
 #endif
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to