Changeset: 083a06f474a0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/083a06f474a0
Modified Files:
        clients/Tests/exports.stable.out
        clients/mapilib/mapi.c
        clients/mapilib/mapi_intern.h
        common/stream/rw.c
        common/stream/stream.h
Branch: monetdburl
Log Message:

Get rid of mnstr_vprintf


diffs (171 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1687,7 +1687,6 @@ ssize_t mnstr_readline(stream *restrict 
 void mnstr_set_bigendian(stream *s, bool bigendian);
 void mnstr_settimeout(stream *s, unsigned int ms, bool (*func)(void *), void 
*data);
 const char *mnstr_version(void);
-int mnstr_vprintf(stream *restrict s, _In_z_ _Printf_format_string_ const char 
*restrict format, va_list ap) __attribute__((__format__(__printf__, 2, 0)));
 ssize_t mnstr_write(stream *restrict s, const void *restrict buf, size_t 
elmsize, size_t cnt);
 int mnstr_writeBte(stream *s, int8_t val);
 int mnstr_writeBteArray(stream *restrict s, const int8_t *restrict val, size_t 
cnt);
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -693,6 +693,7 @@
 #include "mcrypt.h"
 #include "matomic.h"
 #include "mstring.h"
+#include "mutils.h"
 
 #include "mapi_intern.h"
 
@@ -1219,17 +1220,45 @@ mapi_log_header(Mapi mid, const char *fi
 void
 mapi_impl_log_record(Mapi mid, const char *filename, long line, const char 
*mark, const char *fmt, ...)
 {
+       va_list ap;
+
        if (mid->tracelog == NULL)
                return;
 
+       size_t needed = 128;
+       size_t to_print;
+       while (1) {
+               if (mid->tracebuffersize < needed) {
+                       free(mid->tracebuffer);
+                       mid->tracebuffer = malloc(needed);
+                       if (mid->tracebuffer) {
+                               mid->tracebuffersize = needed;
+                       } else {
+                               mid->tracebuffersize = 0;
+                               to_print = 0;
+                               break;
+                       }
+               }
+               va_start(ap, fmt);
+               int n = vsnprintf(mid->tracebuffer, mid->tracebuffersize, fmt, 
ap);
+               va_end(ap);
+               if (n < 0) {
+                       to_print = 0;
+                       break;
+               }
+               if ((size_t)n < mid->tracebuffersize) {
+                       to_print = n;
+                       break;
+               }
+               // need to reallocate
+               needed = n + 1;
+       }
+
        mapi_log_header(mid, filename, line, mark);
-
-       va_list ap;
-       va_start(ap, fmt);
-       mnstr_vprintf(mid->tracelog, fmt, ap);
-       va_end(ap);
-       mnstr_writeChr(mid->tracelog, '\n');
-
+       if (to_print > 0) {
+               mnstr_write(mid->tracelog, mid->tracebuffer, to_print, 1);
+               mnstr_writeChr(mid->tracelog, '\n');
+       }
        mnstr_flush(mid->tracelog, MNSTR_FLUSH_DATA);
 }
 
@@ -1920,16 +1949,14 @@ mapi_destroy(Mapi mid)
                (void) mapi_disconnect(mid);
        if (mid->tracelog)
                close_stream(mid->tracelog);
-       if (mid->blk.buf)
-               free(mid->blk.buf);
+
+       free(mid->blk.buf);
+       free(mid->motd);
+       free(mid->server);
+       free(mid->uri);
+       free(mid->tracebuffer);
        if (mid->errorstr && mid->errorstr != mapi_nomem)
                free(mid->errorstr);
-       if (mid->motd)
-               free(mid->motd);
-       if (mid->server)
-               free(mid->server);
-       if (mid->uri)
-               free(mid->uri);
 
        msettings_destroy(mid->settings);
 
diff --git a/clients/mapilib/mapi_intern.h b/clients/mapilib/mapi_intern.h
--- a/clients/mapilib/mapi_intern.h
+++ b/clients/mapilib/mapi_intern.h
@@ -246,6 +246,9 @@ struct MapiStruct {
        char *redirects[MAXREDIR];      /* NULL-terminated list of redirects */
 
        stream *tracelog;       /* keep a log for inspection */
+       char *tracebuffer;      /* used for formatting to tracelog */
+       size_t tracebuffersize; /* allocated size of tracebuffer */
+
        stream *from, *to;
        uint32_t index;         /* to mark the log records */
        void *filecontentprivate;
diff --git a/common/stream/rw.c b/common/stream/rw.c
--- a/common/stream/rw.c
+++ b/common/stream/rw.c
@@ -364,8 +364,9 @@ mnstr_writeHgeArray(stream *restrict s, 
 #endif
 
 int
-mnstr_vprintf(stream *restrict s, const char *restrict format, va_list ap)
+mnstr_printf(stream *restrict s, const char *restrict format, ...)
 {
+       va_list ap;
        char buf[512], *bf = buf;
        int i = 0;
        size_t bfsz = sizeof(buf);
@@ -373,7 +374,9 @@ mnstr_vprintf(stream *restrict s, const 
        if (s == NULL || s->errkind != MNSTR_NO__ERROR)
                return -1;
 
+       va_start(ap, format);
        i = vsnprintf(bf, bfsz, format, ap);
+       va_end(ap);
        while (i < 0 || (size_t) i >= bfsz) {
                if (i >= 0)     /* glibc 2.1 */
                        bfsz = (size_t) i + 1;  /* precisely what is needed */
@@ -386,21 +389,12 @@ mnstr_vprintf(stream *restrict s, const 
                        mnstr_set_error(s, MNSTR_WRITE_ERROR, "malloc failed");
                        return -1;
                }
+               va_start(ap, format);
                i = vsnprintf(bf, bfsz, format, ap);
+               va_end(ap);
        }
        s->write(s, (void *) bf, (size_t) i, (size_t) 1);
        if (bf != buf)
                free(bf);
        return s->errkind == MNSTR_NO__ERROR ? i : -1;
 }
-
-int
-mnstr_printf(stream *restrict s, const char *restrict format, ...)
-{
-       int ret;
-       va_list ap;
-       va_start(ap, format);
-       ret = mnstr_vprintf(s, format, ap);
-       va_end(ap);
-       return ret;
-}
diff --git a/common/stream/stream.h b/common/stream/stream.h
--- a/common/stream/stream.h
+++ b/common/stream/stream.h
@@ -137,8 +137,6 @@ stream_export int mnstr_writeLngArray(st
 stream_export int mnstr_readHgeArray(stream *restrict s, hge *restrict val, 
size_t cnt); // unused
 stream_export int mnstr_writeHgeArray(stream *restrict s, const hge *restrict 
val, size_t cnt); // unused
 #endif
-stream_export int mnstr_vprintf(stream *restrict s, _In_z_ 
_Printf_format_string_ const char *restrict format, va_list ap)
-       __attribute__(( __format__(__printf__, 2, 0)));
 stream_export int mnstr_printf(stream *restrict s, _In_z_ 
_Printf_format_string_ const char *restrict format, ...) // USED all over
        __attribute__((__format__(__printf__, 2, 3)));
 stream_export ssize_t mnstr_read(stream *restrict s, void *restrict buf, 
size_t elmsize, size_t cnt); // USED all over
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to